TF:词频
=
w:词w出现的次数
文档D中所有词的个数
IDF:逆文档频率
=
: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