[Python] LDAモデル中国語テキストトピック抽出丨視覚化ツールpyLDAvisの使用

トピックモデルLDAとその視覚化pyLDAvisの実現

  1. ドキュメントトピックの教師なし抽出-LDAモデル
    1.1準備作業
    1.2api実装モデルの呼び出し
  2. LDAの視覚的インタラクティブ分析
    -pyLDAvis2.1 pyLDAvis
    2.2のインストールgensimを組み合わせてapiを呼び出し、視覚化を実現し
    ますps結果を独立したWebページとして保存します
    pps準備をスピードアップしますか?
    2.3 pyLDAvis
    2.3.1の視覚化結果を分析する方法各トピックはどういう意味ですか?
    2.3.2各トピックはどのくらい一般的ですか?
    2.3.3トピック間の関係は何ですか?
  3. ドキュメントトピックの教師なし抽出-LDAモデル
    このモデルの具体的な紹介、アプリケーションシナリオなどについては説明しません。一連のテキストからフィードバックを取得して、指定した数のトピッククラスターを提供できることをご存知でしょう。

教師なしアルゴリズムであるため、トレーニングセットを準備する必要がなく、ハードラベリングを行う必要もありません。データ準備フェーズのタスクの少なくとも半分が保存されます。

私は数学の初心者として、必要な場合を除いて、特定の原則に立ち入ることを常に嫌がっています。誰かがそれが実行可能であると証明する限り、私はそれを使用します。スマートヘッドを最大限に活用する必要があります(笑)

でも、これからは逃げられないかもしれませんし、原理を学ばなくてはいけないので、まずここに原理の説明を入れて、後で必要なときに読んでください。

したがって、この記事では主に、開始方法と結果の分析方法を紹介します。これは、データサイエンティストが行うべきことです。

1.ドキュメントトピックの教師なし抽出-LDAモデル

1.1準備

本は本編に戻ります。この作業を例にとると、500ユーザーの1人あたり50 Weiboページ、約500 * 50 * 10 = 250,000Weiboテキストのテーマを分析する必要があります。言い換えれば、これらの人々のマイクロブログが主に何を懸念しているのか、そして彼らが一緒にどのような側面を懸念しているのかを見たいのです。

プログラミング環境:
python 3.6 + pycharm 2018、
LDA実装に使用されるパッケージはgensimで
あり、セグメンテーションという単語は今でも私たちの旧友のjiebaです。

データの準備:
クロールされた元のデータはcsvに保存されます。私が欲しいのは、すべてのWeiboテキストをtxtに読み取り、単語を分割して単語を停止することです。これにより、gensimの入力標準に適合します。

単語セグメンテーション前:単語セグメンテーション
ここに画像の説明を挿入します
後:
ここに画像の説明を挿入します
[コード]
元のテキストを処理するために使用されます。

def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
    return stopwords

# 对句子进行分词
def seg_sentence(sentence):
    sentence = re.sub(u'[0-9\.]+', u'', sentence)
    jb.add_word('光线摄影学院')		# 这里是加入用户自定义的词来补充jieba词典。
    jb.add_word('曾兰老师')			# 同样,如果你想删除哪个特定的未登录词,就先把它加上然后放进停用词表里。
    jb.add_word('网页链接')
    jb.add_word('微博视频')
    jb.add_word('发布了头条文章')
    jb.add_word('青春有你')
    jb.add_word('青你')
    sentence_seged = jb.cut(sentence.strip())
    stopwords = stopwordslist('stopWords/stopwords.txt')  # 这里加载停用词的路径
    outstr = ''
    for word in sentence_seged:
        if word not in stopwords and word.__len__()>1:
            if word != '\t':
                outstr += word
                outstr += " "
    return outstr


inputs = open('input/like_mi10_user_all_retweet.txt', 'r', encoding='utf-8')

outputs = open('output1/mi10_user_retweet_fc.txt', 'w',encoding='utf-8')
for line in inputs:
    line_seg = seg_sentence(line)  # 这里的返回值是字符串
    outputs.write(line_seg + '\n')
