2016-08-09 8 views
0

私は危機の期間を特定するためにニューススニペットを分析しようとしています。 これを行うには、私はすでに過去7年間にニュース記事をダウンロードし、利用可能にしています。 今、このデータセットにLDA(Latent Dirichlet Allocation)モデルを適用して、経済危機の兆候を示す国を特定します。私はヨルダンバーバーのブログ記事(https://rstudio-pubs-static.s3.amazonaws.com/79360_850b2a69980c4488b1db95987a24867a.html)に私のコードを基づかいLDAモデルでの「良い」/「悪い」ケースの規定(Pythonでgensimを使用)

- ここでは、これまでの私のコードです:

import os, csv 

#create list with text blocks in rows, based on csv file 
list=[] 

with open('Testfile.csv', 'r') as csvfile: 
    emails = csv.reader(csvfile) 
    for row in emails: 
     list.append(row) 

#create doc_set 
doc_set=[] 

for row in list: 
    doc_set.append(row[0]) 

#import plugins - need to install gensim and stop_words manually for fresh python install 
from nltk.tokenize import RegexpTokenizer 
from stop_words import get_stop_words 
from nltk.stem.porter import PorterStemmer 
from gensim import corpora, models 
import gensim 

tokenizer = RegexpTokenizer(r'\w+') 

# create English stop words list 
en_stop = get_stop_words('en') 

# Create p_stemmer of class PorterStemmer 
p_stemmer = PorterStemmer() 


# list for tokenized documents in loop 
texts = [] 

# loop through document list 
for i in doc_set: 

    # clean and tokenize document string 
    raw = i.lower() 
    tokens = tokenizer.tokenize(raw) 

    # remove stop words from tokens 
    stopped_tokens = [i for i in tokens if not i in en_stop] 

    # stem tokens 
    stemmed_tokens = [p_stemmer.stem(i) for i in stopped_tokens] 

    # add tokens to list 
    texts.append(stemmed_tokens) 


# turn our tokenized documents into a id <-> term dictionary 
dictionary = corpora.Dictionary(texts) 

# convert tokenized documents into a document-term matrix 
corpus = [dictionary.doc2bow(text) for text in texts] 

# generate LDA model 
ldamodel = gensim.models.ldamodel.LdaModel(corpus, num_topics=5, id2word = dictionary, passes=10) 

print(ldamodel.print_topics(num_topics=5, num_words=5)) 

# map topics to documents 
doc_lda=ldamodel[corpus] 

with open('doc_lda.csv', 'w') as outfile: 
    writer = csv.writer(outfile) 
    for row in doc_lda: 
     writer.writerow(row) 

基本的に、私は上記のコードでトピックの数(5を識別 - にチェックする)、最後の行を使用して、各ニュース記事にこれらのトピックの1つに関連する記事の確率を示すスコアを割り当てます。 ここでは、トピックが危機に関連しているかどうかを質的に評価することができますが、それは少し残念です。 私はずっとやりたいことは、危機の間に記事が公開されたかどうかをアルゴリズムに伝え、この「追加情報」を使って自分の「危機年」と「危機以外の年」の両方のトピックを特定し、 。私のデータセットを単に分割するだけで、私の「悪い」(すなわち、危機の年のみ)のトピックは私の意見では機能しません。実際にはどのトピックが実際に危機に関連するかを手動で選択する必要があります。とにかく(スポーツニュース、...)。

したがって、「危機」と「非危機」の情報を組み込み、b)最適な数のトピック/単語を自動的に選択して、モデル?

ありがとうございます!

+0

これはSOに完全に適切ではありませんそれはデータ分析の質問というほどプログラミングに関する質問ではないので、どこに適しているか分かりません... – drevicko

答えて

0

まずあなたの特定の質問にいくつかの提案:

a)は、標準的なLDAモデルでこれを行うには、「非危機」

対「危機」の情報を取り入れ、私はおそらく、docのトピックの比率と、ドキュメントが危機/非危機の期間にあるかどうかの相互情報を求めています。

b)に自動的にモデルの予測力を最適化するトピック/単語の最適な数を選択しましたか?

これを正しく実行するには、トピック数の設定を多数行い、保持されているドキュメント(トピックモデルに含まれていないドキュメント)の競合/非競合を予測するためにトピックモデルを使用してください。

トピック数(「ノンパラメトリック」モデル)を効果的に選択する多くのトピックモデルがあります。ハイパーパラメータの最適化を使用したMalletの実装では、同じことが効果的に行われることがわかりましたので、使用することをお勧めします(ハイパーパラメータオプティマイゼーションでは多くのトピックが作成されます)。

そして、いくつかの一般的なコメント:

多くのトピックモデルがありますがそこバリアント、および時間を取り入れ、その特定の少数。これらはあなたのための良い選択かもしれません(標準的なLDAよりも時間の経過とともにトピックの変化をよりよく解決するでしょう - 標準的なLDAは良い出発点です)。私は特に好き

1つのモデルは、(より良いディリクレよりジップ分散単語に一致する)ピットマン・ヨールワード事前確率を使用トピックのバースト性を考慮し、ジャンクトピックに関する手がかりを提供する:https://github.com/wbuntine/topic-models

関連する問題