Python 利用Word2Vec计算词语相似度(gensim实现)

使用 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)
  1. sg=1是skip-gram算法,对低频词敏感;默认sg=0为CBOW算法。
  2. size是输出词向量的维数,值太小会导致词映射因为冲突而影响结果,值太大则会耗内存并使算法计算变慢,一般值取为100到200之间。
  3. window是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b个词,后面看b个词(b在0-3之间随机)。
  4. min_count是对词进行过滤,频率小于min-count的单词则会被忽视,默认值为5。
  5. negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值为1e-3。
  6. hs=1表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被选择使用。
  7. workers控制训练的并行,此参数只有在安装了Cpython后才有效,否则只能使用单核。 

你可能感兴趣的:(自然语言处理,NLP,Python)