outputs.close()
inputs.close()

1.2API実装モデルの呼び出し

データを2時間準備し、インターフェイスを3分間呼び出し、結果を2時間待ちます。

Gensimはとてもフレンドリーで、辞書、bag-of-wordsモデル、ldaモデルはすべて1つの文で実行されます。

【コード】

from gensim import corpora
from gensim.models import LdaModel
from gensim.corpora import Dictionary


train = []

fp = codecs.open('output1/mi10_user_retweet_fc.txt','r',encoding='utf8')
for line in fp:
    if line != '':
        line = line.split()
        train.append([w for w in line])

dictionary = corpora.Dictionary(train)

corpus = [dictionary.doc2bow(text) for text in train]

lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=20, passes=60)
# num_topics:主题数目
# passes:训练伦次
# num_words:每个主题下输出的term的数目

for topic in lda.print_topics(num_words = 20):
    termNumber = topic[0]
    print(topic[0], ':', sep='')
    listOfTerms = topic[1].split('+')
    for term in listOfTerms:
        listItems = term.split('*')
        print('  ', listItems[1], '(', listItems[0], ')', sep='')

最終的な出力は

0:
  "北京" (0.024)
  "疫情" ( 0.021)
  "中国联通" ( 0.019)
  "领券" ( 0.019)
  "购物" ( 0.016)
  "新冠" ( 0.016)
  "专享" ( 0.012)
  "元券" ( 0.012)
  "确诊" ( 0.012)
  "上海" ( 0.011)
  "优惠" ( 0.011)
  "肺炎" ( 0.010)
  "新闻" ( 0.010)
  "病例" ( 0.010)
  "汽车"( 0.009)
1:
  "小米" (0.133)
  "Redmi" ( 0.019)
  "新浪" ( 0.019)
  "智慧" ( 0.018)
  "雷军" ( 0.014)
  "众测" ( 0.012)
  "体验" ( 0.012)
  "智能" ( 0.012)
  "MIUI" ( 0.012)
  "电视" ( 0.012)
  "红米" ( 0.011)
  "空调" ( 0.009)
  "产品" ( 0.009)
  "品牌" ( 0.009)
  "价格"( 0.008)
2:
  "抽奖" (0.056)
  "平台" ( 0.032)
  "评测" ( 0.022)
  "生活" ( 0.013)
  "红包" ( 0.013)
  "关注" ( 0.012)
  "这条" ( 0.012)
  "视频" ( 0.012)
  "工具" ( 0.011)
  "获得" ( 0.011)
  "有效" ( 0.011)
  "进行" ( 0.010)
  "恭喜" ( 0.010)
  "用户" ( 0.010)
  "公正"( 0.010)
 .....

この種の。彼は、指定されたトピック数の下にある単語の数だけを返します。各単語の後の小数は、その単語がトピックに属する確率と見なすことができます。トピックの下にあるすべての単語の確率の合計は1です。トピックはどうあるべきかそれは後であなたの手動分析によって定義されます。

次に、この冷たい単語と数字の山を見つめて、この単語とこのトピックの関係を確率で測定できるかもしれませんが、異なるトピック間の関係を確認できますか?単語と他のトピックとの関係がわかりますか?

少し難しい。今回は、LDAビジュアル分析ツールをご紹介します。

2.LDAの視覚的インタラクティブ分析-pyLDAvis

最初のレンダリング:
ここに画像の説明を挿入します

2.1pyLDAvisをインストールします

pip install pyldavis

2.2 gensimを組み合わせてapiを呼び出し、視覚化を実現します

pyLDAvisは、sklearn、gensim、graphlabの3つのパッケージでldaモデルの直接入力をサポートしており、自分で計算できるようです。もちろん、gensimによって得られたldaモデルは上記に直接従います。
pyLDAvisも非常にフレンドリーで、同じ文で実装を完了します。

import pyLDAvis.gensim

