はじめに
彼は、「GitHubのリポジトリのテーマモデリング」というタイトルの出版物の翻訳に注目しました[1]。 この出版物には、多くの理論データと非常によく説明されたトピック、概念、自然言語の使用、およびBigARTMモデルの他の多くのアプリケーションが含まれています。
ただし、テーマモデリングの分野の知識を持たない一般ユーザーにとっては、実用上、テキストソースデータを準備する際のインターフェイスの知識と明確な一連のアクションで十分です。
WindowsにBigARTMをインストールし、ソースデータを準備する
BigARTMのインストールについては、ビデオプレゼンテーション[2]で詳しく説明されているので、詳しくは説明しません。ドキュメントにリストされているプログラムは特定のバージョン用に設計されており、ダウンロードしたバージョンでは動作しない場合があります この記事ではversion_v 0.8.1を使用します。
BigARTMはPython 2.7でのみ動作します。 したがって、単一のソフトウェアパッケージを作成するために、すべての補助プログラムとサンプルはPython 2.7で記述されているため、コードが多少複雑になります。
テーマ別モデリングのテキストデータは、次の手順に従って処理する必要があります[4]。
- 語彙化またはステミング;
- ストップワードとまれなワードを削除します。
- 用語とフレーズの強調表示。
これらの要件を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をメイン辞書に追加して、データにない特殊文字で単語を分離できます。
- Russian_message
- Ukrainian_native;
- send_catch;
- ロシアの病院。
テキストからバイグラム、トライグラム、フォーグラム、ファイブグラムを強調するリストを提供します。
リストは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のウィキペディアの記事でした。 記事のタイトルは次のとおりです。
- 地理学
- 数学
- 生物学
- 天文学
- 物理学
- 化学
- オタク
- 物語
- 生理学
- コンピュータサイエンス
既製のテキストモデリングのリスト
#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環境でのテーマ別モデリングの例を分析します。