核心内容摘要
沉浸式治愈,不止泡泡浴:探索《泡泡浴de家里》第一季的温暖治愈密码
目录简介
词向量转换相关概念
算法应用
三、
案例分析
数据集
整体功能概述
代码分步详解简介jieba库、朴素贝叶斯算法和TF-IDF值是自然语言处理NLP中常用的工具和技术各自在文本处理的不同阶段发挥作用。
在自然语言处理的世界里如何让计算机 “读懂” 人类语言一直是核心难题而词向量转换正是破解这一难题的关键钥匙。
本次机器学习专题我们就来深入探讨这一基础又核心的技术。
词向量转换的本质是将文本中离散的词语转化为连续的数值向量。
这一步看似简单却实现了从 “机器无法理解的文字” 到 “可计算的数字” 的跨越为后续的文本分类、情感分析、机器翻译等任务铺平了道路。
词向量转换相关概念
为什么需要词向量转换人类语言丰富多样单词具有语义、语法和语境等多重信息。
但计算机擅长处理数值数据原始文本无法直接被计算机理解和分析。
词向量转换通过将单词转换为数值向量把语言信息编码成计算机能处理的形式。
这样计算机可以利用这些向量进行计算从而挖掘文本中的有用信息实现对文本的理解和处理。
词向量转换的分类特征提取库中导入向量转化模块自然语言转换成数据的形式才能保证模型进行训练。
基于统计的方法 统计每个单词在这句话中出现的次数
基于神经网络模型训练的方法今天讲述的是基于统计的方法进行词向量转换第二种要利用深度学习的知识后面再说。
算法应用我们以一个小例子来说明词向量转换的代码过程
首先导入了CountVectorizer类这是用于将文本转换为词频向量的工具from sklearn.feature_extraction.text import CountVectorizerCountVectorizer( inputcontent, # 输入类型content直接文本、filename文件路径、file文件对象 encodingutf-8, # 文本编码格式 decode_errorstrict, # 解码错误处理strict报错、ignore忽略、replace替换 strip_accentsNone, # 去除重音符号None不处理、ascii仅ASCII字符、unicode所有字符 lowercaseTrue, # 是否将文本转为小写默认True preprocessorNone, # 自定义预处理函数输入文本字符串返回处理后的字符串 tokenizerNone, # 自定义分词函数输入文本字符串返回分词列表 stop_wordsNone, # 停用词None不处理、english内置英文停用词、自定义列表 token_patternr(?u)\b\w\w\b, # 分词正则表达式默认匹配2个及以上字符的单词 ngram_range(1,
, # 提取n元词范围如(1,
表示同时提取1元词和2元词 analyzerword, # 分析单位word按词、char按字符、char_wb按字符不跨越词边界 max_df
0, # 最大文档频率过滤高频词0~1比例或整数文档数 min_df1, # 最小文档频率过滤低频词0~1比例或整数文档数 max_featuresNone, # 保留的最大特征数按词频排序取前N个 vocabularyNone, # 自定义词汇表字典或列表指定要提取的词 binaryFalse, # 是否将词频转为二进制1表示出现0表示未出现默认False dtypenp.int64 # 输出矩阵的数据类型 )
定义了一个文本列表texts包含 4 个字符串元素texts [apple banana orange,apple banana banana,orange pear,pear]
创建了CountVectorizer实例并设置了两个参数ax_features6只保留出现频率最高的 6 个特征词语或词组ngram_range(1,
考虑 1 元词单个词、2 元词两个词的组合和 3 元词三个词的组合
cv.fit_transform(texts)对文本进行拟合和转换fit分析文本构建词汇表transform将文本转换为词频矩阵
print(cv_fit)输出的是一个稀疏矩阵表示格式为(文档索引, 特征索引) 词频(0,
1 (0,
1 (0,
1 (0,
1 (1,
1 (1,
2 (1,
1 (1,
1 (2,
1 (2,
1 (3,
1表示第 0 个文档中索引 0的特征出现 1 次索引 3的特征出现 1 次等
cv.get_feature_names_out()返回所有提取的特征名称词汇表根据示例会输出类似[apple apple banana apple banana banana banana orange pear]
cv_fit.toarray()将稀疏矩阵转换为稠密矩阵二维数组每行代表一个文档每列代表一个特征值为该特征在对应文档中的出现次数[[1 1 0 1 1 0] [1 1 1 2 0 0] [0 0 0 0 1 1] [0 0 0 0 0 1]]文本内容appleapple bananaapple banana bananabananaorangepearapple banana orange110110apple banana banana111200orange pear000011pear000001
三、
案例分析这里有从苏宁上爬取的关于手机的评论一个好评与一个差评文件
数据集差评好评
整体功能概述这段代码主要实现了中文文本情感分类的前期数据处理与特征工程流程包括读取好评、差评文本数据用jieba进行中文分词去除停用词高频无意义词汇如 “的”“了” 等 构建带标签的训练数据集拆分训练集、测试集用CountVectorizer将分词后的文本转换为词频特征矩阵为后续机器学习模型如分类器做准备。
代码分步详解
库与模块导入from sklearn.feature_extraction.text import CountVectorizer import pandas as pd import jiebaCountVectorizer用于将文本转换为词频矩阵scikit-learn 工具pandas别名pd处理表格型数据读取文件、DataFrame 操作jieba中文分词库把连续的中文文本拆分为词语列表。
读取原始数据hp_content pd.read_table(好评.txt, encodinggbk) cp_content pd.read_table(差评.txt, encodinggbk)用pd.read_table读取本地文本文件encodinggbk适配 GBK 编码需确保文件实际编码一致否则会报错 hp_content、cp_content是DataFrame类型存储 “好评”“差评” 文本数据默认有一列content存文本内容。
中文分词差评 好评差评分词cp_segements [] contents cp_content.content.values.tolist() for content in contents: results jieba.lcut(content) # 精确模式分词返回词语列表 if len(results) 1: # 过滤分词后长度1的避免空内容 cp_segements.append(results) cp_fc_results pd.DataFrame({content: cp_segements}) cp_fc_results.to_excel(cp_fc_results.xlsx, indexFalse)先提取cp_content中content列的文本转成列表遍历jieba.lcut(content)对单条文本分词结果是list如 “这个产品好” →[这个, 产品, 好]用DataFrame存储分词结果再导出为 ExcelindexFalse不存行索引 。
好评分词逻辑与差评完全一致 hp_segements [] contents hp_content.content.values.tolist() for content in contents: results jieba.lcut(content) if len(results) 1: hp_segements.append(results) hp_fc_results pd.DataFrame({content: hp_segements}) hp_fc_results.to_excel(hp_fc_results.xlsx, indexFalse)
读取停用词stopwords pd.read_csv( StopwordsCN.txt, encodingutf-8, enginepython, headerNone, names[word], sep\t )读取停用词表通常是纯文本每行一个停用词 headerNone表示文件无表头names[word]手动设列名sep\t用制表符分隔按实际文件格式调整 最终stopwords是DataFrame一列word存停用词。
定义并调用 “去除停用词” 函数def drop_stopwords(contents, stopwords): segments_clean [] for content in contents: # 遍历每条分词后的文本列表套列表结构 line_clean [] for word in content: # 遍历单条文本的词语 if word in stopwords: # 若词语在停用词表中跳过 continue line_clean.append(word) # 否则保留词语 segments_clean.append(line_clean) # 收集单条文本清洗后的词语列表 return segments_clean输入contents是分词后的文本列表如[[这个,产品,好], ...]stopwords是停用词列表输出清洗后的词语列表过滤掉停用词 。
调用函数处理差评、好评数据# 处理差评 contents cp_fc_results.content.values.tolist() # 从 DataFrame 提取分词结果列表格式 stopwords stopwords.word.values.tolist() # 停用词 DataFrame → 列表 cp_fc_contents_clean_s drop_stopwords(contents, stopwords) # 处理好评逻辑同上 contents hp_fc_results.content.values.tolist() hp_fc_contents_clean_s drop_stopwords(contents, stopwords)
构建带标签的训练数据集cp_trian pd.DataFrame({segments_clean: cp_fc_contents_clean_s, label: 1}) # 差评标签设为 1 hp_train pd.DataFrame({segments_clean: hp_fc_contents_clean_s, label: 0}) # 好评标签设为 0 pj_train pd.concat([cp_trian, hp_train]) # 合并差评、好评数据 pj_train.to_excel(pj_train.xlsx, indexFalse) # 导出合并结果label是情感标签1代表 “差评”0代表 “好评”pd.concat按行合并两个DataFrame形成完整训练数据集
拆分训练集、测试集from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test train_test_split( pj_train[segments_clean].values, # 特征清洗后的分词列表 pj_train[label].values, # 标签情感类别0/1 random_state0 )train_test_split按默认比例一般 75% 训练、25% 测试 拆分数据x_train/x_test是特征数据分词列表 y_train/y_test是对应标签。
文本转词频特征为模型做准备words [] for line_index in range(len(x_train)): words.append( .join(x_train[line_index])) # 分词列表 → 用空格连接成字符串如 [这个,产品] → 这个 产品 print(words) from sklearn.feature_extraction.text import CountVectorizer vec CountVectorizer(max_features4000, ngram_range(1,
) # 初始化向量器 vec.fit(words) # 基于训练集构建词汇表 x_train_vec vec.transform(words) # 训练集文本 → 词频矩阵 print(a)构建可入模的文本格式CountVectorizer要求输入是 “用空格连接的字符串”所以用 .join(...)把分词列表转成字符串如[这个,产品]→这个 产品。
CountVectorizer配置与作用max_features4000只保留词频最高的 4000 个词控制特征数量避免维度爆炸 ngram_range(1,
提取 1 元词单个词、2 元词两个词组合如 “这个 产品” 、3 元词三个词组合 vec.fit(words)扫描words里的文本统计词频并构建词汇表后续用这个词汇表转换文本 vec.transform(words)将训练集文本转换为稀疏矩阵每行是一条文本每列是一个词值是词频 供机器学习模型如逻辑回归、SVM 使用。
模型训练与评估# 训练朴素贝叶斯模型 classifier MultinomialNB(alpha
0.