2015년 7월 15일 수요일

단어빈도사전으로 워드클라우드 그리기

요약

본문

In [1]:
# 노트에 그래프를 출력하기 위해서,
%pylab inline
Populating the interactive namespace from numpy and matplotlib

1. 단어 빈도 사전에서 특정 관련 단어 가지고 오기

몇 가지 패턴으로 뽑아낸 명사구에서 "자전거"가 포함된 빈도 사전을 가지고 작업
In [2]:
# 라이브러리 로딩
from sqlalchemy import create_engine
import pandas as pd

# 디비 조회
conn_info = 'postgresql://user:password@host:port/database'
e = create_engine(conn_info)
q = 'SELECT * FROM pandas.word_freq_bike;'
df = pd.read_sql(q,e)

# 빈도수가 높은 상위 150개의 자료만 뽑기
words = df.sort('freq',ascending=False).head(150)[ ['word','freq'] ].values
빈도 사전 구조
In [3]:
words[0:5]
Out[3]:
array([['자전거', 9956],
       ['자전거도로', 1008],
       ['자전거전용도로', 313],
       ['자전거길', 284],
       ['전기자전거', 239]], dtype=object)
2. 단어 빈도 사전으로 워드클라우드(WordCloud) 그리기
In [4]:
from wordcloud import WordCloud, STOPWORDS

apple_mask = imread('bikelogo.gif', 0)

figure(figsize=(12,8))
wordcloud = WordCloud(font_path='fonts/baedal.ttf',
                      stopwords=STOPWORDS,
                      background_color='white',
                      width=1800,
                      height=1400,
                      mask=apple_mask
            ).generate_from_frequencies(words)
 
imshow(wordcloud)
axis("off")
show()
Out[4]:

2015년 7월 14일 화요일

페이스북 데이터 수집 절차

페이스북 데이터 수집
  1. 소개
    1. 페이스북 데이터 수집을 위한 절차
  2. 절차
    1. 어플리케이션 생성
      1. URL - https://developers.facebook.com/apps
        1. 추출 : CLIENT_ID, CLIENT_SECRET
    2. 토큰 발급
      1. URL - https://developers.facebook.com/tools/accesstoken
        1. 추출 : USER_TOKEN
        2. a lifetime of about an hour or two.
    3. 토큰 연장
      1. URL - https://graph.facebook.com/oauth/access_token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&fb_exchange_token=USER_TOKEN&grant_type=fb_exchange_token
      2. 출력 내용 예제
        1. access_token=ACCESS_TOKEN&expires=5184000
        2. ACCESS_TOKEN은 (3.)활용에 파이톤 API - access_token 값으로 사용
  3. 활용
    1. 파이톤 API
      1. https://facebook-sdk.readthedocs.org/en/latest/

로고 이미지

인스타그램 데이터 수집 절차

인스타그램 데이터 수집
  1. 소개
    1. 인스타그램 데이터 수집을 위한 절차
  2. 절차
    1. 어플리케이션 생성
      1. URL - https://instagram.com/developer/clients/manage/
        1. 추출 : CLIENT_ID, REDIRECT_URI
    2. 토큰 발급
      1. URL - https://instagram.com/oauth/authorize/?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&response_type=token
        1. 추출 : ACCESS_TOKEN
        2. 가이드 : https://instagram.com/developer/authentication/
  3. 활용
    1. 파이톤 API
      1. https://github.com/Instagram/python-instagram

로고 이미지

트윗터 데이터 수집 절차

트윗터 데이터 수집
  1. 소개
    1. 트윗터 데이터 수집을 위한 절차
  2. 절차
    1. 어플리케이션 생성 & 토큰 발행
      1. URL - https://apps.twitter.com
        1. 추출 : ACCESS_TOKEN, ACCESS_TOKEN_SECRET, CONSUMER_KEY, CONSUMER_SECRET
  3. 활용
    1. 파이톤 API
      1. http://tweepy.readthedocs.org

