BigARTMツールを使用した主題モデリング

はじめに



彼は、「GitHubのリポジトリのテーマモデリング」というタイトルの出版物の翻訳に注目しました[1]。 この出版物には、多くの理論データと非常によく説明されたトピック、概念、自然言語の使用、およびBigARTMモデルの他の多くのアプリケーションが含まれています。



ただし、テーマモデリングの分野の知識を持たない一般ユーザーにとっては、実用上、テキストソースデータを準備する際のインターフェイスの知識と明確な一連のアクションで十分です。



WindowsにBigARTMをインストールし、ソースデータを準備する



BigARTMのインストールについては、ビデオプレゼンテーション[2]で詳しく説明されているので、詳しくは説明しません。ドキュメントにリストされているプログラムは特定のバージョン用に設計されており、ダウンロードしたバージョンでは動作しない場合があります この記事ではversion_v 0.8.1を使用します。



BigARTMはPython 2.7でのみ動作します。 したがって、単一のソフトウェアパッケージを作成するために、すべての補助プログラムとサンプルはPython 2.7で記述されているため、コードが多少複雑になります。



テーマ別モデリングのテキストデータは、次の手順に従って処理する必要があります[4]。



  1. 語彙化またはステミング;
  2. ストップワードとまれなワードを削除します。
  3. 用語とフレーズの強調表示。


これらの要件をPythonで実装する方法を検討してください。



どちらを適用するのが良いか:見出し語化とステミングのどちらですか?



この質問に対する答えは、記事[5]のテキストの最初の段落を例として使用する次のリストから得られます。 以下、リストパーツとそれらの作業の結果は、jupyterノートブック環境の形式で表示されるときに表示されます。



lemmatizeによる補題リスト
# In[1]: #!/usr/bin/env python # coding: utf-8 # In[2]: text=u'        \         \          \         ' # In[3]: import time start = time.time() import pymystem3 mystem = pymystem3 . Mystem ( ) z=text.split() lem="" for i in range(0,len(z)): lem =lem + " "+ mystem. lemmatize (z[i])[0] stop = time.time() print u",  lemmatize- %f   %i  "%(stop - start,len(z))
      
      







ロボットの補題リストの結果。

実際には、新年の贈り物など、複数の選択肢を使用するときに日常生活で最適化する方法を解決するための問題がしばしばあります。購入の品質を設定するときに最小コストの問題を直感的に解決します


lemmatizeに費やした時間-33ワードを処理するのに56.763000



ステマーNLTKを使用したステミングリスト
 #In [4]: start = time.time() import nltk from nltk.stem import SnowballStemmer stemmer = SnowballStemmer('russian') stem=[stemmer.stem(w) for w in text.split()] stem= ' '.join(stem) stop = time.time() print u",  stemmer NLTK- %f   %i  "%(stop - start,len(z))
      
      







ロボットリストの結果:

実際には、問題が頻繁に発生します。たとえば、新年の贈り物など、通常の生活で最適化方法を使用して解決します。たとえば、購入の品質を設定する際の最小コストの問題を直感的に解決します


ステマーNLTK- 0.627000が33ワードの処理に費やした時間



Stemmerモジュールを使用したステミングリスト
 #In [5]: start = time.time() from Stemmer import Stemmer stemmer = Stemmer('russian') text = ' '.join( stemmer.stemWords( text.split() ) ) stop = time.time() print u",  Stemmer- %f   %i "%(stop - start,len(z))
      
      







ロボットリストの結果:

実際には、問題が頻繁に発生します。たとえば、新年の贈り物など、通常の生活で最適化方法を使用して解決します。たとえば、購入の品質を設定する際の最小コストの問題を直感的に解決します


Stemmer-0.093000が33ワードの処理に費やした時間



おわりに



テーマモデリング用のデータを準備する時間が重要でない場合は、pymystem3およびmystemモジュールを使用して補題を適用する必要があります。そうでない場合は、Stemmerモジュールを使用してステミングを適用する必要があります。



その後の削除のストップワードのリストはどこで入手できますか?



定義上、ストップワードは、意味的な負荷をもたらさない単語です。 そのような単語のリストは、テキストの詳細を考慮して作成する必要がありますが、根拠があるはずです。 ベースは茶色のハウジングを使用して入手できます。



ストップワード取得リスト
 #In [6]: import nltk from nltk.corpus import brown stop_words= nltk.corpus.stopwords.words('russian') stop_word=" " for i in stop_words: stop_word= stop_word+" "+i print stop_word
      
      







ロボットリストの結果:

