文本主題模型提取html
以下程序將句子主題提取後,將權重值存入dataframe.python
#!/usr/bin/python # -*- coding:utf-8 -*- import pandas as pd import numpy as np import matplotlib as mpl import math import warnings import jieba from gensim import corpora, models, similarities # 參數說明: # doc_topics: 可用np.array(doc_topics) # 對其進行查看, # 它裏面存儲的是每一個句子對應的list, list中分別是句子中部分詞的標號和權重值, # x:表示的是單個句子在dataframe的index # num_show_topic:LdaMulticore提取的主題的個數 # col:是列名 def getlda(doc_topics, x, num_show_topic, col): # topic是doc_topics中list的內容變成了二階張量的形式 topic = np.array(doc_topics[x]) # topic[:,1]中是某個句子中部分詞的權重值 # argsort函數返回的是數組值從小到大的索引值,即np.argsort(topic[:,1])中是list中全部的權重值由小到大排序後的索引 # topic_id中是topic按權重值排序後生成的二維張量 topic_id=topic[np.argsort(topic[:,1])] # 若是該句子主題個數不夠LdaMulticore提取的個數,則對缺乏的部分補0 if topic_id.shape[0]<num_show_topic: settopici=set(topic_id[:,0]) settopicadd=set([x for x in range(num_show_topic)])-settopici# 補上沒出現的topic dfall=pd.concat([pd.DataFrame({0:list(settopicadd),1:[0 for x in range(len(settopicadd))]}),pd.DataFrame(topic_id)],axis=0) # 不然說明該句子中的主題個數與LdaMulticore中規定的一致, else: dfall=pd.DataFrame(topic_id) # print(dfall) # 對第一列進行排序,即按主題進行排序 共num_show_topic個主題 dfall.sort_values(0,inplace=True) # 將dfall中的權重值列轉化爲dataframe,變爲1行num_show_topic列 df =pd.DataFrame([dfall[1].values]) df=df.astype(np.float32) # 生成num_show_topic個列 L = range(num_show_topic) df.columns = [col + 'lda' + str(i) for i in L] # 將最終生成的1行num_show_topic列的dataframe返回 return df def fenge(x): x = x.split('|') # print('x中不一樣元素共有:', len(set(x))) return x df = pd.DataFrame({ 'user_id': [113401,378358,434838,577061], 'taglist': [ '4707|70|3498|4707|2099|1832|1911', '751|2207|1100|2099|1832|1911|70|2254|171', '877|3242|5628|70|2684|691|70|4228|631|70', '2431|3242|3242|1823|4020|3242|70|620|2168' ] }) # r的數據類型是series,key是df的index,values是分割‘|’後返回的list r = df['taglist'].map(lambda x: fenge(x)) # testdata是list,每一個元素也是list testdata = list(r) # dictionary中是將testdata中全部不一樣的標記tokens都取了出來放在一個list中 dictionary = corpora.Dictionary(testdata) # corpus中存放的是testdata中每一個元素在dictionary中的編號與出現次數 # corpus中的數據形式是[[(0, 1), (1, 1), (2, 1)], [(0, 1), (1, 1), (2, 1), (5, 1), (6, 1)],....... corpus = [dictionary.doc2bow(text) for text in testdata] # 輸出tfidf是TfidfModel(num_docs=4,num_nnz=31),其中num_docs表示的是處理了4個語句,num_nnz表示的是4個語句中共有31個不一樣的詞 tfidf = models.TfidfModel(corpus) # 此處計算得出語料庫corpus中全部句子的tf-idf值,這兒放其餘的語料庫可能也行 corpus_tfidf = tfidf[corpus] # LdaMulticore()參數解析官網連接:https://radimrehurek.com/gensim/models/ldamulticore.html # 參數解釋:corpus_tfidf:要訓練的語料庫 # num_topics:指定從要訓練的語料庫中要提取的主題數量 # id2word:與語料庫對應的字典 # chunksize:每次訓練的詞的數量 # passes:訓練中經過語料庫的次數,即訓練的次數 # minimum_probability:設置閾值,低於該閾值的主題將被捨棄掉 # workers:設置進程數,即用於並行化的工做進程的數量 # decay:一個介於(0.5,1)之間的數字,以表示在檢查每一個新文檔時忘記前面lambda值的百分比 # https://radimrehurek.com/gensim/models/ldamulticore.html lda = models.LdaMulticore(corpus_tfidf, num_topics=60, id2word=dictionary,chunksize=2000, passes=1, random_state=0, minimum_probability=0.005, workers=11) # print('lda is:', lda) # lda is: LdaModel(num_terms=23, num_topics=60, decay=0.5, chunksize=2000) # 保存模型 # lda.save('./model/' + 'lad.model') # 留給test集合用 # doc_topics直接輸出看不到內部的值 doc_topics = lda.get_document_topics(corpus_tfidf) print(np.array(doc_topics)) # # 顯示文檔主題doc_topics有3種方法: # doc_topic = [i for i in lda[corpus_tfidf]] ##法1 # print(doc_topic) # # for doc_topic in lda.get_document_topics(corpus_tfidf): ##法2 # print(doc_topic) # print(np.array(doc_topics)) ##法3 item = 'taglist' # 列名 # [print(cols) for cols in df.reset_index()['index'].apply(lambda x: getlda(doc_topics, x, 60, item))] # df.reset_index()['index'].apply(lambda x: getlda(doc_topics, x, 60, item)) # 是series類型,其中每一個values都是返回的dataframe,1行num_show_topic列 dfjoin = pd.concat([cols for cols in df.reset_index()['index'].apply(lambda x: getlda(doc_topics, x, 60, item))], ignore_index=True) print(dfjoin.shape) #(4, 60)
https://blog.csdn.net/sinat_26917383/article/details/71436563#gensimdoc2bow_209數組
https://radimrehurek.com/gensim/models/ldamulticore.htmlapp
https://blog.csdn.net/appleyuchi/article/details/78055371dom
https://blog.csdn.net/qq_23926575/article/details/79429689ide
https://radimrehurek.com/gensim/tut1.html#from-strings-to-vectors函數
http://www.pianshen.com/article/6714154086/spa