目录
了解了文本表示的基本含义之后,前面学习了词袋模型这种最简单的文本表示方法,接下来学习了Word2Vec。
本文便是使用工具训练Word2Vec的实操代码,代码都是来自参考文献里的这本书,但是我在学习的过程中发现,书上的代码使用的应该gensim3版本,现在gensim已经更新到了v4,所以书中的很多代码报错。
针对这种问题,解决办法有二,第一是下载掉v4版本的gensim,下载v3版本的;第二种方法自然是重新去查询v4版本的相应调用代码。
个人感觉,还是要紧跟时代,哈哈哈哈,所以我决定去查一下v4版本的调用方法。
参考文献:胡盼盼编著. 自然语言处理从入门到实战[M]. 中国铁道出版社, 2020.
注释里标明了这是v3或者v4导入包的方式。
from gensim.models import word2vec #v3
from gensim.models import Word2Vec #v4
import jieba
并且要将语料转化为合适的输入格式,这里的输入格式如下所示:
sentences = [['this', 'is', 'the', 'first', 'sentence', 'for', 'word2vec'],
['this', 'is', 'the', 'second', 'sentence'],
['yet', 'another', 'sentence'],
['one', 'more', 'sentence'],
['and', 'the', 'final', 'sentence']]
#该数据样式来自「小王做笔记」https://blog.csdn.net/qsx123432/article/details/120583529
因此我们要将自己的数据处理成这种格式。
raw_texts = [
'你站在桥上看风景',
'看风景的人在楼上看你',
'明月装饰了你的窗子',
'你装饰了别人的梦',
]
texts = [[word for word in jieba.cut(text, cut_all=True)] for text in raw_texts]
print(texts)
我们看一下打印出来的结果,是否和上面要求的输入格式一致。
[['你', '站', '在', '桥上', '看', '风景'],
['看', '风景', '的', '人', '在', '楼上', '看', '你'],
['明月', '装饰', '了', '你', '的', '窗子'],
['你', '装饰', '了', '别人', '的', '梦']]
接下来只需要输入相关参数,比如语料,窗口,向量维度等,就可以获得训练好的模型了。
model = word2vec.word2vec(texts, min_count = 1, window = 3, size = 5) #v3
model = Word2Vec(texts, min_count = 1, window = 3, vector_size = 5) #v4
上面通过一行简单的代码,便训练好了一个迷你版本的词向量库,接下来对其进行应用。
print(new_model["你"]) #v3
print(model.wv["你"] #v4
不过这里还有一个问题就是,这个new_model是怎么回事?原本我以为在v3版本里,会直接把训练的model命名为new_model,但是后来我去看网上的帖子发现,v3里面也直接是print(model["你"])这样的。那我在想,是不是这本书写错了,或者跳过了某行代码???
但是目前我也没下载v3版本的gensim,所以无从判断,但从直觉来讲,总觉得是这本书不小心写错了,嘿嘿!不过因为我零基础入门python,所以也无法确定到底是错误,还是因为这上面的代码可能版本比较旧,所以才会在我的电脑上报错。
(这个其实也是计算两个词的相关性)
print(model.wv.similarity("窗子","楼上"))
print(model.wv.similar_by_word("你", topn = 3))
#或者以下代码也可以
print(model.wv.most_similar("你", topn = 3))
如果暂时训练的语料太少,那我们可以将该模型保存,等搜集到更多的语料,重新加载模型,并可根据新语料对模型再次训练。
model.save("word2vec_model") #保存模型
new_model = word2vec.word2vec.load("word2vec_model") #v3,重新加载模型
new_model = Word2Vec.load("word2vec_model") #v4,重新加载模型
new_model.train(new_texts) #根据新语料再次训练模型,new_texts即为新语料。