2015년 11월 13일 금요일

Beautiful Soup의 퀵 가이드 (예제)

파이썬의 데이터 추출의 끝판왕 Beautiful Soup에 대한 퀵 가이드 (예제)를 만든다.

예제로, XSD 형태의 아마존 상품 스키마를 사용했다.
내부 보안 문서라 부분 샘플링 했다.
* xsd : Xml Schema Definition

먼저 xsd 파일을 읽는다.

from bs4 import BeautifulSoup
bs = BeautifulSoup(open('sample.xsd'))

상품 데이터 명세의 속성 값을 불러 온다.

for i in bs.find('xsd:element',{'name':'Product'}).find_all('xsd:sequence')[0]:
    if i.name != 'xsd:element':
        continue
    try:
        if i.has_attr('ref'): print (i.get('ref'))
        if i.has_attr('name'): print (i.get('name'))
    except Exception as e:
        print (e)
        pass

* find_all의 매칭 block은 다음과 같은 성질을 가진다.
 - xml 예제 구조 : block1 { block2{} block{3} }
 - find_all 반환 리스트 구조 : [ block1{ block2{} block3{} }, block2{}, block3{} ]

상상의 날개를 펼쳐본다. 

 - 스트링 (string)
 - 정규식 (regular expression)
 - 리스트 (list)
 - 함수 (function)

import re

def foo(tag):
    return tag.name == 'xsd:sequence'

for i in bs.find(re.compile('x\w+:element'),{'name': lambda x: x == 'Product'}).find_all([foo,'xsd:sequence'])[1]:
    if i.name != 'xsd:element':
        continue
    try:
        if i.has_attr('ref'): print (i.get('ref'))
        if i.has_attr('name'): print (i.get('name'))
    except Exception as e:
        print (e)
        pass

* 다양한 필터 타입이 find 유사 메소드(Method)들의 태그(tag), 속성(attribution)에 적용 가능하다.


응용 코드를 공유한다.

아마존(amazon) MWS(Marketplace Web Service)의 Sellers API 사용시, 데이터 명세 xsd 파일의 레벨(Level) 단위 속성을 추출하는 코드다.
 - https://bitbucket.org/snippets/juhoon26/nRzqL
 - 코드 구조는 다음과 같다.





















 ---------       filename : sample.xsd    -----------

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xsd:element name="Product">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="SKU"/>
        <xsd:element ref="StandardProductID" minOccurs="0"/>
        <xsd:element name="GtinExemptionReason" minOccurs="0">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:enumeration value="bundle"/>
              <xsd:enumeration value="part"/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>        
        <xsd:element ref="RelatedProductID" minOccurs="0"/>       
        <xsd:element ref="ProductTaxCode" minOccurs="0"/>
        <xsd:element name="LaunchDate" type="xsd:dateTime" minOccurs="0"/>
        <xsd:element name="OffAmazonChannel" minOccurs="0">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:enumeration value="advertise"/>
              <xsd:enumeration value="exclude"/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:complexType name="Dimensions">
    <xsd:sequence>
      <xsd:element name="Length" type="LengthDimension" minOccurs="0"/>
      <xsd:element name="Width" type="LengthDimension" minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

2015년 11월 11일 수요일

Elasticsearch에서 제공되는 자연어 처리 기능 정리

Elasticsearch의 자연어(Human language) 처리 기능에 대해서 표로 정리합니다.

구분 요약 세부 요소 비고
Identifying Words 단어 인지하기 ICU plug-in 단어 인지
Normalizing Tokens 일반화 하기 folding 일반화
sort and collation 언어별 정렬 기준
Reducing Words to Root Form 뿌리 단어 인지 Algorithmic Stemmer 패턴 알고리즘 방식
Dictionary Stemmer 사전 매칭 방식
Strowords
: Performance Versus Precision
제외 단어 사용 Stropwords 성능과 정확도 관계 고려
Synonyms 동의어 인지 Case-sensitive Synonyms

Typoes and Mispelings 타이핑 실수 인지 Fuzzy 오타 강도 인지
Phonetic 동음 타이핑 인지

* ICU
 - International Components for Unicode
 - OpenSource Project
 - Contributions : IBM, Apple, Google

2015년 11월 5일 목요일

판다곰(Pandas) 데이터 피봇팅 및 멀티 인덱스 변경하기

판다곰에서 데이터 조작에 있어 자주 사용하는 과정을 요약한다.
멀티 인덱스 부분은 엑셀 작업이 편한 경우가 많지만, 정기적인 리포팅이 필요하다면 고민할 여지가 없다.

1. 자료 샘플

>> df

월별 태그 출금액 입금액
0
201501
관리비
275190
0
1
201501
교통비
106650
0
2
201501
기타
20300
180
20
201502
관리비
284180
0
21
201502
교통비
97650
0
22
201502
기타
93600
548

