In [1]:
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
- Data의 특징들을 Feature이라고 한다. (특징 - 컬럼)
- CountVectorizer는 단어의 개수를 세서 단어-문서 행렬을 만들어 준다
In [2]:
text = ['안녕 세상', '사과 맛있다']
In [3]:
cv = CountVectorizer() # 일반적으로 공백으로 나눈다. 하지만 한글은 형태소 처리가 필요하다.
In [4]:
tdm = cv.fit_transform(text)
In [5]:
tdm # 2개의 문서에서 4개의 단어를 추출했다.
Out[5]:
In [6]:
cv.get_feature_names()
Out[6]:
In [49]:
tdm.todense()
Out[49]:
In [52]:
np.corrcoef(tdm.todense(),rowvar=0)
Out[52]:
In [14]:
cv.get_feature_names()
Out[14]:
- 보통 텍스트 데이터의 경우 크롤링을 통해서 얻을 수 있는데 크롤링의 경우 여기서 따로 하지 않겠다.
In [15]:
import requests
import lxml.html
In [17]:
url = 'https://techcrunch.com/startups/page/{number}'.format(number=2)
In [18]:
def get_tc_list(page):
url = 'https://techcrunch.com/startups/page/{number}'.format(number=page)
res = requests.get(url) # 기사 목록 가지고오기
root = lxml.html.fromstring(res.text) # 제목 가지고오기
titles = root.cssselect('h2 a') # 제목 가지고 오기
for title in titles:
yield title.text
In [21]:
import tqdm
In [22]:
articles = []
for page in tqdm.tqdm_notebook(range(1,30)):
articles = articles + list(get_tc_list(page))
In [54]:
cv = CountVectorizer(max_features=1000, stop_words='english')
In [55]:
tdm = cv.fit_transform(articles)
tdm
Out[55]:
In [56]:
words = cv.get_feature_names()
str(words[:5])
Out[56]:
In [57]:
m = np.array([[1,2,3],[4,5,6]])
m
Out[57]:
In [58]:
m.sum(axis=0) # Col별로 SUM
Out[58]:
In [59]:
m.sum(axis=1) # ROW별로 SUM
Out[59]:
- tdm.todense() 행렬을 SUM하는 것
- Matrix가 대괄호가 2개다. 하나짜리로 변환 해줘야된다.
In [60]:
count_mat = tdm.sum(axis=0) # 열합계. tdm.todense() 행렬을 SUM하는 것
count_mat.shape
Out[60]:
In [61]:
count_mat
Out[61]:
In [62]:
count = np.squeeze(np.asarray(count_mat)) # 2개 짜리 메트릭스를 1개짜리로 변환 np.asarry() : Matrix to Array
count.shape
Out[62]:
- Word, Count 튜플형태로 만들어준다.
In [63]:
word_count = list(zip(words,count))
#짝을 지어서 List로 변환. zip도 yield를 사용하고 있어서 list로 호출해줘야된다.
In [64]:
word_count[:3]
Out[64]:
- 정렬
In [65]:
word_count = sorted(word_count,key=lambda x:x[1], reverse=True)
In [66]:
word_count[:3]
Out[66]:
워드클라우드
- Unofficial Windows Binaries for Python Extension Packages 에서 다운받은 다음, 명령창에서 아래명령을 실행. 해당 다운로드 된 폴더에서 pip install 파일명
In [67]:
import matplotlib.pyplot as plt
from wordcloud import WordCloud
%matplotlib inline
In [68]:
wc = WordCloud(background_color='White', width=400, height=300)
cloud = wc.generate_from_frequencies(dict(word_count))
In [69]:
plt.figure(figsize=(12,9))
plt.imshow(cloud)
plt.axis('off')
plt.show()
In [70]:
tdm.todense()
Out[70]:
In [71]:
tdm.todense().shape # 580 x 1000인 이유는 580개 문서에서 1000개의 단어.
Out[71]:
아래와 같은 그림
In [74]:
word_corr = np.corrcoef(tdm.todense(), rowvar=0)
word_corr
Out[74]:
In [75]:
word_corr[0][:10] # 첫번쨰 단어와 다른 단어의 관계
Out[75]:
In [77]:
edges = []
for i in range(len(words)):
for j in range(i+1, len(words)):
edges.append((words[i],words[j], word_corr[i,j]))
In [80]:
edges = sorted(edges, key=lambda x:x[2],reverse=True)
edges[:5]
Out[80]:
In [83]:
edge_list = [(word1,word2) for word1, word2, weight in edges]
edge_list[:2]
Out[83]:
In [84]:
weight_list = [weight for _, _, weight in edges]
In [85]:
import networkx
In [86]:
G = networkx.Graph()
In [87]:
edge_set = set()
for word1, word2, weight in edges[:101]:
G.add_edge(word1, word2, weight=weight)
edge_set.add((word1,word2))
In [88]:
position = networkx.spring_layout(G, k=0.09, iterations=100)
plt.figure(figsize=(12, 9))
networkx.draw_networkx_nodes(G, position, node_size=0)
networkx.draw_networkx_edges(G, position, edgelist=edge_list[:101], width=weight_list[:101], edge_color='lightgray')
networkx.draw_networkx_labels(G, position, font_size=15)
plt.axis('off')
plt.show()
'BIGDATA > TEXT MINING' 카테고리의 다른 글
[Crawling] Beautifulsoup & Requests (Crawling) (0) | 2017.09.11 |
---|---|
[TEXT MINING] ENCODING, 인코딩 (0) | 2017.09.11 |
[URL] URL 분해 및 URL Encoding (0) | 2017.09.10 |
[Crawling] Web Crawling(크롤링) (2) | 2017.09.10 |
[TEXT MINING] 노무현 대통령 vs 이명박 대통령 (텍스트마이닝) (0) | 2017.09.04 |