728x90
반응형

 

 

어제 공부했던 textrank 로 했을 때, 결과값이 만족스럽지 않아서 다른걸 찾아보기로 했다. 

결과값이 만족스럽지 않다는거는 단어 추출은 잘되는데, 연관된 단어일 경우 분리되서 나와서

하나의 단어로는 그렇게 데이터로써 큰 가치가 없었다.

예를 들면 내가 원하는거는 "성과 창출" 인데 실제로 textrank 를 돌려서 나온값은 "성과" "창출" 

각각의 단어로 나오니까 하나의 단어로는 데이터로써 효용가치가 별로 없었다.

 

그래서 다른 좋은게 있는지 찾아보던중 , NetworkX 를 발견했다.

실제로는 다른분들은 그래프 형식으로 결과값을 도출해서 많이 사용하시던데

 

내가 원하는건 연관단어들의 텍스트형식의 결과물이었다.

 

NetworkX는 네트워크분석을 기본으로 하고 있고

 

네트워크 분석은 개인과 집단들 간의 관계를 노드(Node)와 링크(Link)로써 모형화하여, 그것의 구조나, 확산 및 진화과정을 계량적으로 분석하는 방법이다. 개체 자체의 속성에 중점을 둔 기존의 통계적인 연구방법과는 달리, 개체간의 상호 관계에 초점을 맞춘 방법이다. 네트워크 분석은 화학, 생물, 물리, 정보공학, 사회학, 인문학 등 다양한 분야에서 응용되고 있는 용어만 조금씩 다를 뿐 기본 원리는 그래프 이론에서 출발 했다고 할 수 있다. 소셜 네트워크 분석(SNA, Social Network Analysis) 역시 적용하는 대상과 용어만 다를 뿐 기본적인 분석 방법은 동일하다.
(참조 : https://kdata.or.kr/info/info_04_view.html?field=&keyword=&type=techreport&page=1&dbnum=192961&mode=detail&type=techreport) 

 

튜토리얼 참고 :https://networkx.org/documentation/stable/tutorial.html

 

Tutorial — NetworkX 2.6.2 documentation

This guide can help you start working with NetworkX. Nodes The graph G can be grown in several ways. NetworkX includes many graph generator functions and facilities to read and write graphs in many formats. To get started though we’ll look at simple mani

networkx.org

 

 

궁극적으로 내가 해보고싶었던 거는 

각 기사 혹은 책 제목을 읽어와서

가져온 List 에서 가장 많은 연관성이 있는 단어 묶음들을 찾고싶었다.

 

첫번째로는 당연히, 모델을 학습할 샘플데이터가 필요하다.

이거는 뭐.. 그냥 단순이 책이나 기사 제목을 크롤링해와서 test.txt 에 담았다.

그래서 lines를 만들어 주고

 

words_list 를 만들고 거기에 lines를 넣어줬다.

 

그리고 words_list로 모델을 학습하기 전에

불용어( 실제로 그 모델에서 제외할 단어들 ) 을 stopwords.txt 에 미리 넣어놓고

 

연관성있는 단어쌍을 만들어준다.

혹시.. enumerate 내장함수를 모르면 아래 사이트에 잘 설명이 되어있다.

 

참조: https://www.daleseo.com/python-enumerate/

 

[파이썬] enumerate 내장 함수로 for 루프 돌리기

Engineering Blog by Dale Seo

www.daleseo.com

 

이제 이중으로 Loop를 돌리면서 단어의 연관성을 찾으면 된다.

for 문을 자세히 보면 아래와 같이 돌아가는걸 알 수 있다.

 

샘플.txt
for문 출력

그래서 이제 이걸 이중 for 문 안에서 비교하면서 

count 에 넣어주게 된다.

 

다 만들고 나서 Dataframe 에 넣고 

원하는 컬럼으로 정렬하면 원하는 결과를 얻을 수 있다.

 

표본이 많으면 많을수록 더 정확하고 깔끔한 데이터를 얻을 수 있다.

 

최종 결과값

 

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
53
54
55
56
57
58
59
60
61
62
import pandas as pd
 
f= open('test.txt', encoding='UTF8')
lines = f.readlines()
# len(lines)
# print(len(lines))
 
lines
 
words_list=[]
 
for text in lines:
    words_list.append(text.strip())
 
print(words_list[1])
# 불용어처리
stopwords =[]
=open('stopwords.txt')
lines = f.readlines()
for line in lines:
    line = line.strip()
    stopwords.append(line)
f.close()
# 불용어 list 만들어 줌
print('불용어 사전 출력' ,stopwords)
 
 
#{}이거는 dictionary 기호이다.
count = {}
for line in words_list:
    words = list(set(line.split()))
 
    # print(words)
 
    for i,a in enumerate(words):
        for b in words[i+1:]:
            if b not in stopwords:
                if a>b:
                    count[b,a] = count.get((b,a),0+1
                else:
                    count[a,b] = count.get((a, b), 0+ 1
 
# print(count)
 
count.get(("a","b"),0)
# print(count)
df=pd.DataFrame.from_dict(count, orient='index')
df.head
# print(df.head)
 
list1=[]
for i in range(len(df)):
    list1.append([df.index[i][0], df.index[i][1], df[0][i]])
 
df2= pd.DataFrame(list1, columns=["word1","word2","freq"])
 
# print(df2)
 
df3=df2.sort_values(by=['freq'],ascending=False)
df3.head(10)
 
print(df3.head(10))
cs

 

 

참조: http://gahwan.com/python-%EC%97%B0%EA%B4%80%EC%96%B4-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%B6%84%EC%84%9D-with-networkx-package/

728x90
반응형

+ Recent posts