로고 이미지

DB 샘플 데이터를 가지고 Elasticsearch Engine 기능 확인

요약

  • DB 데이터에 대한 효과적인 Text searching을 위한 보조 도구로써 솔루션의 기능을 확인한다.

본문

1. Elasticsearch 환경 구성

  • 사이트 : https://www.elastic.co
  • CentOS 6.x에서 RPM 소스 설치 테스트함
  • Single Node일 경우, replica 0으로 세팅해야, Yellow 알람 발생 방지 (아키 구조적으로 생각할 것)
**
단일 서버에서 테스트 할 때, elasticsearch.yml 파일을 수정 방법이다.
# 외부 접근을 위한 수정 항목
network.host: <네트워크 인터페이스 주소>
http.port: 9200
# 노드 1개로 운영 시, "경고" 방지를 위한 복제본 0 설정 항목
index.number_of_replicas: 0

2. Elasticsearch Monitoring Tool.

4. Elasticsearch와 "Postgresql의 Like 검색"의 성능 차이 확인 I (준비 작업)

코끼리에서 샘플 데이터 가지고 오기
In [1]:
# 자주 사용됨으로 미리 정의
conn_info = 'postgresql://user:password@host:port/database'
In [2]:
# 모듈 로딩
import pandas as pd
from sqlalchemy import create_engine
import json

# 샘플로 만들어둔 뉴스 문서 포멧의 10,000개의 문서들
e = create_engine(conn_info)
query = """
SELECT row_number() over () as id,* FROM blogger.elasticsearch_sample_data LIMIT 10000;
"""
%time df = pd.read_sql(query,e)
CPU times: user 531 ms, sys: 132 ms, total: 663 ms
Wall time: 1.38 s
Elasticsearch로 넣기 위한 Json(with records type)으로 변환
In [3]:
# row_number()를 사용하지 않을때, Pandas에서 id 생성하기
#df['no'] = [ x+1 for x in df.index ]

# String to Json(Records Type) Format
%time json_rec = json.loads(df.to_json(orient = "records"))
CPU times: user 3.18 s, sys: 566 ms, total: 3.75 s
Wall time: 3.74 s
Elasticsearch에 인덱싱하기
In [4]:
# Elasticsearch 모듈 로딩
from elasticsearch import Elasticsearch
es = Elasticsearch()

# 사용할 이름 정의
index_name = 'psql_to_es'
doc_type_name = 'psql_entity'

# Json 형태의 문서(doc)를 Elasticsearch로 넣기.
def json_to_es(json_rec):
    for doc in json_rec:
        es.index(index=index_name, doc_type=doc_type_name, id=doc['id'], body=doc)
%time json_to_es(json_rec)
CPU times: user 16.5 s, sys: 842 ms, total: 17.3 s
Wall time: 54.8 s
In [5]:
# 샘플 데이터 확인 (추억의 조던 23번으로,)
es.get(index=index_name, doc_type=doc_type_name, id = 23)
Out[5]:
{'_id': '23',
 '_index': 'psql_to_es',
 '_source': {'comment': 152,
  'content': '연일 때아닌 폭염이 기승입니다. 오늘도 불볕더위가 기승을 부리겠는데요. 현재 강원과 전남, 영남 대부분지역으로 폭염주의보지역이 더 확대된 가운데 영월과 대구가 34도까지 오르겠고, 서울도 30도까지 올라서면서 올해들어 가장 덥겠습니다. 당분간 때 이른 여름 더위는 계속되겠는데요, 서울의 경우 이번 주 내내 30도 안팎의 기온을 보이면서 예년 기온을 크게 웃돌겠습니다. ...',
  'ddate': 1432598400000,
  'dtime': 1432616220000,
  'gdate': '20150526',
  'id': 23,
  'link': '-------------',
  'section': '문화',
  'source': 'YTNTV',
  'title': "[날씨] 오늘도 '폭염'...어제보다 더 더워"},
 '_type': 'psql_entity',
 '_version': 2,
 'found': True}