そして、彼はそれがどのようにすべてかについて話していないという点で、はい、はい、あなたは私だけが欲しいのですが、今では彼はもういませんいつかまたあなたのためにありました、それからあなたは彼女自身のために何も持っていないので、多分彼らは私たち自身よりも私たちのために私たちのためにそれを必要とします。ほとんど私のものだったので、今、彼女は、なぜあなたのすべてが最終的に他の人について2人になることができるはずだったのに おそらくこの3つを除いて、この3つがあなたの前にいるのは良いことです。もちろん、これをもうできないなら、もちろんすべての間に


また、指定されたテキストに従って、ネットワークサービス[6]のストップワードのリストを取得することもできます。



おわりに



たとえば、茶色のケースなどのストップワードの基礎を最初に使用し、処理結果を分析した後、ストップワードのリストを変更または補足することが合理的です。



テキストから用語とngramを強調する方法は?



BigARTMプログラムを使用したテーマ別モデリングに関する出版物[7]では、次のように推奨しています。「コレクション内の見出し語化の後、n-gramを収集できます。 Bigramをメイン辞書に追加して、データにない特殊文字で単語を分離できます。





テキストからバイグラム、トライグラム、フォーグラム、ファイブグラムを強調するリストを提供します。

リストはPython 2.7.10に適合しており、テキストからバイグラム、トライグラム、4グラム、5グラムを抽出するように構成されています。「_」は特殊文字として使用されます。



バイグラム、トライグラム、フォーグラム、ファイブグラムを取得するためのリスト
 #In [6]: #!/usr/bin/env python # -*- coding: utf-8 -* from __future__ import unicode_literals import nltk from nltk import word_tokenize from nltk.util import ngrams from collections import Counter text = "          \           \           " #In [7]: token = nltk.word_tokenize(text) bigrams = ngrams(token,2) trigrams = ngrams(token,3) fourgrams = ngrams(token,4) fivegrams = ngrams(token,5) #In [8]: for k1, k2 in Counter(bigrams): print (k1+"_"+k2) #In [9]: for k1, k2,k3 in Counter(trigrams): print (k1+"_"+k2+"_"+k3) #In [10]: for k1, k2,k3,k4 in Counter(fourgrams): print (k1+"_"+k2+"_"+k3+"_"+k4) #In [11]: for k1, k2,k3,k4,k5 in Counter(fivegrams): print (k1+"_"+k2+"_"+k3+"_"+k4+"_"+k5)
      
      







ロボットリストの結果。 削減のため、各ngramから1つの値のみを指定します。



バイグラム-新年

トライグラム-given_purchase_quality

fourgrams-which_options_of_optimization methods_are used

fivegrams- cost_of_set_quality_purchase



おわりに



上記のプログラムを使用して、NGramをテキスト内で安定して繰り返し強調表示し、それぞれを1つの単語と見なすことができます。



テーマ別モデリング用のテキストデータを準備するプログラムには何を含める必要がありますか?



多くの場合、ドキュメントのコピーは個別のテキストファイルに1つずつ配置されます。 同時に、テーマモデリングのソースデータは、いわゆる「ワードバッグ」であり、特定のドキュメントに関連する単語は、タグ-|テキストの後の新しい行で始まります。



上記の要件を完全に実装しても、最も頻繁に使用される単語はドキュメントの内容を反映していない可能性が高いことに注意してください。

このような単語は、元のドキュメントのコピーから削除される場合があります。 この場合、ドキュメント内の単語の分布を制御する必要があります。



シミュレーションを高速化するために、各単語の後に、このドキュメントでの使用頻度がコロンで示されています。



プログラムをテストするための初期データは、10のウィキペディアの記事でした。 記事のタイトルは次のとおりです。



  1. 地理学
  2. 数学
  3. 生物学
  4. 天文学
  5. 物理学
  6. 化学
  7. オタク
  8. 物語
  9. 生理学
  10. コンピュータサイエンス


