2016-08-09 22 views
0

위기 기간을 식별하기 위해 뉴스 스 니펫을 분석하려고합니다. 그렇게하기 위해, 나는 지난 7 년 동안 이미 뉴스 기사를 다운로드하여 제공했습니다. 이제이 데이터 세트에 LDA (Latent Dirichlet Allocation) 모델을 적용하여 경제 위기의 징후를 보이는 국가를 확인합니다. 나는 요르단 이발사에 의해 블로그 포스트 (https://rstudio-pubs-static.s3.amazonaws.com/79360_850b2a69980c4488b1db95987a24867a.html)에 내 코드를 기반으로 작성LDA 모델의 "Good /"Bad "사례 규정 (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 식별 -에 확인), 마지막 줄을 사용하여 각 뉴스 기사에 이러한 주제 중 하나와 관련된 기사의 확률을 나타내는 점수를 지정합니다. 이제는 주어진 주제가 위기와 관련이 있는지 여부를 조금씩 수동으로 만 질의 할 수 있습니다. 이는 약간 불행한 일입니다. 내가하고 싶은 일은 위기 상황에서 기사가 게시되었는지 여부를 알고리즘에 알리고이 추가 정보를 사용하여 내 "위기 년"과 "비 위기 년"에 대한 두 가지 주제를 모두 식별하는 것입니다. . 내 데이터 세트를 단순히 분할하여 내 "나쁜"(즉, 위기 년만) 주제를 내 의견으로는 생각하지 않을 것입니다. 실제로 어떤 주제가 실제로 위기와 관련이 있으며 수동으로 어떤 주제가 표시 될지 선택해야합니다. 어쨌든 (스포츠 뉴스, ...).

따라서 "위기"대 "비 위기"정보를 통합하고 b) 최적의 주제/단어 수를 자동으로 선택하여 코드의 예측력을 최적화하는 코드가 있습니다. 모델?

미리 감사드립니다. 특정 질문에 대한 몇 가지 제안을 먼저

+0

이 SO에 완전히 적합하지 않습니다 , 데이터 분석 질문과 같이 프로그래밍 문제가 아니기 때문에 어디에서 더 잘 맞는지는 잘 모르겠지만 ... – drevicko

답변

0

:

A) "비 위기"대 "위기"의 정보를 통합

표준 LDA 모델이 작업을 수행하기 위해, 아마도 doc topic 비율과 docs가 위기/비 위기 기간에 있는지에 대한 상호 정보를 얻을 것입니다.

b) 자동으로 최적의 주제/단어 수를 선택하여 모델의 예측 능력을 최적화 할 수 있습니까?

이 작업을 올바르게하려면 많은 수의 항목 설정을 시험해보고 항목 모델을 사용하여 보류 된 문서 (주제 모델에 포함되지 않은 문서)의 충돌/비 상충을 예측하십시오.

효과적으로 주제 수를 선택하는 많은 주제 모델 변형이 있습니다 ("비모수 모델"모델). 하이퍼 매개 변수 최적화를 사용하는 Mallet 구현은 효과적으로 동일하므로 하이퍼 매개 변수 optimisaiton은 할당 된 단어가 거의없는 많은 항목으로이 주제를 사용하는 것이 좋습니다. 이러한 항목은 잡음뿐입니다.

그리고 일반적인 코멘트 :

많은 주제 모델은 거기 변형, 시간을 통합 특정 몇 가지에있다. 표준 LDA가 좋은 출발점이기는하지만 표준 LDA보다 시간이 지남에 따라 주제 변경을 더 잘 해결할 수 있기 때문에 이러한 옵션이 좋은 선택 일 수 있습니다.내가 특히 좋아하는

한 모델은 (더 나은 디리클레보다 더 이는 Zipf 분산 단어를 일치) 갱부-을 yor 단어 전과 사용 항목에 버스 티 니스를 차지하고 정크 주제에 대한 단서를 제공 https://github.com/wbuntine/topic-models