4. Elasticsearch와 "Postgresql의 Like 검색"의 성능 차이 확인 II (비교하기)

Elasticsearch에서 단어 조회 성능 확인
In [6]:
def find_terms_es():
    res = es.search(index=index_name, body={"query": {"term": {'content':'부동산'}}})
    return res
# 성능확인
%time out1 = find_terms_es()
CPU times: user 4 ms, sys: 3 ms, total: 7 ms
Wall time: 10.8 ms
In [7]:
# 수집 데이터 확인
print("Hits %d :" % out1['hits']['total'])
for hit in out1['hits']['hits'][0:2]:
    print("%(gdate)s %(source)s: %(title)s" % hit["_source"])
Hits 136 :
20150502 이데일리: `14년래 최악 경영난` 맥도날드, 회생전략 내놓는다
20150523 TV조선: [뉴스특보] 국내 금융회사들 해외 고가빌딩 매입나서
postgresql에서 Like 검색을 통한 성능 확인
In [8]:
def find_terms_sql():
    e = create_engine(conn_info)
    query = """
    SELECT gdate,source,title FROM blogger.elasticsearch_sample_data WHERE content like '%%부동산%%'
    """
    return pd.read_sql(query,e)
# 성능확인
%time out2 = find_terms_sql()
CPU times: user 12 ms, sys: 2 ms, total: 14 ms
Wall time: 655 ms
In [9]:
# 수집 데이터 확인
print('Hits %d :' % out2.count()[0])
out2.head(2)
Hits 238 :
Out[9]:
gdate source title
0 20150526 연합뉴스 제일모직-삼성물산 합병결의…삼성그룹 재편 가속(종합2보)
1 20150526 아시아경제 제일모직-삼성물산, 9월1일자로 합병…합병사명은 '삼성물산' (상보)

덧 붙임말

  • 결과 건수가 다른 부분은 있지만, 기대만큼의 성능 개선 부분이 확인 된다.
  • 다음 번에는 자연어 처리 - 형태소 분석기를 붙여서, 완성도를 높인 자료를 만들어 보겠다.

비교 (사이즈, 응답시간) 결과 보기


Postgresql Like 검색 Elasticsearch 검색
10,000 데이터 사이즈 35 MB 94 MB
검색 응답 시간 655 ms 10.8 ms

로고 이미지


판다스에서 데이터베이스에 접근하는 방법 예제

코끼리와 판다곰

요약

  • Pandas를 통해서, Postgresql의 테이블을 조회하거나 결과를 저장한다.

본문

1. 코끼리에서 데이터 가지고 오기

In [1]:
# 모듈 로딩하기
import pandas as pd
from sqlalchemy import create_engine

# 접속 유형 정의 하기
e = create_engine('postgresql://chef:fork@cook:5432/cook')

# id를 인덱스로 사용하는 샘플 데이터 생성 쿼리
query = """
SELECT row_number() over () as id,'seize the day.' as quote
"""

# 쿼리를 통해서 데이터 가지고 오기
df = pd.read_sql(query,e,index_col='id')
In [2]:
#데이터 확인
df
Out[2]:
quote
id
1 seize the day.

2. 꼬끼리에게 데이터 보내기

In [3]:
# pandas라는 스키마에, elephant라는 테이블 생성
df.to_sql(schema='pandas',name='elephant',con=e,if_exists='append')
In [4]:
# 테이블 생성 및 인덱스 생성 확인 하기
!psql -c "\d+ pandas.elephant" cook
                       Table "pandas.elephant"
 Column |  Type  | Modifiers | Storage  | Stats target | Description 
--------+--------+-----------+----------+--------------+-------------
 id     | bigint |           | plain    |              | 
 quote  | text   |           | extended |              | 
Indexes:
    "ix_pandas_elephant_id" btree (id)


로고 이미지