[文本语义相似] 基于bow的余弦距离(gensim实现)

文本相似在问答系统中有很重要的应用,如基于知识的问答系统(Knowledge-based QA),基于文档的问答系统(Documen-based QA),以及基于FAQ的问答系统(Community-QA)等。像 对于问题的内容,需要进行相似度匹配,从而选择出与问题最接近,同时最合理的答案。本节介绍 基于bow的余弦距离计算相似度。

基于gensim的方式如下:

import os
import jieba
import pickle
import logging
import numpy as np
from gensim import corpora, models, similarities


class StopWords(object):
    '''
    '''
    def __init__(self, stopwords_file=stopwords_file ):
        self.stopwords = set( [ word.strip() for word in open(stopwords_file, 'r') ] )
    
    def del_stopwords(self, words):
        return [ word for word in words if word not in self.stopwords ]

stop_word = StopWords()

# 是否分词、  及其停用词语
def _seg_word(words_list, jieba_flag=True, del_stopword=False):
    if jieba_flag:
        word_list = [[stop_word.del_stopwords(words) if del_stopword else word for word in jieba.cut(words)] for words in words_list]
    else:
        word_list = [[stop_word.del_stopwords(words) if del_stopword else word for word in words] for words in words_list]
    return word_list


word_list = ['我爱北京天安门', '你好,在干嘛呢', '这个什么价钱']
word_list = _seg_word(word_list)
dic = corpora.Dictionary(word_list, prune_at=2000000) 
# 保存模型
dic_path = './bow.model'
dic.save( dic_path ) 


# 加载模型
dic = corpora.Dictionary.load(dic_path)  

# 构建检索模型
bow_index_path = './bow_index.model'
corpus_model= [dic.doc2bow(word) for word in word_list]
bow_index = similarities.Similarity(bow_index_path, corpus_model, num_features=4000) 
bow_index.save(bow_index_path)



# 得到句子向量, 直接出检索结果(检索是基于word_list的)。
words = '你好,在干嘛呢'
word_bow = dic.doc2bow(_seg_word([words])[0])
bow_index[word_bow] 



原创文章 377 获赞 835 访问量 187万+

猜你喜欢

转载自blog.csdn.net/u014365862/article/details/105912872