基于词频的文本相似度计算

2018-11-11  本文已影响0人  Max_7

TF:词频
=\frac{count(w)}{D_{i}}
w:词w出现的次数
D_{i}文档D中所有词的个数

IDF:逆文档频率
=log\frac{N}{sum_{i}^{N}I(w,D_{i})+1}
I(w,D_{i}) :Di中是否含有词w, 1:有 0:没有
N:文档总数
分母加1是做了平滑处理

一个词如果出现在所有文档中,那说明这个词不重要。
一个词如果在一篇文章中出现次数多,但是在其他文档中出现次数很少。这说明这个词具有很好的区分能力。 这就是 TF-IDF的直观意义。

对于文档的处理过程: 分词,去停词->计算tf-idf->向量化->在空间中计算相似度

以下为简单的代码示例:

class SentensSim(object):
    def __init__(self, documents, sentence,top_num=2):
        '''
        :param documents: 训练文本库
        :param sentence: 待匹配的句子
        :param top_num:返回相似结果的数量
        '''

        self.documents = documents
        self.sentence = sentence
        ###
        self.top_num = top_num

    def similarity(self):
        corpora_documents = []
        stopwords = {}.fromkeys([line.rstrip() for line in open('chineseStopWords.txt')])
        # 文本处理
        for item_text in self.documents:
            item_seg = list(jieba.cut(item_text)) #分词
            words = []
            for seg in item_seg:
                if seg not in stopwords:
                    words.append(seg) #去停词
            corpora_documents.append(words)
        # #生成字典和向量语料
        dictionary = corpora.Dictionary(corpora_documents)
        # 通过下面一句得到语料中每一篇文档对应的稀疏向量(这里是bow向量)
        corpus = [dictionary.doc2bow(text) for text in corpora_documents]
        #corpus是一个返回bow向量的迭代器。下面代码将完成对corpus中出现的每一个特征的IDF值的统计工作
        tiidf_model = models.TfidfModel(corpus)
        corpus_tfidf = tiidf_model[corpus]

        self.sim = similarities.Similarity('Similarity-tfidf-index', corpus_tfidf, num_features=600)
        self.sim.num_best = self.top_num #如果等于3,则返回最相似的3个结果
        sentence_cut_temp = list(jieba.cut(self.sentence))
        sentence_cut = []
        for word in sentence_cut_temp:
            if word not in stopwords:
                sentence_cut.append(word)
        sentence_cut_corpus = dictionary.doc2bow(sentence_cut)
        self.sentence_sim = tiidf_model[sentence_cut_corpus]
        self.resultShow()

完整代码:https://github.com/MaXXXXfeng/TF-IDF-sentences-matching

上一篇 下一篇

猜你喜欢

热点阅读