gensim使用心得

#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应该可以得到主题概率模型,主题概率模型是怎么匹配的,如果事先分类的时候确定五个主题,怎么确定输入文件和哪个主题更加相近呢,希望知道的大佬帮忙解惑一下。

### Gensim 使用教程概述 Gensim 是一个用于主题建模和文档相似度分析的强大工具。为了帮助理解其功能,下面提供了一个详细的使用流程。 #### 安装 Gensim 库 要开始使用 Gensim 进行文本数据分析,需先确保已正确安装该库[^4]。可以通过 pip 工具轻松完成这一操作: ```bash pip install gensim ``` #### 文本预处理 在应用 LDA 或其他高级算法之前,通常需要对原始文本执行一系列清理工作。这可能涉及去除停用词、标点符号转换为小写形式等步骤。虽然具体的预处理技术取决于特定的任务需求,但大多数情况下都遵循类似的模式[^1]。 #### 构建并训练 LDA 模型 一旦完成了必要的准备工作之后,就可以着手创建 LDA (Latent Dirichlet Allocation) 模型实例来探索潜在的主题结构了。这里给出一段简单的 Python 代码片段展示如何利用 Gensim 实现这一点: ```python from gensim import corpora, models # 假设 texts 是经过预处理后的分词列表集合 dictionary = corpora.Dictionary(texts) corpus = [dictionary.doc2bow(text) for text in texts] lda_model = models.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, random_state=42, passes=15) topics = lda_model.print_topics(num_words=5) for topic in topics: print(topic) ``` 这段脚本首先定义了一个字典对象 `dictionary` 来映射单词到唯一的 ID;接着基于这个字典构建了一个稀疏矩阵表示法下的语料库 `corpus`;最后通过调用 `models.LdaModel()` 函数指定参数后得到最终的 LDA 模型,并打印出前五个最具有代表性的关键词组合形成的话题。 #### 展示 LSA 主题模型的结果 除了 LDA 外,还可以考虑采用另一种称为 Latent Semantic Analysis (LSA) 的方法来进行主题挖掘。以下是有关于怎样运用 Gensim 中的 LSA 功能的一个简单例子[^3]: ```python lsi_model = models.LsiModel(corpus=corpus, id2word=dictionary, num_topics=2) print(lsi_model.show_topics()) ``` 此部分代码会输出由两组不同概念构成的主题描述及其权重信息。 #### 利用 Top2Vec 提升分类性能 对于某些更复杂的自然语言处理任务而言,单纯依靠传统的统计学手段或许难以达到理想效果。此时不妨尝试引入更加先进的机器学习框架——比如 Top2Vec ——作为一种辅助机制参与到整个流水线当中去。具体来说就是借助后者所提供的高质量向量化表达作为特征输入给定的传统监督式学习器之中,从而有望获得更好的泛化能力与预测精度[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值