【NLP】使用TF-IDF模型计算文本相似度

所用数据集:ChnSentiCorp_htl_all.csv
语料库即存放稀疏向量的列表。
要注意的是,搜索文本text与被检索的文档共用一个特征词词典。

代码主要使用gensim库完成了分词、TF-IDF模型训练、文本相似度计算。
过程如下:
分词、建立特征词典、建立语料库、用TF-IDF模型处理语料库、计算搜索文本与被检索文本的相似度。

import csv
import jieba
from gensim import corpora, models, similarities

count = 0
wordListTop10 = []
with open('/home/kiosk/Downloads/ChineseNlpCorpus-master/datasets/ChnSentiCorp_htl_all/ChnSentiCorp_htl_all.csv', 'r') as f:
    lines = csv.reader(f)  #lines的类型是   指向csv文件的第一行
   
    next(lines) #指向csv文件的第二行  这个函数的参数是迭代器(iterator)和一个default
                    #next(iterator, default)
                    #default是迭代器已经到了最末端,再调用next()函数的输出值。不填这个参数的话,到了最末端还用next()的话会报错。

    for line in lines:
        #只选取前10句话
        if count == 10:
            break
            
        segList = list(jieba.cut(line[1]))  # 分词      jieba.cut(line[1])对每一行列表的第二个元素进行分词,类型是generator
        wordListTop10.append(segList) #把前10句话的所有分词放进一个列表中,该列表为一个列表嵌套10个列表
        count += 1
#         print('/'.join(segList))       # '/'.join(segList)将segList即每句话的分词列表 转换成字符串,用’/‘将每个元素连接起来


"""
制作词袋模型(bag_of_word  (bow))
"""
# 制作字典
dictionary = corpora.Dictionary(wordListTop10)
# 可以通过token2id得到特征数字
# print(dictionary.token2id)

"""
制作数字向量类型的语料库(doc2bow)
"""
#----> 将字符串转换成数字向量类型的词袋模型(稀疏向量)
# 源文件不做处理是一个字符串类型的语料库
corpus = [dictionary.doc2bow(doc) for doc in wordListTop10]

def semblance(text, corpus):
    # 对测试文本分词
    dic_text_list = list(jieba.cut(text))
    
    # 制作测试文本的词袋
    doc_text_vec = dictionary.doc2bow(dic_text_list)

    # 获取语料库每个文档中每个词的tfidf值,即用tfidf模型训练语料库
    tfidf = models.TfidfModel(corpus)

    #对稀疏向量建立索引
    index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=len(dictionary.keys()))
    sim = index[tfidf[doc_text_vec]]    # 相当于sim = index.get_similarities(tfidf[doc_text_vec])
    #按照相似度来排序
    sim_sorted = sorted(enumerate(sim,1), key=lambda x: -x[1])
    #相当于sorted(enumerate(sim), key=lambda x: x[1], reverse=True
    print(sim_sorted)
    
#     for e,s in enumerate(sim,1):
#         print('text 与 doc%d 相似度为:%.6f' % (e, s))

if __name__ == '__main__':
	text = '这个商务大床房,感觉还不错'
    semblance(text, corpus)

执行效果:
在这里插入图片描述
可以看到,text与数据集中第二条语句相似度最高。
【NLP】使用TF-IDF模型计算文本相似度_第1张图片

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