2. 피봇팅(Pivotting)

>> df.pivot_table(index='태그',columns='월별',values=['출금액','입금액'])

출금액 입금액
월별
201501
201502
201501
201502
태그




관리비
275190
284180
0
0
교통비
106650
97650
0
0
기타
20300
93600
180
548

3. 멀티 인덱스 컬럼 레벨 순서 바꾸기

>> df.columns = df.columns.swaplevel(0, 1)
월별
201501
201502
201501
201502

출금액 출금액 입금액 입금액
태그




관리비
275190
284180
0
0
교통비
106650
97650
0
0
기타
20300
93600
180
548

4. 컬럼 레벨 소팅 작업

>> df.sortlevel(0, axis=1, inplace=True)
월별
201501
201502

출금액 입금액 출금액 입금액
태그




관리비
275190
0
284180
0
교통비
106650
0
97650
0
기타
20300
180
93600
548

5. 컬럼 미세 조정 하기

>> df.columns = pd.MultiIndex(levels=[['201501', '201502'], ['출금액', '입금액']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['월별', '구분'])
월별
201501
201502
구분 출금액 입금액 출금액 입금액
태그




관리비
275190
0
284180
0
교통비
106650
0
97650
0
기타
20300
180
93600
548

Python 함수에 대한 흥미로운 예제

Python 함수에 대한 흥미로운 예제가 있어서 요약한다.

본문을 이해하는데 도움이 되는 용어를 먼저 정의한다.

객채 지향(object-oriented)의 함수형 프로그래밍(functional programming)에서는,
객채(object)의 성질에 따라 다음의 두가지로 분류 할 수 있다.

 * Immutable Object : 생성 이후에는 상태를 변경할 수 없는 객채다.
    예) Number, Character, Turple ... 
 * Mutable Object : 반대로, 생성 이후에도 상태를 변경할 수 있는 객채다.
    예) List, Dict, set

흥미로운 예제는 다음과 같다.

>> def foo (a = 0, b = [] ):
>>    print (a, b)
>>    a = a + 1
>>    b.append(1)

>> foo()
0 []
>> foo()
0 [1]
>> foo()
0 [1, 1]

상식을 벗어나는 결과에 당황 스럽지만, 해결책은 간단하다.
Mutable Object를 기본 인자값(default argument)로 사용하지 않는 것이다.

원인을 분석하면 다음과 같다.

1. 함수가 생성 될때, 2개의 입력 오브젝트 영역이 할당된다.
2. 함수가 수행 될때,
    a = a + 1 수행을 통해 a는 결과가 쓰여진 새로운 영역을 가르킨다.
    b.append(1) 수행을 통해 b의 입력 오브젝트 영역에 [1]이 추가 된다.

요점은 b의 경우 Mutable Object라 함수에 할당된 입력 오브젝트 영역의 상태가 변경 된 점이다.

원인을 알아도 실수하기 쉬운 부분이니 룰(rule)로 지정해서 사용하지 말자.
검증을 위해서는 Object의 메모리 주소를 반환해 주는 id 함수를 활용하자.

2015년 11월 4일 수요일

데이터베이스(Postgresql)의 3가지 함수 형태 요약

Postgresql에서 정의할 수 있는 3가지 함수 형태이다.


  • IMMUTABLE (불변의)
    • 같은 입력값에 대해서는 항상 같은 결과값이 출력된다.
    • anyway,anytime 같은 값을 보장하며 산술 연산들이 여기에 해당된다.
    • 옵티마이저가 미리 계산해도 무방하다.
  • STABLE (정적인)
    • 같은 트랜잭션 내에서는 같은 입력값에 대해서 같은 결과를 출력한다.
    • current_timestamp와 같이 같은 트랜잭션 내에서 결과가 동일한 경우를 포함한다.
    • 옵티마이저 입장에서는 여러번의 콜을 한번으로 줄일 수 있다.
  • VOLATILE (휘발성의)
    • 매번 함수를 호출한다.
    • random(), curval() 함수처럼 미리 확신할 수 없다.
    • 대량의 row에 매번 적용되지 않도록 고민해야 한다.


트랜잭션이라는 논리적인 구성을 가지는 DB에서는 성능이나 편의성을 위해 최소한으로 필요한 요소들로 보인다.

2015년 11월 3일 화요일

검색 엔진 기능 구현 시 유용한 용어 정리

검색 엔진에서 문장 조합을 학습(인덱싱)하다 보면, 원할한 의사 소통을 위해 적절한 용어 사용이 필요하다.

예제) 가 나 다
N 값을 2로 가정할 때, 다음과 같다.
  • 순열
    • 가나, 나가, 나다, 다나, 가다, 다가
  • 조합
    • 가나, 나다, 가다
  • N-Gram
    • 가나, 나다
  • Edged N-Gram
    • 가나(압), 다나(뒤)