文档相似度的比较tf-idf lda lsi

3 篇文章 0 订阅
from gensim.models import doc2vec
from gensim import corpora,models
import jieba,os
from gensim.similarities.docsim import Similarity

raw_documents = [
    '0无偿居间介绍买卖毒品的行为应如何定性',
    '1吸毒男动态持有大量毒品的行为该如何认定',
    '2如何区分是非法种植毒品原植物罪还是非法制造毒品罪',
    '3为毒贩贩卖毒品提供帮助构成贩卖毒品罪',
    '4将自己吸食的毒品原价转让给朋友吸食的行为该如何认定',
    '5为获报酬帮人购买毒品的行为该如何认定',
    '6毒贩出狱后再次够买毒品途中被抓的行为认定',
    '7虚夸毒品功效劝人吸食毒品的行为该如何认定',
    '8妻子下落不明丈夫又与他人登记结婚是否为无效婚姻',
    '9一方未签字办理的结婚登记是否有效',
    '10夫妻双方1990年按农村习俗举办婚礼没有结婚证 一方可否起诉离婚',
    '11结婚前对方父母出资购买的住房写我们二人的名字有效吗',
    '12身份证被别人冒用无法登记结婚怎么办?',
    '13同居后又与他人登记结婚是否构成重婚罪',
    '14未办登记只举办结婚仪式可起诉离婚吗',
    '15同居多年未办理结婚登记,是否可以向法院起诉要求离婚'
]

corpora_documents = []
for item_text in raw_documents:
    item_str = jieba.lcut(item_text)
    print(item_str)
    corpora_documents.append(item_str)
print(corpora_documents)

print('data ok!')
corpora_documents = []
corpora_documents2=[]
for i, item_text in enumerate(raw_documents):
    words_list = list(jieba.cut(item_text))
    document = doc2vec.TaggedDocument(words=words_list, tags=[i])
    corpora_documents.append(words_list)
    corpora_documents2.append(document)

# 生成字典和向量语料
dictionary = corpora.Dictionary(corpora_documents)
corpus = [dictionary.doc2bow(text) for text in corpora_documents]
#sim模型
similarity = Similarity('-Similarity-index', corpus, num_features=10000)
#测试数据
test_data_1 = '周杰伦是个低调爱做慈善的好明星'
test_cut_raw_1 = list(jieba.cut(test_data_1))
#用sim计算相似度
test_corpus_1 = dictionary.doc2bow(test_cut_raw_1)
'''test_corpus_1 = dictionary.doc2bow(test_cut_raw_1)
similarity.num_best = 5
print('——————————————sim———————————————')
print(similarity[test_corpus_1])  # 返回最相似的样本材料,(index_of_document, similarity) tuples'''
similarity.num_best = 5
print('——————————————sim———————————————')
print(similarity[test_corpus_1])

结果为

['0', '无偿', '居间', '介绍', '买卖', '毒品', '的', '行为', '应', '如何', '定性']
['1', '吸毒', '男', '动态', '持有', '大量', '毒品', '的', '行为', '该', '如何', '认定']
['2', '如何', '区分', '是', '非法', '种植', '毒品', '原', '植物', '罪', '还是', '非法', '制造', '毒品', '罪']
['3', '为', '毒贩', '贩卖毒品', '提供', '帮助', '构成', '贩卖毒品', '罪']
['4', '将', '自己', '吸食', '的', '毒品', '原价', '转让', '给', '朋友', '吸食', '的', '行为', '该', '如何', '认定']
['5', '为', '获', '报酬', '帮人', '购买', '毒品', '的', '行为', '该', '如何', '认定']
['6', '毒贩', '出狱', '后', '再次', '够买', '毒品', '途中', '被', '抓', '的', '行为', '认定']
['7', '虚夸', '毒品', '功效', '劝人', '吸食毒品', '的', '行为', '该', '如何', '认定']
['8', '妻子', '下落不明', '丈夫', '又', '与', '他人', '登记', '结婚', '是否', '为', '无效', '婚姻']
['9', '一方', '未', '签字', '办理', '的', '结婚登记', '是否', '有效']
['10', '夫妻', '双方', '1990', '年', '按', '农村', '习俗', '举办', '婚礼', '没有', '结婚证', ' ', '一方', '可否', '起诉', '离婚']
['11', '结婚', '前', '对方', '父母', '出资', '购买', '的', '住房', '写', '我们', '二人', '的', '名字', '有效', '吗']
['12', '身份证', '被', '别人', '冒用', '无法', '登记', '结婚', '怎么办', '?']
['13', '同居', '后', '又', '与', '他人', '登记', '结婚', '是否', '构成', '重婚罪']
['14', '未办', '登记', '只', '举办', '结婚仪式', '可', '起诉', '离婚', '吗']
['15', '同居', '多年', '未办理', '结婚登记', ',', '是否', '可以', '向', '法院', '起诉', '要求', '离婚']
[['0', '无偿', '居间', '介绍', '买卖', '毒品', '的', '行为', '应', '如何', '定性'], ['1', '吸毒', '男', '动态', '持有', '大量', '毒品', '的', '行为', '该', '如何', '认定'], ['2', '如何', '区分', '是', '非法', '种植', '毒品', '原', '植物', '罪', '还是', '非法', '制造', '毒品', '罪'], ['3', '为', '毒贩', '贩卖毒品', '提供', '帮助', '构成', '贩卖毒品', '罪'], ['4', '将', '自己', '吸食', '的', '毒品', '原价', '转让', '给', '朋友', '吸食', '的', '行为', '该', '如何', '认定'], ['5', '为', '获', '报酬', '帮人', '购买', '毒品', '的', '行为', '该', '如何', '认定'], ['6', '毒贩', '出狱', '后', '再次', '够买', '毒品', '途中', '被', '抓', '的', '行为', '认定'], ['7', '虚夸', '毒品', '功效', '劝人', '吸食毒品', '的', '行为', '该', '如何', '认定'], ['8', '妻子', '下落不明', '丈夫', '又', '与', '他人', '登记', '结婚', '是否', '为', '无效', '婚姻'], ['9', '一方', '未', '签字', '办理', '的', '结婚登记', '是否', '有效'], ['10', '夫妻', '双方', '1990', '年', '按', '农村', '习俗', '举办', '婚礼', '没有', '结婚证', ' ', '一方', '可否', '起诉', '离婚'], ['11', '结婚', '前', '对方', '父母', '出资', '购买', '的', '住房', '写', '我们', '二人', '的', '名字', '有效', '吗'], ['12', '身份证', '被', '别人', '冒用', '无法', '登记', '结婚', '怎么办', '?'], ['13', '同居', '后', '又', '与', '他人', '登记', '结婚', '是否', '构成', '重婚罪'], ['14', '未办', '登记', '只', '举办', '结婚仪式', '可', '起诉', '离婚', '吗'], ['15', '同居', '多年', '未办理', '结婚登记', ',', '是否', '可以', '向', '法院', '起诉', '要求', '离婚']]
data ok!
——————————————sim———————————————
[(11, 0.3333333432674408), (4, 0.3162277638912201), (9, 0.2357022613286972), (7, 0.21320071816444397), (0, 0.21320071816444397)]

