무회blog

python: 200607- python 토픽추출 , nltk, tomoto, test->for_topics-004 본문

Python

python: 200607- python 토픽추출 , nltk, tomoto, test->for_topics-004

최무회 2020. 6. 7. 04:37

tomotopy API documentation.docx
0.61MB
tomotopy API documentation.pdf
1.09MB
cankaoshu001.xlsx
0.02MB
newsSogBo_test003_001.txt
0.00MB

 

for_topics-004
# %pip install tomotopy
# %pip install nltk
# nltk.download()
# %pip install --upgrade kiwipiepy  #  한국어 전처리 
# %pip install KoNLP
import tomotopy as tp 
import nltk.stem, nltk.corpus, nltk.tokenize, re
from kiwipiepy import Kiwi

# model = tp.LDAModel(k=20) 
model = tp.LDAModel(k=20, alpha=0.1, eta=0.01, min_cf=5)  # k 토픽 개수 
for i, line in enumerate(open('./corpos/newsSogBo_test003_001.txt')):# 파일 불러오기 , 한줄씩 읽어와서 모델에 추가 
    model.add_doc(line.strip().split()) # 공백 기준으로 단어를 나누어 model에 추가합니다.
    if i % 10 == 0: print('Document #{} has been loaded'.format(i))
############################ # #  영어 전처리 
# # model = tp.LDAModel(k=20, alpha=0.1, eta=0.01, min_cf=5)
# # for i, line in enumerate(open('./corpos/newsSogBo_test003_001.txt')):
# #     model.add_doc(tokenize(line)) # tokenize함수를 이용해 전처리한 결과를 add_doc에 넣습니다.
# #     if i % 10 == 0: print('Document #{} has been loaded'.format(i))
# # model.train(0)
# # print('Total docs:', len(model.docs))
# # print('Total words:', model.num_words)
# # print('Vocab size:', model.num_vocabs)

# # for i in range(200):
# #     print('Iteration {}\tLL per word: {}'.format(i, model.ll_per_word))
# #     model.train(1)
# # for i in range(model.k):
# #     res = model.get_topic_words(i, top_n=10)
# #     print('Topic #{}'.format(i), end='\t')
# #     print(', '.join(w for w, p in res))


# # tokenize 처리 
# model = tp.LDAModel(k=20, alpha=0.1, eta=0.01, min_cf=5)
# for i, line in enumerate(open('./corpos/newsSogBo_test003_001.txt')):
#     model.add_doc(tokenize(line)) # tokenize함수를 이용해 전처리한 결과를 add_doc에 넣습니다.
#     if i % 10 == 0: print('Document #{} has been loaded'.format(i))
        
# model.train(0)
# print('Total docs:', len(model.docs))
# print('Total words:', model.num_words)
# print('Vocab size:', model.num_vocabs) 

######################## # # #  한국어 전처리 
kiwi = Kiwi()
kiwi.prepare()

stemmer = nltk.stem.porter.PorterStemmer() 
stopwords = set(nltk.corpus.stopwords.words('korean')) 
# stopwords = set(["사람", "것"])
    
# (추가) 불용어를 지정하여 제거하고 싶은경우 아래와 같이 조건을 하나 더 추가할 수도 있겠습니다.    
# tokenize 함수를 정의합니다. 한국어 문장을 입력하면 형태소 단위로 분리하고, 
# 불용어 및 특수 문자 등을 제거한 뒤, list로 반환합니다.
def tokenize(sent):
    res, score = kiwi.analyze(sent)[0] # 첫번째 결과를 사용
    return [word + ('다' if tag.startswith('V') else '') # 동사에는 '다'를 붙여줌
            for word, tag, _, _ in res
            if not tag.startswith('E') and not tag.startswith('J') and not tag.startswith('S') and word not in stopwords] # 조사, 어미, 특수기호 및 stopwords에 포함된 단어는 제거

###########################
# 불용어 제거가 어려운 경우, 용어 가중치를 변경하자
# model = tp.LDAModel(k=20, alpha=0.2, eta=0.01, min_cf=5, tw=tp.TermWeight.IDF)
# tw에 tp.TermWeight의 항목 중 하나를 선택하여 입력할 수 있습니다.
# 기본값은 tp.TermWeight.ONE이며, 이는 모든 단어를 동등하게 보겠다는 것입니다.
# 다른 선택지로는 tp.TermWeight.IDF나 tp.TermWeight.PMI가 있습니다.
###########################
# tokenize 처리 
# model = tp.LDAModel(k=20, alpha=0.1, eta=0.01, min_cf=5)
model = tp.LDAModel(k=10, alpha=0.1, eta=0.01, min_cf=5)
for i, line in enumerate(open('./corpos/newsSogBo_test003_001.txt')):
    model.add_doc(tokenize(line)) # tokenize함수를 이용해 전처리한 결과를 add_doc에 넣습니다.
    if i % 10 == 0: print('Document #{} has been loaded'.format(i))
    
# # 혹은 단순히 model.train(200)으로 200회 반복도 가능합니다.
# for i in range(200):
#     print('Iteration {}\tLL per word: {}'.format(i, model.ll_per_word))
#     model.train(1)

model.train(200)
for i in range(model.k):
    res = model.get_topic_words(i, top_n=10)
    print('Topic #{}'.format(i), end='\t')
    print(', '.join(w for w, p in res))
    

 

 

Comments