#list1里放关键字,关键字可以通过jieba或者snownlp给出,我这里是提前设置好的
list1=[]
import jieba
#将docx文件转化为txt
import docx2txt
import jieba.analyse
def test(file_path):
h=docx2txt.process(file_path)
data=jieba.cut(h)
list_word=[]
for word in data:
if word in list1:
list_word.append(word)
#将结果保存到本地
f=open('save_path','a')
print(list_word,file=f)
f.close()
import os
import traceback
#遍历文件夹下所有的文件
dire='文件夹路径'
for direction,_nothing,file in os.walk(dire):
for filename in file:
if '.docx' in filename:
try:
test(dire+filename)
except Exception as e:
traceback.print_exc()
#读取保存的结果,并去掉'\n'和“ ”
res=[]
with open('') as f:
line=f.readlines()
for i in line:
i=i.strip()
j=eval(i)
res.append(j)
from gensim import corpora
texts=res
#通过文档抽取一个“词袋(bag-of-words)”,将文档的token映射为id
dictionary = corpora.Dictionary(texts)
#print(dictionary)
#用字符串表示的文档转换为用id表示的文档向量
corpus = [dictionary.doc2bow(text) for text in texts]
#doc2bow()计算不同单词出现的次数,并将单词转换为其整数字id
#print(corpus[0])
#将向量空间语料库(向量序列)序列化到磁盘
#corpora.MmCorpus.serialize('save_path',corpus)
#加载向量空间的语料库
#corpus=corpora.MmCorpus('save_path')
#print(corpus[0])
#查看日志
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
#基于这些“训练文档”计算一个TF-IDF“模型”,也就是创建转换
from gensim import models
tfidf=models.TfidfModel(corpus)
#基于这个TF-IDF模型,我们可以将上述用词频表示文档向量表示为用一个tf-idf值表示的文档向量
#model[corpus]方法返回的是一个迭代器,如果要多次访问model[corpus]的返回结果,可以先将结果向量序列化到磁盘上
#tfidf.save('保存路径')
#tfidf=model.TfidfModel.load('保存路径')
#将转换应用于整个语料库
corpus_tfidf=tfidf[corpus]
# 构造LSI模型并将待检索的query和文本转化为LSI主题向量
# 转换之前的corpus和query均是BOW向量
#lsi的物理意义不太好解释,不过最核心的意义是将训练文档向量组成的矩阵SVD分解
# 潜在语义索引(Latent Semantic Indexing,以下简称LSI),有的文章也叫Latent Semantic Analysis(LSA)
# LSI是基于奇异值分解(SVD)的方法来得到文本的主题的
#并做了一个秩为2的近似SVD分解。有了这个lsi模型,我们就可以将文档映射到一个二维的topic空间中。
#lsi_model = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=2)
#lsi_model.print_topics(2)
#corpus_lsi=lsi_model[corpus_tfidf]
#for doc in corpus_lsi:
# print(doc)
#实现模型的持久化save()和load(),lda也是同样的方法
#lsi_model.save('save_path')
#lsi_model=models.LsiModel.load('save_path')
#lda模型中每个单词都有概率意义,其加和为1,值越大权重越大,物理意义比较明确
lda_model=models.LdaModel(corpus_tfidf,id2word=dictionary,num_topics=10)
#lda_model.print_topics(10)
corpus_lda=lda_model[corpus_tfidf]
#for doc in corpus_ida:
# print(doc)
#计算文档的相似度,或者换个角度,给定一个查询的Query,如何
#找到最相关的文档,当然首先是建索引
from gensim import similarities
#index=similarities.MatrixSimilarity(lsi_model[corpus])
index=similarities.MatrixSimilarity(lda_model[corpus])
#我们可以用save()和load()方法持久化这个相似度矩阵
#注意,如果待检索的目标文档过多,使用similarities.MatrixSimilarity类往往会带来内存不够的问题
#此时,可以改用similarities.Similarity类。二者的接口基本保持一致。
#index.save('E:/铸保/deerwester.index')
#index=similarities.MatrixSimilarity.load('E:/铸保/deerwester.index')
#以这篇文章为例子,首先将其向量化
dic=['姓名', ':', '\n', '\n', '李欣', '\n', '\n', '性别', ':', '女', '\n', '\n', '年龄', ':', '\n', '\n', '64', '岁', ' ', '病历', '号', ':', 'M000148832', ' ', 'ID', ':', '\n', '\n', '8005500960', '\n', '\n', '科室', ':', '\n', '\n', '呼吸', '内科', '门诊', '\n', '\n', '申请', '医生', ':', '\n', '\n', '司淑一', '\n', '\n', '-', 'rTUv', '.', 'it', ' ', '2017', '.', ' ', '11', '.', ' ', '01', ' ', '..', ' ', 'rl', ',', ' ', '采样', '时间', ':', 'lfi.54', '.', '12', ' ', '收样', '时间', ':', '\n', '\n', '2017', '.', ' ', '11.01', '\n', '\n', '\t', '\t', '床号', ':', '\t', '临床诊断', ':', '发热', ',', '呼吸道', '感染', '\t', '标本', '种类', ':', '咽', '拭子', '\n', '\n', '\n', '\n', '\n', '\n', '\t', '\t', '\t', '\t', '编号', ' ', '项目名称', '\t', '检验', '结果', '\t', '中', '.', '位', '\t', '参考', '范围', '\t', '提示', '\n', '\n', '\t', '\t', '1', ' ', '甲型', '流感病毒', '抗原', '检测', '\t', '阴性', '\t', '阴性', '\n', '\n', '备注', ':', '\n', '\n', '以', '丨', '•', '.', '检骀', '结果', '仅', '对', '所', '枪测', '的', '标本', '有效', '。', '\n', '\n', '*', '为', '北京市', '三级', '阪院', '检验', '结果', '相互', '通用', '项目', '\n', '\n', '检验', '日期', ':', '\n', '\n', '2017', '-', '11', '-', '01', ' ', '检验', '者', ':', '葛', '#', '悦', '\n', '\n', '审核', '者', ':', '赖患英', ' ', '报告', '日期', ':', '2017', '-', '11', '-', '01', ' ', '17', ':', '07', ':', '59', '\n', '\n', '实验室', '名称', ':', '急诊', '化验室', '实验室', '地址', ':', '急诊科', '1', '层', '联系电话', ':', '(', '010', ')', ' ', '85133503']
query_bow=dictionary.doc2bow(dic)
print(query_bow)
#再用之前训练好的LSI模型将其映射到二维的topic空间
#query_lsi=lsi_model[query_bow]
#print(query_lsi)
query_lda=lda_model[query_bow]
#计算其和index中doc的余弦相似度
sims=index[query_lda]
#print(list(enumerate(sims)))
#进行相似度排序
sort_sims = sorted(enumerate(sims), key=lambda item: -item[1])
print(sort_sims[:5])
#最后打印的结果是按照相似度排序
但是仍然有个疑惑,lda应该可以得到主题概率模型,主题概率模型是怎么匹配的,如果事先分类的时候确定五个主题,怎么确定输入文件和哪个主题更加相近呢,希望知道的大佬帮忙解惑一下。