主题提取_自己的代码

def cmp(e1,e2):

#输出关键词,按照关键词的计算分值排序,在得分相同,根据关键词排序
import numpy as np
res=np.sign(e1[1]-e2[1])

if res!=0:
return res
else:

a=e1[0]+e2[0]
b=e2[0]+e1[0]


if a>b:

return 1
elif a==b:
return 0
else:
return -1
def calsim(l1,l2):
a,b,c=0.0,0.0,0.0
for t1,t2 in zip(l1,l2):
x1=t1[1]
x2=t2[1]
a+=x1*x1
b+=x1*x1
c+=x2*x2
sim=a/math.sqrt(b*c) if not (b*c)==0.0 else 0.0
return sim
#主题模型
class TopicModel(object):
def __init__(self,doc_list,keyword_num,model='LSI',num_topics=4):
#三个传入参数:处理后的数据集,关键词数量,具体模型(LSI,LDA),主题数量
#使用gensim接口,将文本转为向量表示
#先构建词空间
self.dictionary=corpora.Dictionary(doc_list)
#使用BOW模型向量化
corpus=[self.dictionary.doc2bow(doc)for doc in doc_list]
#对每个词,根据tf-idf进行加权,得到加权后的向量表示
self.tfidf_model=models.TfidfModel(corpus)
self.corpus_tfidf=self.tfidf_model[corpus]
self.keyword_num=keyword_num
self.num_topics=num_topics
#选择加载的模型
if model=='LSI':
self.model=self.train_lsi()
else:
self.model=self.train_lda()
#得到数据集的主题-词分布
def train_lsi(self):
lsi=models.LsiModel(self.corpus_tfidf,id2word=self.dictionary,num_topics=self.num_topics)
return lsi
def train_lda(self):
lda=models.LdaModel(self.corpus_tfidf,id2word=self.dictionary,num_topics=self.num_topics)
return lda
def get_wordtopic(self,word_dict):
wordtopic_dict={}
for word in word_dict:
single_list=[word]
wordcorus=self.tfidf_model[self.dictionary.doc2bow(single_list)]
wordtopic=self.model[wordcorus]
wordtopic_dict[word]=wordtopic
print('wordtopic_dict',wordtopic_dict)

return wordtopic_dict
def get_simword(self,word_list):
#计算词的分布和文档的分布相似度,取相似度最高的keyword_num个词作为主题词

#TF-IDF变换
sentcorpus=self.tfidf_model[self.dictionary.doc2bow(word_list)]
senttopic=self.model[sentcorpus]

#余弦相似度

#计算输入文本和每个主题词的相似度
sim_dict={}
self.wordtopic_dict=self.get_wordtopic(word_list)
for k,v in self.wordtopic_dict.items():
if k not in word_list:
continue
sim=calsim(v,senttopic)
sim_dict[k]=sim
print('sim_dict',sim_dict)
key_word=[]
for k,v in sorted(sim_dict.items(),key=functools.cmp_to_key(cmp),reverse=True)[:self.keyword_num]:
key_word.append(k)

return key_word
def topic_extract(word_list,model,pos=False,keyword_num=5):
doc_list=load_data(pos)
topic_model=TopicModel(doc_list,keyword_num,model=model)
result=topic_model.get_simword(word_list)
return result

猜你喜欢

转载自www.cnblogs.com/hapyygril/p/9970432.html