파이썬의 Gensim 라이브러리를 이용해서 토픽을 추출하는 프로젝트를 진행했다.
처음으로 파이썬으로 개발을 진행한 프로젝트라 기록을 남겨둔다.
데이터
1
2
3
4
1. 상품 및 유형 데이터 (2x3)
2. 하루 치 상담 데이터 (상품 및 유형 정보 포함)
3. 중복제거 된 상담사 데이터
4. 한국 지역 및 장소,지명 데이터
위의 데이터로 각 상품 & 유형 별 상위 10개의 토픽을 뽑아야 했다.
라이브러리
1
2
3
4
- gensim : 자연어 처리 모듈
- mecab : 형태소 분석기
- pyhive : python <-> hive
- pandas
프로세스
Hive Data Load -> 데이터 중복 제거 -> 불용어 처리 -> 단어사전 생성 -> LDA 토픽 모델링 -> 결과 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# Hive Connection
conn = hive.Connection(host='호스트명', port=포트번호, username='유저명', password='패스워드', database='데이터베이스명', auth='CUSTOM')
cur = conn.cursor()
# 상품 Data Load
product_sql = "SELECT product1_cd, product2_cd, type1_cd, type2_cd, type3_cd \
FROM product_table \
GROUP BY product1_cd, product2_cd, type1_cd, type2_cd, type3_cd"
# 타겟 Data Load
data_sql = "SELECT seq, product1_cd, product2_cd, type1_cd, type2_cd, type3_cd, memo \
FROM data_table "
# Hive Query Data -> Pandas DataFrame
product_df = pd.read_sql(product_sql, conn)
df = pd.read_sql(data_sql, conn)
# 중복제거
df = df.drop_duplicates(['seq', 'memo'])
# 불용어 로드
stopword_df = pd.read_sql("SELECT * FROM stopwords", conn)
sw_list = stopword_df.iloc[:, 0].tolist()
stop_words = STOPWORDS.union(set(sw_list))
# DataFrame -> List (불용어 처리)
mecab = Mecab(dicpath="/data/mecab/mecab_dic")
keyword_list = [line.split(" ") for line in df['memo'].apply(lambda x: ' '.join([word for word in mecab.nousAlpha(x) if not word in (stop_words)]))]
# 단어사전 생성
dic = corpora.Dictionary(keyword_list)
# 10회 미만 단어 제외
dic.filter_extremes(no_below = 10)
dic.save('ko.dict')
# 튜플 생성
tf = [dic.doc2bow(text) for text in keyword_list]
# TF-IDF로 corpus를 변환하여 단어 빈도별 Vector 가중치 계산
tfidf_model = models.TfidfModel(tf_ko)
tfidf = tfidf_model[tf]
# copora corpus serialize
corpora.MmCorpus.serialize('ko.mm', tfidf)
# LDA Topic Modeling
lda = LdaModel(corpus=tfidf, id2word=dic, chunksize=20000, num_topics=10, passes=20, iterations=500)
model = lda.show_topics(num_topics=10, num_words=5, formatted=False)
print model
출력된 model 데이터 기준으로 파일이나 DB에 저장하면 끝이다.
단순히 라이브러리를 이용해서 토픽을 추출해본거라 실제 추출된 토픽의 정확도 및 응집도? 등은 모르겠다.
LDA 모델링 시 파라미터 값을 조정해서 c_v 값이나 u_mass 값을 가져오는 것이 있긴 하다.
1
2
3
4
5
6
lda = LdaModel(corpus=tfidf, id2word=dic, chunksize=20000, num_topics=10, passes=20, iterations=500)
cm1 = CoherenceModel(model=m, texts=keyword_list, dictionary=dic, coherence='c_v')
cm2 = CoherenceModel(model=m, texts=keyword_list, dictionary=dic, coherence='u_mass')
print("c_v ::: " + str(cm1.get_coherence()) + "\n" + "u_mass ::: " + str(cm2.get_coherence()))
위와 같이 값을 출력할 수 있긴 하지만, 계산 및 산출법은 내 분야가 아니라 모르겠다.