目录
一、准备工作
1. 安装Gensim库
2. 对原始语料分词
二、训练Word2Vec模型
三、模型应用
1.计算词汇相似度
编辑
2. 找出不匹配的词汇
3. 计算词汇的词频
四、总结
本文为[365天深度学习训练营]内部限免文章(版权归 *K同学啊* 所有)
作者:[K同学啊]
本周任务:
●阅读NLP基础知识里Word2vec详解一文,了解并学习Word2vec相关知识
●学习本文内容,在下一篇文章中,将使用Word2vec辅助完成文本分类任务
数据集是一本电子书,txt格式
调出控制台pip安装即可
pip install gensim
选择《人民的名义》的小说原文作为语料,先采用jieba进行分词
import jieba
import jieba.analyse
import chardet
jieba.suggest_freq('沙瑞金', True) # 加入一些词,使得jieba分词准确率更高
jieba.suggest_freq('田国富', True)
jieba.suggest_freq('高育良', True)
jieba.suggest_freq('侯亮平', True)
jieba.suggest_freq('钟小艾', True)
jieba.suggest_freq('陈岩石', True)
jieba.suggest_freq('欧阳菁', True)
jieba.suggest_freq('易学习', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('蔡成功', True)
jieba.suggest_freq('孙连城', True)
jieba.suggest_freq('季昌明', True)
jieba.suggest_freq('丁义珍', True)
jieba.suggest_freq('郑西坡', True)
jieba.suggest_freq('赵东来', True)
jieba.suggest_freq('高小琴', True)
jieba.suggest_freq('赵瑞龙', True)
jieba.suggest_freq('林华华', True)
jieba.suggest_freq('陆亦可', True)
jieba.suggest_freq('刘新建', True)
jieba.suggest_freq('刘庆祝', True)
jieba.suggest_freq('赵德汉', True)
result_cut = []
with open('./in_the_name_of_people.txt', 'rb') as f:
raw_data = f.read()
encoding = chardet.detect(raw_data)['encoding']
lines = raw_data.decode(encoding).splitlines()
for line in lines:
result_cut.append(list(jieba.cut(line)))
# 在这里处理分词结果result_cut
# 不需要再调用 f.close(),因为使用了 with 语句会自动关闭文件
# 添加自定义停用词
stopwords_list = [",","。","\n","\u3000"," ",":","!","?","…"]
def remove_stopwords(ls): # 去除停用词
return [word for word in ls if word not in stopwords_list]
result_stop=[remove_stopwords(x) for x in result_cut if remove_stopwords(x)]
拿到了分词后的文件,在一般的NLP处理中,会需要去停用词。由于word2vec的算法依赖于上下文,而上下文有可能就是停词。因此对于word2vec,我们可以不用去停词,仅仅去掉一些标点符号,做一个简单的数据清洗。
现在我们可以直接读分词后的文件到内存。这里使用了word2vec提供的LineSentence类来读文件,然后套用word2vec的模型。在实际应用中,可以调参提高词的embedding的效果。
print(result_stop[100:103])
[['赵德汉', '慌', '了', '忙', '把门', '卡往', '外', '掏', '这', '这', '什么', '呀', '这', '是'], ['你', '帝京', '苑', '豪宅', '的', '门', '卡', '啊', '请', '继续', '配合', '我们', '执行公务', '吧'], ['赵德汉', '的', '幽默感', '瞬间', '消失', '一下子', '软软', '瘫坐', '到', '地上']]
from gensim.models import Word2Vec
model = Word2Vec(result_stop, # 用于训练的语料数据
vector_size=100, # 是指特征向量的维度,默认为100。
window=5, # 一个句子中当前单词和被预测单词的最大距离。
min_count=1) # 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5。
我们可以使用similarity()方法计算两个词汇之间的余弦相似度。
# 计算两个词的相似度
print(model.wv.similarity('沙瑞金', '季昌明'))
print(model.wv.similarity('沙瑞金', '田国富'))
0.9994414
0.9994026
# 选出最相似的5个词
for e in model.wv.most_similar(positive=['沙瑞金'], topn=5):
print(e[0], e[1])
使用doesnt_match()方法,我们可以找到一组词汇中与其他词汇不匹配的词汇。
odd_word = model.wv.doesnt_match(["苹果", "香蕉", "橙子", "书"])
print(f"在这组词汇中不匹配的词汇:{odd_word}")
在这组词汇中不匹配的词汇:书
我们可以使用get_vecattr()方法获取词汇的词频。
word_frequency = model.wv.get_vecattr("沙瑞金", "count")
print(f"沙瑞金:{word_frequency}")
沙瑞金:353
本文主要介绍了如何使用Word2Vec进行自然语言处理任务。下面是对文章内容的总结:
首先需要安装Gensim库,它是用于训练Word2Vec模型的Python库。
文章选择《人民的名义》作为语料,使用jieba进行分词。还加入了一些自定义词,以提高jieba的分词准确率。
分词后的结果可以进行数据清洗,去除一些标点符号等简单的处理。
使用Gensim库中的Word2Vec类训练Word2Vec模型。需要传入分词后的语料数据,设置特征向量的维度、窗口大小和词频阈值等参数。
训练完成后,可以进行模型应用。例如,可以使用similarity()方法计算两个词汇之间的余弦相似度,或者使用most_similar()方法找出与指定词汇最相似的词汇。
还可以使用doesnt_match()方法找出一组词汇中与其他词汇不匹配的词汇,或者使用get_vecattr()方法获取词汇的词频。