'''插入之前的代码片段'''

d=pyLDAvis.gensim.prepare(lda, corpus, dictionary)

'''
lda: 计算好的话题模型

corpus: 文档词频矩阵

dictionary: 词语空间
'''

pyLDAvis.show(d)		#展示在浏览器
# pyLDAvis.displace(d) #展示在notebook的output cell中

データ量が多く、実行時間が少し長くなります。

psは結果を独立したWebページとして保存します

同時に、この結果を別のWebページとして保存して、共有したりWebシステムに配置したりできるようにする場合は、これを行うことができます。

d=pyLDAvis.gensim.prepare(lda, corpus, dictionary)

pyLDAvis.save_html(d, 'lda_pass10.html')	# 将结果保存为该html文件

毎回結果を実行するために長い間待つ必要はありません。

準備をスピードアップするためのpps?

はい、この視覚化プロセスは本当に遅いです。私は時々使用しました。テスト中の時間を節約するために、gensimは58秒かかる1回のトレーニングのみを行い、pyLDAvisのレンダリングを待ちます。1時間以上待ったことがありますか?4200年代…ついに登場。
その後、すぐにWebページとして保存します。
ここに画像の説明を挿入します

d=pyLDAvis.gensim.prepare(lda, corpus, dictionary, mds='mmds')

ソースパープル。
実際にテストしたところ、効果はないと言えます。

同時に、この選択アルゴリズムのパラメーターもtsneにすることができます。異なるアルゴリズムの違いは、ドキュメントを参照することです。

2.3pyLDAvisの視覚化結果を分析する方法

出てきたページは複雑で複雑ではありません。左側のバブル分布はさまざまなトピックであり、右側はトピックの最初の30の特徴語です。水色はドキュメント全体の単語の頻度(重み)を表し、濃い赤色はトピックの単語の重みを表します。右上隅のパラメータλを調整してから、下を見ることができます。
ここに画像の説明を挿入します
したがって、LDAvisの作成者がこのツールを開発する際に解決しなければならない3つの質問に最終的に答えます。

2.3.1。各トピックはどういう意味ですか?

左側のバブルにマウスを合わせると、特定のトピックを表示するように選択できます。選択後、右側のパネルにこのトピックに関連する語彙が表示されます。これらの単語の意味を要約することで、トピックの意味を結論付けることができます。

同時に、どの単語がトピックに大きな重みを持っていますか?特定の単語トピックの関連性は、λパラメーターによって調整されます。

如果λ接近1,那么在该主题下更频繁出现的词,跟主题更相关;
如果λ越接近0,那么该主题下更特殊、更独有(exclusive)的词,跟主题更相关(有点TF-IDF的意思了)。

したがって、λのサイズを調整することで単語やトピックの関連性を変更し、トピックの意味のより多くの意味を探ることができます。

2.3.2各トピックはどのくらい一般的ですか?

トピックモデリングを実行すると、各トピックの頻度を知ることができます。LDAvisの作者は、この数字を表すために円のサイズを使用し、順番に1〜nのラベルも付けられています。したがって、バブルのサイズと数は、テーマの頻度を示します。
ここに画像の説明を挿入します

2.3.3トピック間の関係は何ですか?

ここで、著者は多次元尺度構成法を使用して主成分を次元として抽出し、トピックをこれらの2つの次元に分散します。トピック間の距離は、トピック間の近接性を表します。バブル距離はJSD距離を使用します。これは、トピック間の差異の程度と見なすことができます。バブルの重なりは、2つのトピックの特徴語が重なっていることを示します。

これらを知った後、話す言葉を読んでください。これらの言葉が何を言っているのかを見て、さまざまなトピックを抽出します。これは、実用的なアプリケーションの価値の結果です。最終的な出力がない場合、以前に行ったことはすべて古紙です。

理論的なレベルは別として、ここで最初に結論を出しましょう。それで十分なはずです。

おすすめ

転載: blog.csdn.net/kz_java/article/details/114982528