既製のテキストモデリングのリスト
 #In [12]: #!/usr/bin/env python # -*- coding: utf-8 -*- import matplotlib.pyplot as plt import codecs import os import nltk import numpy as np from nltk.corpus import brown stop_words= nltk.corpus.stopwords.words('russian') import pymystem3 mystem = pymystem3.Mystem() path='Texts_habrahabr' f=open('habrahabr.txt','a') x=[];y=[]; s=[] for i in range(1,len(os.listdir(path))+1): #      i filename=path+'/'+str(i)+".txt" text=" " with codecs.open(filename, encoding = 'UTF-8') as file_object:#     i-  for line in file_object: if len(line)!=0: text=text+" "+line word=nltk.word_tokenize(text)#   i-  word_ws=[w.lower() for w in word if w.isalpha() ]#    word_w=[w for w in word_ws if w not in stop_words ]#  lem = mystem . lemmatize ((" ").join(word_w))#  i -  lema=[w for w in lem if w.isalpha() and len(w)>1] freq=nltk.FreqDist(lema)#    i -    z=[]#      z=[(key+":"+str(val)) for key,val in freq.items() if val>1] #    :   f.write("|text" +" "+(" ").join(z).encode('utf-8')+'\n')#       |text c=[];d=[] for key,val in freq.items():#        i -  if val>1: c.append(val); d.append(key) a=[];b=[] for k in np.arange(0,len(c),1):#      i -  ind=c.index(max(c)); a.append(c[ind]) b.append(d[ind]); del c[ind]; del d[ind] x.append(i)#   y.append(len(a))#     a=a[0:10];b=b[0:10]# TOP-10   a   b  i -  y_pos = np.arange(1,len(a)+1,1)# TOP-10  performance =a plt.barh(y_pos, a) plt.yticks(y_pos, b) plt.xlabel(u' ') plt.title(u'    № %i'%i, size=12) plt.grid(True) plt.show() plt.title(u'   ', size=12) plt.xlabel(u' ', size=12) plt.ylabel(u' ', size=12) plt.bar(x,y, 1) plt.grid(True) plt.show() f.close()
      
      







補助図を生成するためのリスト操作の結果:削減するために、1つのドキュメントからのTOP-10の単語の1つの図と、ドキュメント全体での単語の分布の1つの図のみを持ちます。











プログラムの結果として、使用頻度に応じて10個の単語が選択された10個の図表が得られ、さらに、プログラムは文書全体の単語数の分布図を作成しました。 これは、ソースデータの予備分析に便利で、多数のドキュメントがある場合は、頻度図を別のフォルダーに保存できます。



「ワードバッグ」を生成するためのリスト操作の結果。削減するために、作成されたテキストファイルhabrahabr.txtからのデータを最初のドキュメントについてのみ引用します。

|地上のテキスト:3周り:2国:4買われ過ぎ:2人:2伝統:2建物:2外観:2いくつか:2名前:2最初:4作成:2検索:2ギリシャ語:3持っている:4形式:2 ii:2人が住んでいる:4含まれています:3川:4東:2海:6場所:2エラトステネス:3情報:2ルック:3ヘロドトス:3意味:4地図作成:2既知:2全体:2想像:2かなり: 2科学:4現代:2達成:2期間:2球:3定義:2前提:2表現:2表現:7構成:3表現:2ストロボメーター:3用語:2ラウンド:7使用:2海岸:2南:2座標:2土地:16専用:2リーチ:2マップ:7 規律:2子午線:2ディスク:2アリストテレス:4固有:2説明:6別:2地理的:12 it:2サラウンド:3アナキシマンダー:2名前:8その:2著者:2作曲:3古代:8後期: 4経験:2プトレマイオス:2地理:10時間:3仕事:2また:6回り道:3あなた:2アプローチ:2円:2洗浄:3地中海:2ギリシャ人:2中国:2世紀:6彼女:2海:3北:2側面:2時代:3内部:2フラット:2赤:2 arrianine:2 which:8その他:2使用:3 this:5 base:3 live:2


1つのテキストモダリティが使用され、各ドキュメントの先頭に|テキストとして示されています。 各単語の後に、テキストでの使用回数がコロンを介して入力されます。 後者は、バッチの作成と辞書の記入のプロセスを高速化します。



BigARTMとの連携を簡素化してトピックを作成および分析するにはどうすればよいですか?



これを行うには、まずテキストドキュメントを準備し、提案されたソフトウェアソリューションを使用して分析し、次にjupyterノートブック開発環境を使用します。







Notebookディレクトリには、プログラムが機能するために必要なすべてのフォルダーとファイルが含まれています。

プログラムコードの一部は個別のファイルでデバッグされ、デバッグ後、共通ファイルに収集されます。



提案されたテキストドキュメントの準備により、BigARTMの簡素化されたバージョンで、レギュラーとフィルターなしでテーマ別モデリングが可能になります。



バッチ作成のリスト
 #In [1]: #!/usr/bin/env python # -*- coding: utf-8 -* import artm #     batch batch_vectorizer = artm.BatchVectorizer(data_path='habrahabr.txt',#   " " data_format='vowpal_wabbit',#   target_folder='habrahabr', #     batch batch_size=10)#     batch
      
      









