어제 공부했던 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
궁극적으로 내가 해보고싶었던 거는
각 기사 혹은 책 제목을 읽어와서
가져온 List 에서 가장 많은 연관성이 있는 단어 묶음들을 찾고싶었다.
첫번째로는 당연히, 모델을 학습할 샘플데이터가 필요하다.
이거는 뭐.. 그냥 단순이 책이나 기사 제목을 크롤링해와서 test.txt 에 담았다.
그래서 lines를 만들어 주고
words_list 를 만들고 거기에 lines를 넣어줬다.
그리고 words_list로 모델을 학습하기 전에
불용어( 실제로 그 모델에서 제외할 단어들 ) 을 stopwords.txt 에 미리 넣어놓고
연관성있는 단어쌍을 만들어준다.
혹시.. enumerate 내장함수를 모르면 아래 사이트에 잘 설명이 되어있다.
참조: https://www.daleseo.com/python-enumerate/
이제 이중으로 Loop를 돌리면서 단어의 연관성을 찾으면 된다.
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 =[]
f =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 |
'IT Diary > # Dev Diary' 카테고리의 다른 글
Mac OS 에서 LaunchAgents 사용해보기 (0) | 2023.09.10 |
---|---|
[ Dev Dairy ] 007-1. 포켓몬 이미지 크롤링 ( selenium ) (0) | 2021.07.30 |
[ Dev Dairy ] 005. krwordrank 사용해보기 (0) | 2021.07.28 |
[ Dev Dairy ] 004. Flask API 만들어보기 (0) | 2021.07.20 |
[ Dev Dairy ] 003. Teachable Machine 사용해보기 (0) | 2021.03.26 |