初学NLP,尝试word2vec模型
第一次学这种,查阅了很多的博客,克服了些些问题,记录一下第一次探索的历程和相关代码,文中借鉴多篇优秀的文章,连接会在文章中给出。
1.实验样本
在我最开始寻找实验头绪的时候,了解做这个需要实验样本,但是大部分博主没有提供他的实验样本,所以我在网络上下载了《倚天屠龙记》的文本。
在下面这篇博客中我了解到可以运用文本进行分割自己生成词的实验样本,以及如何运用jieba的包。
借鉴的博客1
运用jieba包切割词的相关代码:
import jieba.analyse
import codecs
f=codecs.open('D:/NLP/A.txt','r',encoding="utf8")
target = codecs.open("D:/NLP/B.txt",'w',encoding="utf8")print('open files')
line_num=1
line = f.readline()#循环遍历每一行,并对这一行进行分词操作#如果下一行没有内容的话,就会readline会返回-1,则while -1就会跳出循环while line:print('---- processing ', line_num,' article----------------')
line_seg =" ".join(jieba.cut(line))
target.writelines(line_seg)
line_num = line_num +1
line = f.readline()#关闭两个文件流,并退出程序
f.close()
target.close()
exit()
将下载好的文件A切割后保存在文件B中。
前后对比
上面博客最后有一张词语相似度的截图,让我也很想试试,但是作者没有附加代码,所以我有一段时间一直以为可以直接print出模型的相似度,直到后来我看到下面这篇文章
借鉴的博客2
但是,该博客发布日期有点早,现在的一些方法已经更新不能用了,所以我在大佬的代码下做了一些些修改
model.similarity ---->model.wv.similarity
model.most_similar ---->model.wv.most_similar
再根据我的文本修改,形成的以下的代码
from gensim.models import word2vec
import logging
# 主程序
logging.basicConfig(format='%(asctime)s:%(levelname)s: %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus(u"D:/NLP/B.txt")# 加载语料
model = word2vec.Word2Vec(sentences, size=200)# 训练skip-gram模型,默认window=5print(model)# 计算两个词的相似度/相关程度try:
y1 = model.wv.similarity(u"张无忌",u"赵敏")except KeyError:
y1 =0print(u"【张无忌】和【赵敏】的相似度为:", y1)print("-----\n")## 计算某个词的相关词列表
y2 = model.wv.most_similar(u"张无忌", topn=20)# 20个最相关的print(u"和【张无忌】最相关的词有:\n")for item in y2:print(item[0], item[1])print("-----\n")# 寻找不合群的词
y4 = model.wv.doesnt_match(u"很多 张无忌 赵敏 周芷若".split())print(u"不合群的词:", y4)print("-----\n")# 保存模型,以便重用
model.save(u"神雕侠侣.model")
最后在控制台输出,并保存了模型
第一次用自然语言处理的模型,记录一下,也很感谢学习过程中看到的一些大佬的文章。
版权归原作者 bolite 所有, 如有侵权,请联系我们删除。