2026/6/20 8:29:56
网站建设
项目流程
网站备案号含义,网站的登录注册怎么做,代运营合作协议,wordpress 目录布局什么是词向量
在自然语言处理#xff08;Natural Language Processing#xff0c;NLP#xff09;任务中#xff0c;文本是最基础也是最核心的数据形式。然而#xff0c;计算机并不能像人类一样直接理解文字的含义#xff0c;它只能对数字进行计算和建模。因此#xff0c…什么是词向量在自然语言处理Natural Language ProcessingNLP任务中文本是最基础也是最核心的数据形式。然而计算机并不能像人类一样直接理解文字的含义它只能对数字进行计算和建模。因此如何将文本信息转化为数值形式成为机器学习处理文本数据的首要问题。词向量Word Embedding正是在这一背景下提出的一种重要表示方法主流词向量模型一、词袋模型词袋模型Bag of Words是最早也是最基础的文本向量化方法之一。该方法将文本看作词语的集合仅统计每个词在文档中出现的次数而不考虑词语的顺序和语义关系。在词袋模型中每个文档可以表示为一个高维向量向量的每一维对应词表中的一个词其取值表示该词在文档中的出现频率。词袋模型实现简单、计算效率高但其缺点也较为明显一方面向量维度较高且稀疏另一方面无法刻画词语之间的语义相似性因此在复杂语义任务中的表现有限。Python 示例代码fromsklearn.feature_extraction.textimportCountVectorizer texts[这家餐厅的菜很好吃,服务态度非常好,这家店的菜太难吃了]vectorizerCountVectorizer()Xvectorizer.fit_transform(texts)print(词表,vectorizer.get_feature_names_out())print(向量表示\n,X.toarray())二、TF-IDF 模型TF-IDFTerm Frequency–Inverse Document Frequency是一种在词袋模型基础上引入权重机制的文本表示方法。其核心思想是一个词在当前文档中出现得越频繁同时在整个语料库中出现得越少则该词对文档的区分能力越强。与传统词频统计相比TF-IDF 能有效降低“的、了、是”等高频但区分度较低词语的权重从而突出文本中的关键词信息。因此TF-IDF 被广泛应用于文本分类、信息检索和情感分析等任务中。Python 示例代码fromsklearn.feature_extraction.textimportTfidfVectorizer texts[这家餐厅的菜很好吃,服务态度非常好,这家店的菜太难吃了]tfidfTfidfVectorizer()Xtfidf.fit_transform(texts)print(词表,tfidf.get_feature_names_out())print(TF-IDF 向量\n,X.toarray())TF-IDF 在保证模型简单性的同时显著提升了文本特征的区分能力是传统机器学习情感分析中最常用的向量化方法。三、Word2VecWord2Vec 是一种基于神经网络的词向量模型其核心思想是通过上下文信息学习词语的语义表示。与传统基于词频的表示方法不同Word2Vec 能够将词语映射为低维、稠密的向量并使语义相近的词在向量空间中距离更近。Word2Vec 主要包含两种训练模型CBOW通过上下文预测中心词和 Skip-gram通过中心词预测上下文。该模型在捕捉词语语义相似性方面表现突出是现代自然语言处理的重要基础方法之一。Python 示例代码gensimfromgensim.modelsimportWord2Vec sentences[[这家,餐厅,的,菜,很好吃],[服务,态度,非常,好],[这家,店,的,菜,太,难吃,了]]modelWord2Vec(sentences,vector_size100,window5,min_count1,workers4)查看某个词的词向量print(model.wv[好])计算相似词print(model.wv.most_similar(好))四、GloVeGloVeGlobal Vectors for Word Representation是一种结合全局词频统计信息的词向量模型。与 Word2Vec 侧重局部上下文不同GloVe 利用整个语料库中词与词的共现关系进行建模从而学习词语的向量表示。在实际应用中GloVe 常以预训练词向量的形式使用能够在多种自然语言处理任务中取得稳定效果。词向量转化的小例子下面通过一个简单示例演示如何使用 CountVectorizer 将文本转化为词袋向量表示。fromsklearn.feature_extraction.textimportCountVectorizer texts[dog cat fish,dog cat cat,fish bird,bird]cont[]#实例化一个模型cvCountVectorizer(max_features6,ngram_range(1,3))#,统计每篇文章中每个词出现的频率次数#训练此模型cv_fitcv.fit_transform(texts)#每个词在这篇文章中出现的次数print(cv_fit)# 打印出模型的全部词库print(cv.get_feature_names())#打印出每个语句的词向量print(cv_fit.toarray())# #打印出所有数据求和结果# print(cv_fit.toarray().sum(axis0))#输出结果示例数据说明texts[dog cat fish,dog cat cat,fish bird,bird]该示例中包含 4 条英文文本每条文本可以看作一条简单的“评论”或“文档”。这些文本由少量词语组成适合用于演示词袋模型的基本原理。CountVectorizer 的作用cvCountVectorizer(max_features6,ngram_range(1,3))CountVectorizer 是 scikit-learn 中用于构建**词袋模型Bag of Words**的工具其核心功能是建立词表Vocabulary统计每个词或词组在文档中出现的次数将文本转换为数值向量参数说明max_features6表示只保留词频最高的前 6 个特征词或词组用于控制向量维度防止特征过多。ngram_range(1, 3)表示同时考虑1-gram单词如 dog2-gram连续两个词如 dog cat3-gram连续三个词如 dog cat fish这使得模型不仅能捕捉单个词还能捕捉局部的词序信息。模型训练与文本转换cv_fitcv.fit_transform(texts)该语句完成了两个步骤fit从所有文本中学习词表统计词频并筛选特征transform将每条文本转换为词频向量返回的 cv_fit 是一个稀疏矩阵用于高效存储高维文本特征。查看稀疏矩阵结果print(cv_fit)输出结果为稀疏矩阵格式只显示非零元素的位置和值表示行索引文本编号列索引词表中特征的索引值该特征在文本中出现的次数这种表示方式可以节省大量内存适合大规模文本数据。查看模型词表print(cv.get_feature_names())该语句用于输出模型最终保留的所有特征即词袋模型的词表。由于设置了 ngram_range(1,3)词表中不仅包含单个词还可能包含多个连续词组成的短语。例如单词dog、cat二元词组dog cat三元词组dog cat fish查看每条文本的词向量表示print(cv_fit.toarray())该语句将稀疏矩阵转换为普通的二维数组方便观察。每一行表示一条文本每一列对应词表中的一个特征数值表示该特征在对应文本中出现的次数例如如果某一列对应特征 cat那么数值为 2 表示该文本中 cat 出现了两次。项目案例为了训练一个能够自动判断评论情感倾向好评或差评的模型本文选取苏宁易购商品评论数据作为实验数据来源。相关评论数据通过网络爬虫方式获取并根据情感极性分为优质评价好评和差评两类为后续的文本向量化和模型训练提供数据基础。1. 数据读取与初步整理实验中分别使用两个文本文件存储不同情感类别的评论数据其中优质评价.txt存储正向情感评论好评差评.txt存储负向情感评论差评使用 Pandas 对文本数据进行读取代码如下importpandasaspd cp_contentpd.read_table(r.\差评.txt,encodinggbk)yzpj_contentpd.read_table(r.\优质评价.txt,encodinggbk)中文评论的分词处理jieba在中文文本处理中词语之间不存在天然的空格分隔因此在进行词向量构建之前必须先对评论文本进行分词操作。本文采用 jieba 分词库对苏宁易购评论数据进行分词处理。jieba 提供了两种常用分词接口jieba.cut()返回生成器适合大规模数据jieba.lcut()直接返回列表使用更加方便本实验中采用 jieba.lcut() 方法。差评文本分词importjiebaimportpandasaspd cp_segments[]提取差评文本内容contentscp_content[content].values.tolist()对每条评论进行分词fortextincontents:wordsjieba.lcut(text)iflen(words)1:# 过滤分词结果过短的评论cp_segments.append(words)将分词结果保存为 DataFramecp_fc_resultspd.DataFrame({content:cp_segments})cp_fc_results.to_excel(cp_fc_results.xlsx,indexFalse)好评文本分词yzpj_segments[]提取好评文本内容contentsyzpj_content[content].values.tolist()fortextincontents:wordsjieba.lcut(text)iflen(words)1:yzpj_segments.append(words)保存分词结果yzpj_fc_resultspd.DataFrame({content:yzpj_segments})yzpj_fc_results.to_excel(yzpj_fc_results.xlsx,indexFalse)至此好评与差评的分词结果已分别存储为后续文本清洗和特征提取做好准备。停用词去除分词完成后文本中仍然包含大量无实际语义价值的词语如“的”“了”“是”等。这类词被称为停用词若不加处理会对模型训练产生干扰因此需要将其移除。导入停用词表stopwords_dfpd.read_csv(r./StopwordsCN.txt,encodingutf8,enginepython)stopwordsstopwords_df[stopword].values.tolist()定义去停用词函数defremove_stopwords(texts,stopwords):cleaned_texts[]fortextintexts:clean_words[wordforwordintextifwordnotinstopwords]cleaned_texts.append(clean_words)returncleaned_texts差评去停用词cp_contentscp_fc_results[content].values.tolist()cp_cleanremove_stopwords(cp_contents,stopwords)好评去停用词yzpj_contentsyzpj_fc_results[content].values.tolist()yzpj_cleanremove_stopwords(yzpj_contents,stopwords)基于朴素贝叶斯的情感分类模型构建训练数据集为实现监督学习需要为评论数据添加情感标签差评1好评0cp_trainpd.DataFrame({segments_clean:cp_clean,label:1})yzpj_trainpd.DataFrame({segments_clean:yzpj_clean,label:0})pj_trainpd.concat([cp_train,yzpj_train],axis0)pj_train.to_excel(pj_train.xlsx,indexFalse)划分训练集与测试集fromsklearn.model_selectionimporttrain_test_split x_train,x_test,y_train,y_testtrain_test_split(pj_train[segments_clean].values,pj_train[label].values,random_state0)文本向量化CountVectorizer由于 CountVectorizer 接受的是字符串形式输入因此需要先将分词列表重新拼接成字符串。train_texts[ .join(words)forwordsinx_train]fromsklearn.feature_extraction.textimportCountVectorizer vectorizerCountVectorizer(max_features4000,lowercaseFalse,ngram_range(1,3))vectorizer.fit(train_texts)训练朴素贝叶斯模型fromsklearn.naive_bayesimportMultinomialNBfromsklearnimportmetrics classifierMultinomialNB(alpha0.1)classifier.fit(vectorizer.transform(train_texts),y_train)训练集评估train_predclassifier.predict(vectorizer.transform(train_texts))print(metrics.classification_report(y_train,train_pred))测试集评估test_texts[ .join(words)forwordsinx_test]test_predclassifier.predict(vectorizer.transform(test_texts))print(metrics.classification_report(y_test,test_pred))模型交互测试训练完成后可以通过命令行输入文本实时测试模型的情感预测效果。whileTrue:textinput(请输入一段评价输入 exit 退出)iftextexit:breakwordsjieba.lcut(text)words_clean[wforwinwordsifwnotinstopwords]text_vecvectorizer.transform([ .join(words_clean)])resultclassifier.predict(text_vec)ifresult[0]1:print(预测结果差评)else:print(预测结果优质评价)