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環境でのテヌマ別モデリングの䟋を分析したす。

Source: https://habr.com/ru/post/J334668/


All Articles