Python 搭建基础 NLP Pipeline:从数据清洗到文本分词

以下是完整的 NLP 基础处理流程,包含代码实现和关键步骤说明:


1. 环境准备
# 安装必要库
!pip install jieba nltk pandas numpy

import re
import jieba
import string
import pandas as pd
from nltk.corpus import stopwords
nltk.download('stopwords')  # 下载停用词库


2. 数据加载与清洗
def load_data(file_path):
    """加载原始文本数据"""
    with open(file_path, 'r', encoding='utf-8') as f:
        raw_text = f.read()
    return raw_text

def clean_text(text):
    """执行数据清洗"""
    # 移除特殊字符和数字
    text = re.sub(r'[^\w\s]', '', text)  
    text = re.sub(r'\d+', '', text)
    
    # 转换为小写
    text = text.lower()
    
    # 移除多余空格
    text = re.sub(r'\s+', ' ', text).strip()
    
    return text

# 示例使用
raw_data = load_data('sample.txt')
cleaned_data = clean_text(raw_data)
print("清洗后文本:", cleaned_data[:100] + "...")

清洗效果

原始: "2023年NLP报告: 深度学习模型(BERT)准确率达92.5%!"
清洗后: "年nlp报告 深度学习模型bert准确率达"


3. 文本分词处理
def chinese_tokenize(text):
    """中文分词处理"""
    seg_list = jieba.cut(text, cut_all=False)
    return list(seg_list)

def english_tokenize(text):
    """英文分词处理"""
    tokens = text.split()
    
    # 移除停用词
    stop_words = set(stopwords.words('english'))
    tokens = [word for word in tokens if word not in stop_words]
    
    # 移除标点
    tokens = [word.translate(str.maketrans('', '', string.punctuation)) for word in tokens]
    
    return tokens

# 自动检测语言类型
def tokenize(text):
    if any('\u4e00' <= char <= '\u9fff' for char in text):  # 检测中文字符
        return chinese_tokenize(text)
    else:
        return english_tokenize(text)

# 示例使用
tokens = tokenize(cleaned_data)
print("分词结果:", tokens[:10])

分词效果

中文输入: "自然语言处理是人工智能的重要分支"
输出: ['自然语言', '处理', '是', '人工智能', '的', '重要', '分支']

英文输入: "nlp pipelines include tokenization and cleaning"
输出: ['nlp', 'pipelines', 'include', 'tokenization', 'cleaning']


4. 完整Pipeline封装
class NLPipeline:
    def __init__(self, file_path):
        self.raw_text = load_data(file_path)
        self.clean_text = clean_text(self.raw_text)
        self.tokens = tokenize(self.clean_text)
    
    def get_results(self):
        return {
            "raw_text": self.raw_text[:200] + "...",
            "clean_text": self.clean_text[:200] + "...",
            "tokens": self.tokens[:20]
        }

# 使用示例
pipeline = NLPipeline('data.txt')
results = pipeline.get_results()

print("原始文本:", results["raw_text"])
print("清洗文本:", results["clean_text"])
print("分词结果:", results["tokens"])


5. 进阶扩展建议
  1. 词干提取:添加 nltk.stem.PorterStemmer()
  2. 词向量化:使用 sklearn.feature_extraction.text.CountVectorizer
  3. 实体识别:集成 spacy
  4. 情感分析:使用预训练模型如 TextBlob
# 词向量化示例
from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
X = vectorizer.fit_transform([" ".join(pipeline.tokens)])
print("词频矩阵:\n", X.toarray())


数学表达说明

在文本向量化中,词频矩阵可表示为: $$ \mathbf{X} = \begin{bmatrix} f_{11} & f_{12} & \cdots & f_{1n} \ \vdots & \vdots & \ddots & \vdots \ f_{m1} & f_{m2} & \cdots & f_{mn} \end{bmatrix} $$ 其中 $f_{ij}$ 表示第 $i$ 文档中第 $j$ 个词的出现频率。

通过此流程,您已构建完整的NLP基础处理流水线,可直接应用于文本分类、情感分析等下游任务。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