LDA提取信息

文本主題模型提取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)
View Code

 

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

相關文章
相關標籤/搜索