使用doc2vec计算相似度

#doc2vec计算相似度
model = doc2vec.Doc2Vec(size=89, min_count=1, iter=10)

model.build_vocab(corpora_documents2)
model.train(corpora_documents2,total_examples=model.corpus_count, epochs=model.iter)
print('——————————————doc2vec———————————————')
inferred_vector = model.infer_vector(test_cut_raw_1)
sims = model.docvecs.most_similar([inferred_vector], topn=5)
print(sims)

结果为:

——————————————doc2vec———————————————
[(4, 0.18099625408649445), (15, 0.11766307055950165), (13, 0.11126244068145752), (9, 0.0980050191283226), (1, 0.05012283846735954)]

LSI 计算文档相似度

#转化成tf-idf向量
tfidf_model=models.TfidfModel(corpus)
corpus_tfidf = [tfidf_model[doc] for doc in corpus]
#转化成lsi向量
lsi= models.LsiModel(corpus_tfidf,id2word=dictionary,num_topics=50)
corpus_lsi = [lsi[doc] for doc in corpus]
similarity_lsi=Similarity('Similarity-Lsi-index', corpus_lsi, num_features=1600,num_best=5)
test_corpus_3 = dictionary.doc2bow(test_cut_raw_1)  # 2.转换成bow向量
test_corpus_tfidf_3 = tfidf_model[test_corpus_3]  # 3.计算tfidf值
test_corpus_lsi_3 = lsi[test_corpus_tfidf_3]  # 4.计算lsi值
print('——————————————lsi———————————————')
print(similarity_lsi[test_corpus_lsi_3])

结果为:

——————————————lsi———————————————
[(2, 0.9777664542198181), (4, 0.19862982630729675), (7, 0.17728787660598755), (5, 0.17022894322872162), (1, 0.16858258843421936)]

用lda计算文档相似度

#转化成lda向量
lda= models.LdaModel(corpus_tfidf,id2word=dictionary,num_topics=50)
corpus_lda = [lda[doc] for doc in corpus]
similarity_lda=Similarity('Similarity-LDA-index', corpus_lda, num_features=1600,num_best=5)
test_corpus_lda_3 = lda[test_corpus_tfidf_3]  # 4.计算lda值
print('——————————————lda———————————————')
print(similarity_lda[test_corpus_lda_3])

结果为:

——————————————lda———————————————
[(2, 0.9901499152183533), (4, 0.024744609370827675), (14, 0.0200016051530838), (12, 0.0200016051530838), (10, 0.0200016051530838)]

print(lsi)
print('——————————————向量———————————————')
print(lsi[corpus_tfidf[0]])

结果为:

LsiModel(num_terms=131, num_topics=50, decay=1.0, chunksize=20000)
——————————————向量———————————————
[(0, 0.21783106255388965), (1, -0.23067638649063138), (2, 0.032697713549656726), (3, -0.009954274168357714), (4, 0.020529906009231626), (5, -0.10249886544444127), (6, 0.07089181319707308), (7, -0.9015393660527969), (8, 0.237450369773125), (9, -0.0035498586946740023), (10, 0.041123515533565254), (11, 0.05210694737124495), (12, -0.07484362939089922), (13, 0.04961858691949999), (14, -0.023892249350932215), (15, 0.0027318443602367707)]
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值