habrahabr.txtファイルから、habrahabフォルダー内のプログラムは10個のドキュメントのバッチを1つ作成し、その数は変数batch_size = 10で指定されます。 データが変更されず、周波数行列が既に作成されている場合、プログラムの上記の部分はスキップできます。



辞書を作成してモデルを作成するためのリスト
 #In [2]: batch_vectorizer = artm.BatchVectorizer(data_path='habrahabr',data_format='batches') dictionary = artm.Dictionary(data_path='habrahabr')#     model = artm.ARTM(num_topics=10, num_document_passes=10,#10    dictionary=dictionary, scores=[artm.TopTokensScore(name='top_tokens_score')]) model.fit_offline(batch_vectorizer=batch_vectorizer, num_collection_passes=10)#10    top_tokens = model.score_tracker['top_tokens_score']
      
      







データをディクショナリディクショナリにロードすると、BigARTMは10個のトピック(ドキュメントの数)を生成します。その数は変数num_topics = 10で指定されます。ドキュメントとコレクションを通過する回数は、変数num_document_passes = 10



トピックを作成および分析するためのリスト
 #In [3]: for topic_name in model.topic_names: print (topic_name) for (token, weight) in zip(top_tokens.last_tokens[topic_name], top_tokens.last_weights[topic_name]): print token, '-', round(weight,3)
      
      







BigARTMプログラムロボットの結果:

topic_0

植物-0.088

植物学-0.032

世紀-0.022

ワールド-0.022

リニー-0.022

年-0.019

0.019

開発-0.019

アリストテレス-0.019

自然-0.019

topic_1

天文学-0.064

天国-0.051

本体-0.046

タスク-0.022

ムーブメント-0.018

勉強する-0.016

方法-0.015

スター-0.015

システム-0.015

0.014

topic_2

土地-0.049

地理的-0.037

地理学-0.031

古代-0.025

0.025

名前-0.025

パフォーマンス-0.022

ラウンド-0.022

マップ-0.022

また-0.019

topic_3

物理学-0.037

物理的-0.036

現象-0.027

理論-0.022

0.022

法律-0.022

合計-0.019

新規-0.017

ベース-0.017

科学-0.017

topic_4

勉強する-0.071

合計-0.068

セクション-0.065

理論的-0.062

物質-0.047

可視-0.047

物理的-0.044

ムーブメント-0.035

仮説-0.034

規則性-0.031

topic_5

生理学-0.069

甲状腺-0.037

人-0.034

生物-​​0.032

アーマー-0.03

動脈-0.025

鉄-0.023

セル-0.021

勉強する-0.021

バイタルアクティビティ-0.018

topic_6

数学-0.038

セル-0.022

科学-0.021

生物-​​0.02

合計-0.02

0.018です

数学-0.017

ライブ-0.017

オブジェクト-0.016

遺伝子-0.015

topic_7

履歴-0.079

履歴-0.041

単語-0.033

イベント-0.03

科学-0.023

0.023

ソース-0.018

歴史学-0.018

研究-0.015

哲学-0.015

topic_8

期間-0.055

コンピューターサイエンス-0.05

科学-0.031

言語-0.029

年-0.029

科学-0.024

情報-0.022

計算-0.017

名前-0.017

科学-0.014

topic_9

世紀-0.022

0.022

科学-0.019

化学薬品-0.019

物質-0.019

化学-0.019

また-0.017

開発-0.017

時間-0.017

要素-0.017


得られた結果は一般にトピックに対応しており、シミュレーション結果は満足できるものとみなすことができます。 必要に応じて、レギュラーとフィルターをプログラムに追加できます。



作業結果に関する結論



テーマ別モデリングのためにテキスト文書を準備するすべての段階を調査しました。 特定の例を使用して、レンマ化とステミングのモジュールの単純な比較分析を実施しました。 NLTKを使用してストップワードのリストを取得し、ロシア語のフレーズを検索する可能性を検討しました。 リストはPython 2.7.10で記述され、ロシア語に適合しているため、単一のプログラム複合体に統合できます。 BigARTMを操作するための追加機能を提供するjupyter-notebook環境でのテーマ別モデリングの例を分析します。



使用済みリンク
1. GitHubのリポジトリのテーマモデリング

2. 講義49-WindowsでのBigARTMのインストール

3.bigartm / bigartm

4. ワープロの基礎。

5. Pythonを使用して線形計画問題を解決します。

6. 新しい検証アルゴリズムをテストしています。 質問と提案。

7. テーマ別モデリングBigARTMにライブラリを使用します。




All Articles