前言
本文介绍自然语言处理(英语:Natural Language Processing,缩写作 NLP)中的文本分类应用,包括中英文分词方法、文本特征提取和假新闻分类任务。
一、中文分词方法
方法 | 原理 | 优缺点 |
---|---|---|
正向最大匹配(MM) | 从左向右取最长词匹配词典,匹配失败则减1字继续匹配 | 简单快速,但无法处理未登录词,依赖词典质量 |
逆向最大匹配(RMM) | 从右向左取最长词匹配词典 | 对偏正结构处理更好,但同样依赖词典 |
双向最大匹配(BMM) | 结合正向和逆向结果,选择切分次数少的作为最终结果 | 提高准确性,但计算复杂度较高 |
统计分词 | 基于语料库统计词共现概率,利用隐马尔可夫模型(HMM)或条件随机场(CRF) | 能处理未登录词,但需要大量标注数据,计算复杂度高 |
二、结巴分词工具
-
分词模式:
-
精确模式 :
jieba.cut(text)
,适合文本分析。 -
全模式 :
jieba.cut(text, cut_all=True)
,输出所有可能成词的组合。 -
搜索引擎模式 :
jieba.cut_for_search(text)
,对长词再次切分,提高召回率。
-
-
自定义词典:
jieba.add_word("机器学习") # 添加新词 jieba.load_userdict("user_dict.txt") # 加载自定义词典
三、英文文本分词
-
特点:天然以空格分隔,无需复杂分词算法。
-
处理标点:
import string text = "Hello, world! This is an example." words = text.translate(str.maketrans('', '', string.punctuation)).split() # 输出:['Hello', 'world', 'This', 'is', 'an', 'example']
四、文本特征提取方法
方法 | 原理 | 应用场景 | 工具 |
---|---|---|---|
词袋模型(BoW) | 统计词频生成向量,忽略词序和语法 | 简单文本分类,基线模型 | sklearn.feature_extraction.CountVectorizer |
TF-IDF | 词频(TF)×逆文档频率(IDF),突出重要词 | 信息检索,文本分类 | sklearn.feature_extraction.TfidfVectorizer |
Word2Vec | 将词映射为低维稠密向量,捕捉语义相似性 | 语义分析,深度学习模型输入 | gensim.models.Word2Vec |
-
TF-IDF 公式 :
\( \text{TF-IDF}(t,d) = \text{TF}(t,d) \times \log\left(\frac{N}{\text{DF}(t) + 1}\right) \)
-
\( \text{TF}(t,d) \):词 \( t \) 在文档 \( d \) 中的频率。
-
\( \text{DF}(t) \):包含词 \( t \) 的文档数。
-
\( N \):总文档数。
-
-
Word2Vec 训练示例:
from gensim.models import Word2Vec sentences = [["自然", "语言", "处理"], ["深度", "学习", "实战"]] model = Word2Vec(sentences, vector_size=100, window=5, min_count=1) print(model.wv["自然"]) # 输出词向量
五、假新闻分类实战步骤
1. 数据预处理
-
合并文本列:
df['title_zh'] = df['title1_zh'] + df['title2_zh']
-
加载停用词:
def load_stopwords(file_path): with open(file_path, 'r') as f: return [line.strip() for line in f] stopwords = load_stopwords('stopwords.txt')
2. 分词与清洗
-
结巴分词 + 去停用词:
import jieba corpus = [] for text in df['title_zh']: words = [word for word in jieba.cut(text) if word not in stopwords] corpus.append(words)
3. 特征提取(Word2Vec)
-
训练词向量:
model = Word2Vec(corpus, vector_size=100, window=5, min_count=1)
-
文本向量化(词向量求和):
import numpy as np def text_to_vec(words): vec = np.zeros(100) for word in words: if word in model.wv: vec += model.wv[word] return vec X = np.array([text_to_vec(words) for words in corpus])
4. 模型训练与评估
-
划分数据集:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, df['label'], test_size=0.2)
-
随机森林分类:
from sklearn.ensemble import RandomForestClassifier clf = RandomForestClassifier() clf.fit(X_train, y_train) print("Accuracy:", clf.score(X_test, y_test))
六、常见问题与优化方向
-
分词不准确:
-
添加专业词典(如
jieba.load_userdict()
)。 -
调整结巴分词的
HMM
参数(jieba.cut(use_hmm=True)
)。
-
-
特征提取效果差:
-
使用预训练词向量(如腾讯词向量、Google News 词向量)。
-
尝试其他文本表示方法(如 BERT 嵌入)。
-
-
模型准确率低:
-
增加数据量或数据增强。
-
使用更复杂的模型(如 LSTM、Transformer)。
-
七、参考工具与资源
-
分词工具:
-
预训练词向量:
-
深度学习框架: