从文本到向量:揭秘词向量转换的奥秘与实践
从文本到向量:揭秘词向量转换的奥秘与实践
在自然语言处理(NLP)的世界里,计算机处理的是数字和向量,而人类交流使用的是文本语言。如何让计算机理解文本语义并进行分析处理呢?词向量转换便是其中的关键一环。本文将结合实际代码案例,带大家深入了解词向量转换的原理、流程及应用。
一、为什么需要词向量转换?
文本数据对于人类来说是直观且富有意义的,但计算机并不能直接理解“苹果”“快乐”这些词语的含义。为了让计算机能够处理文本,我们需要将文本中的词语、句子转化为计算机能够理解的数值形式,即向量。通过词向量转换,每个词语都可以用一个多维向量来表示,向量中的数值反映了词语的语义信息,这样计算机就可以基于这些向量进行各种分析任务,如文本分类、情感分析、机器翻译等。
二、数据读取与预处理
在进行词向量转换之前,我们首先需要读取和预处理文本数据。在代码中,我们使用pandas
库读取了存储在本地的差评和优质评价文本文件。
import pandas as pd
cp_content = pd.read_table(r".\差评.txt",encoding='gbk')
yzpj_content = pd.read_table(r".\优质评价.txt",encoding='gbk')
这里使用read_table
函数将文本文件读取为DataFrame
格式,方便后续对数据进行处理。同时,根据文件的实际编码格式指定encoding
参数,确保数据能够正确读取。
三、使用jieba
分词
中文文本不同于英文,词语之间没有天然的分隔符,因此需要进行分词操作。jieba
是一个强大的中文分词工具,在代码中我们使用它对差评和优质评价进行分词处理。
import jieba
#对差评分词
cp_segments = []
contents = cp_content.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results) > 1:cp_segments.append(results)cp_fc_results = pd.DataFrame({'content':cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx',index=False)#对优质评价分词
yzpj_segments = []
contents = yzpj_content.content.values.tolist()
for content in contents:results = jieba.lcut(content)if len(results) > 1:yzpj_segments.append(results)yzpj_fc_results = pd.DataFrame({'content': yzpj_segments})
yzpj_fc_results.to_excel('yzpj_fc_results.xlsx',index=False)
通过jieba.lcut
方法,将每个文本内容切分成词语列表,然后将分词结果存储到新的DataFrame
中并保存为Excel文件。在这个过程中,我们还过滤掉了分词后结果长度小于等于1的情况,因为这类结果可能没有实际意义。
四、移除停用词
在文本中,存在一些如“的”“了”“是”等对语义表达贡献较小的词语,这些词语被称为停用词。为了减少数据噪声,提高后续分析的准确性,我们需要移除这些停用词。
#导入停用词库
stopwords = pd.read_csv(r"C:\CODE\机器学习\TF-IDF算法\红楼梦\StopwordsCN.txt",encoding='utf8',engine='python',index_col=False)
#定义除去停用词函数
def drop_stopwords(contents, stopwords):segments_clean = []for content in contents:line_clean = []for word in content:if word in stopwords:continueline_clean.append(word)segments_clean.append(line_clean)return segments_clean
#调用除去停用词函数
contents = cp_fc_results.content.values.tolist()
stopwords = stopwords.stopword.values.tolist()
cp_fc_contents_clean_s = drop_stopwords(contents, stopwords)contents = yzpj_fc_results.content.values.tolist()
yzpj_fc_contents_clean_s = drop_stopwords(contents, stopwords)
首先,我们从本地文件中读取停用词列表,然后定义drop_stopwords
函数,该函数遍历每个词语列表,将不在停用词列表中的词语保留下来,最后分别对差评和优质评价的分词结果进行停用词移除操作。
五、词向量转换与朴素贝叶斯分类
(一)数据标签添加与合并
为了进行文本分类任务,我们需要给每个数据添加标签,1代表差评,0代表优质评价,然后将两者合并。
cp_train = pd.DataFrame({'segments_clean':cp_fc_contents_clean_s, 'label':1})
yzpj_train = pd.DataFrame({'segments_clean':yzpj_fc_contents_clean_s, 'label':0})
pj_train = pd.concat([cp_train, yzpj_train])
pj_train.to_excel('pj_train.xlsx',index = False)
(二)数据切分
使用sklearn
库中的train_test_split
函数将数据切分为训练集和测试集,包括训练集特征、测试集特征、训练集标签和测试集标签。
from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = \
train_test_split(pj_train['segments_clean'].values,pj_train['label'].values, random_state = 0)
(三)词向量转换
这里我们使用CountVectorizer
来将文本转换为词向量。CountVectorizer
会统计每个词语在文本中出现的次数,从而构建词向量矩阵。
words = []
for line_index in range(len(x_train)):words.append(' '.join(x_train[line_index]))from sklearn.feature_extraction.text import CountVectorizervec = CountVectorizer(max_features=4000, lowercase=False, ngram_range=(1,3))
vec.fit(words)
我们首先将训练集的词语列表合并为字符串形式,然后实例化CountVectorizer
对象,设置max_features
表示选取出现频率最高的4000个词语,lowercase=False
表示不将文本转换为小写,ngram_range=(1,3)
表示考虑1 - 3个连续词语的组合。最后使用fit
方法对数据进行拟合,学习词语的词汇表。
(四)朴素贝叶斯分类
使用MultinomialNB
(多项式朴素贝叶斯)分类器进行文本分类。
from sklearn.naive_bayes import MultinomialNB,ComplementNB
classifier = MultinomialNB(alpha = 0.1)
classifier.fit(vec.transform(words), y_train)train_pr = classifier.predict(vec.transform(words))from sklearn import metrics
print(metrics.classification_report(y_train, train_pr))test_words = []
for line_index in range(len(x_test)):test_words.append(' '.join(x_test[line_index]))test_pr = classifier.predict(vec.transform(test_words))
print(metrics.classification_report(y_test, test_pr))
首先实例化MultinomialNB
分类器并设置alpha
参数,然后使用fit
方法对训练数据进行训练。接着对训练集和测试集分别进行预测,并使用classification_report
函数评估分类结果,输出精确率、召回率、F1值等指标。
运行结果如下
词向量转换是自然语言处理中不可或缺的基础环节,它为后续的各种文本分析任务奠定了坚实的基础。通过本文的介绍和代码实践,相信大家对词向量转换有了更清晰的认识。在实际应用中,我们还可以尝试不同的词向量转换方法(如TF-IDF、Word2Vec等)和优化策略,以获得更好的处理效果。