机器学习处理文本数据
这段代码使用了 scikit-learn 库中的CountVectorizer
类,目的是将文本数据转换为数值特征(词袋模型),以便用于机器学习算法。让我逐步解释:
导入库:
from sklearn.feature_extraction.text import CountVectorizer
导入了 scikit-learn 的
CountVectorizer
类,它用于将文本转换为词频矩阵。定义文本数据:
text = ['aaa bbb ccc','aaa aaa ccc bbb','ccc bbb ccc','bbb bbb ccc aaa']
这是一个包含 4 个文本字符串的列表,每个字符串由空格分隔的词语组成。
初始化 CountVectorizer:
cv = CountVectorizer(max_features=6, ngram_range=(1,3))
max_features=6
:只保留出现频率最高的 6 个特征ngram_range=(1,3)
:不仅考虑单个词(1-gram),还考虑 2 个词的组合(2-gram)和 3 个词的组合(3-gram)
拟合和转换文本数据:
cv_fit = cv.fit_transform(text)
fit
:学习文本数据中的词汇表transform
:将文本转换为词频矩阵
输出结果:
print(cv_fit)
:输出稀疏矩阵表示,显示非零元素的位置和计数print(cv.get_feature_names_out())
:输出提取的特征名称(词汇)print(cv_fit.toarray())
:将稀疏矩阵转换为稠密数组显示
运行这段代码会得到:
- 特征名称(6 个最常见的 1-gram、2-gram 或 3-gram)
- 每个文本在这些特征上的词频计数
例如,特征可能包括'aaa'
、'bbb'
、'ccc'
等单个词,以及'aaa bbb'
、'bbb ccc'
等词组,具体取决于它们在文本中出现的频率。
这种文本向量化是自然语言处理中的基础步骤,将文本数据转换为机器学习算法可以理解的数值形式。
这段代码主要实现了中文文本数据的预处理流程,目的是将原始的好评 / 差评文本转换为可用于机器学习模型训练的特征数据,核心步骤包括数据读取、中文分词、停用词过滤、标签构建以及文本向量化。
逐部分解析:
1. 数据读取(读取好评 / 差评文本)
python
运行
import pandas as pd# 读取差评文本
cp_content = pd.read_csv("差评.txt", encoding='gbk')
# 读取好评文本(处理无表头、分隔符等问题)
hp_content = pd.read_csv('好评.txt',encoding='utf-8',header=None, # 说明文件无表头sep='\t', # 以制表符为分隔符engine='python',names=['content'] # 给列命名为'content'
)
- 作用:从本地文件读取 “差评” 和 “好评” 文本数据,用
pandas
转换为 DataFrame 格式,方便后续处理。 - 注意:两个文件编码不同(差评用
gbk
,好评用utf-8
),需对应正确编码避免读取乱码;好评文件无表头,用names
手动指定列名为content
。
2. 中文分词(用 jieba 对文本拆分)
python
运行
import jieba# 处理差评:分词
cp_seg = []
contents = cp_content.content.values.tolist() # 提取差评内容为列表
for content in contents:results = jieba.lcut(content) # 用jieba精确分词(返回词语列表)if len(results) > 1: # 过滤掉分词后长度≤1的内容(可能是无效文本)cp_seg.append(results)
# 保存分词结果到Excel
cp_fc_results = pd.DataFrame({'content': cp_seg})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)# 处理好评:同样的分词流程
hp_seg = []
contents = hp_content.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results) > 1:hp_seg.append(results)
hp_fc_results = pd.DataFrame({'content': hp_seg})
hp_fc_results.to_excel('hp_fc_results.xlsx', index=False)
- 作用:中文文本需要先拆分为词语(分词)才能进行后续处理,这里用
jieba.lcut
实现精确分词。 - 细节:过滤掉分词后长度≤1 的文本(可能是无意义的短句),并将分词结果保存为 Excel,方便中间检查。
3. 停用词过滤(去除无意义词汇)
python
运行
# 读取停用词表(如“的”“是”“在”等无实际意义的词)
stopwords = pd.read_csv("StopwordsCN.txt", encoding='utf-8', engine='python', index_col=False)# 定义过滤停用词的函数
def drop_stopwords(contents, stopwords):seg_clean = []for content in contents: # 遍历每条分词后的文本line_clean = []for word in content: # 遍历每个词语if word in stopwords: # 如果词语是停用词,则跳过continueline_clean.append(word) # 保留非停用词seg_clean.append(line_clean)return seg_clean# 对差评分词结果过滤停用词
contents = cp_fc_results.content.values.tolist()
stopwords_list = stopwords.stopword.values.tolist() # 提取停用词为列表
cp_fc_clean_s = drop_stopwords(contents, stopwords_list)# 对好评分词结果过滤停用词
contents = hp_fc_results.content.values.tolist()
hp_fc_clean_s = drop_stopwords(contents, stopwords_list)
- 作用:去除文本中无实际意义的 “停用词”(如虚词、标点等),减少噪声,保留关键信息。
- 注意:停用词表(StopwordsCN.txt)需提前准备,函数
drop_stopwords
会逐词检查并过滤。
4. 构建训练数据集(添加标签并合并)
python
运行
# 为差评和好评添加标签(注意:这里可能有笔误,通常差评/好评应设为不同标签)
cp_train = pd.DataFrame({'seg_clean': cp_fc_clean_s, 'label': 1}) # 差评标签设为1
hp_train = pd.DataFrame({'seg_clean': hp_fc_clean_s, 'label': 1}) # 好评标签也设为1(不合理)
# 合并差评和好评数据集
pj_train = pd.concat([cp_train, hp_train])
# 保存合并后的训练数据
pj_train.to_excel('pj_train.xlsx', index=False)
- 作用:为文本添加分类标签(用于后续机器学习分类),并合并为一个完整的训练集。
- 问题:这里可能存在逻辑错误 —— 通常 “差评” 和 “好评” 应作为两类标签(如差评 = 0,好评 = 1),但代码中都设为 1,后续模型无法区分,需要修正。
5. 划分训练集和测试集
python
运行
from sklearn.model_selection import train_test_split# 拆分数据:特征为分词后的文本(seg_clean),标签为label
x_train, x_test, y_train, y_test = train_test_split(pj_train['seg_clean'].values, # 特征(文本)pj_train['label'].values, # 标签random_state=100 # 随机种子,保证结果可复现
)
- 作用:将数据集分为训练集(用于模型训练)和测试集(用于评估模型),
random_state
固定随机拆分方式。
6. 文本向量化(将词语转换为数值特征)
python
运行
# 将训练集的分词列表转换为字符串(CountVectorizer需要输入字符串)
words = []
for line_index in range(len(x_train)):words.append(' '.join(x_train[line_index])) # 用空格连接词语,如["我", "喜欢"]→"我 喜欢"# 初始化CountVectorizer(词袋模型)
from sklearn.feature_extraction.text import CountVectorizer
VEC = CountVectorizer(max_features=4000, # 只保留出现频率最高的4000个特征lowercase=False, # 不转换为小写(中文无需小写处理)ngram_range=(1, 3) # 考虑1-gram(单个词)、2-gram(两个词组合)、3-gram(三个词组合)
)# 拟合向量器(学习词汇表)并转换训练集
VEC.fit(words)
x_train_vec = VEC.transform(words) # 得到词频矩阵(每行是一个文本的特征向量)
- 作用:将文本(字符串)转换为机器学习模型可识别的数值特征。
CountVectorizer
通过统计词语(或词组)的出现次数,生成 “词频矩阵”。 - 细节:
ngram_range=(1,3)
会保留词组信息(如 “服务 差”“性价比 高”),比仅用单个词更能捕捉语义;max_features=4000
限制特征数量,避免维度爆炸。
整体流程总结
这段代码完整实现了从 “原始文本” 到 “模型输入特征” 的预处理流程:
读取数据 → 中文分词 → 过滤停用词 → 构建带标签的数据集 → 拆分训练 / 测试集 → 文本向量化
主要用于后续的文本分类任务(如区分好评 / 差评),但需注意标签设置错误的问题(差评和好评标签应不同)。