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