使用 gensim 训练中文词向量,计算词语之间的相似度。
输入:语料库,txt文件。
输出:余弦相似度。
实现代码:
# -*- coding: utf-8 -*-
import logging
from gensim import models
from gensim.models import word2vec
def main():
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.LineSentence("output.txt")
model = word2vec.Word2Vec(sentences, size=250)
# 保存模型,供以后使用
model.save("word2vec.model")
# 模型读取
# model = word2vec.Word2Vec.load("your_model_name")
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model = models.Word2Vec.load('word2vec.model')
print("提供 3 种测试模式\n")
print("输入一个词,则去寻找前一百个该词的相似词")
print("输入两个词,则去计算两个词的余弦相似度")
print("输入三个词,进行类比推理")
while True:
try:
query = input('')
q_list = query.split()
if len(q_list) == 1:
print("相似词前 100 排序")
res = model.most_similar(q_list[0], topn=100)
for item in res:
print(item[0] + "," + str(item[1]))
elif len(q_list) == 2:
print("计算 Cosine 相似度")
res = model.similarity(q_list[0], q_list[1])
print(res)
else:
print("%s之于%s,如%s之于" % (q_list[0], q_list[2], q_list[1]))
res = model.most_similar([q_list[0], q_list[1]], [q_list[2]], topn=100)
for item in res:
print(item[0] + "," + str(item[1]))
print("----------------------------")
except Exception as e:
print(repr(e))
if __name__ == "__main__":
main()
gensim的参数解释:
from gensim.models import Word2Vec
model = Word2Vec(sentences, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4)
sg=1是skip-gram算法,对低频词敏感;默认sg=0为CBOW算法。
size是输出词向量的维数,值太小会导致词映射因为冲突而影响结果,值太大则会耗内存并使算法计算变慢,一般值取为100到200之间。
window是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b个词,后面看b个词(b在0-3之间随机)。
min_count是对词进行过滤,频率小于min-count的单词则会被忽视,默认值为5。
negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值为1e-3。
hs=1表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被选择使用。
workers控制训练的并行,此参数只有在安装了Cpython后才有效,否则只能使用单核。