세상에... Python으로 이렇게 간단힌 n-gram을 만들 수 있다니...!!


우선 zip 함수에 대해 알아보자. zip함수의 인자로 받은 리스트 등의 iterator들을 묶어주는 함수이다. 뭐 예를 들면...


>>> q = [1,2,3,4,5]

>>> w = [10, 20, 30, 40,50]

>>> r = [100, 200, 300, 400, 500]

>>> zip(q, w, r)

[(1, 10, 100), (2, 20, 200), (3, 30, 300), (4, 40, 400), (5, 50, 500), (6, 60, 600)]


이제 n-gram을 만들어보자. 위의 방법으로 만들기 떄문에 함수도 짧고 속도도 그만큼 빠르다.


>>> a = "I am a boy, you are a girl."

>>> b = a.split(" ")
['I', 'am', 'a', 'boy,', 'you', 'are', 'a', 'girl.']
>>> zip(b, b[1:])
[('I', 'am'), ('am', 'a'), ('a', 'boy,'), ('boy,', 'you'), ('you', 'are'), ('are', 'a'), ('a', 'girl.')]


b 리스트와 b 리스트 중 0번째 원소를 제외하고 1번째 원소부터 시작한 리스트를 zip으로 묶은 결과이다. 이렇게 bi-gram을 만들 수 있다. 


그럼 n-gram은...? 다음과 같이 만들면 된다고 한다. 


>>> zip( *[b[i:] for i in range(3)] )

>>> [('I', 'am', 'a'), ('am', 'a', 'boy,'), ('a', 'boy,', 'you'), ('boy,', 'you', 'are'), ('you', 'are', 'a'), ('are', 'a', 'girl.')]


원리는 간단하다. 

1. 리스트 내포(list comprehension) 문법으로 b[0:], b[1:], b[2:], ... 등의 리스트를 원소로 가지는 리스트를 하나 만든다. 

2. 만들어진 리스트의 원소들이 필요하기 때문에, 리스트 앞에 *을 붙여 리스트의 원소들이 함수의 argument로 들어가도록 해준다.

3. zip으로 묶어준다. 


새로 발견한건 아니고... 출처는 아래이다. Python 짱이네..

http://locallyoptimal.com/blog/2013/01/20/elegant-n-gram-generation-in-python/


'Study > Computer' 카테고리의 다른 글

large data with numpy  (0) 2014.06.20
numpy array 잘라쓰기  (0) 2014.06.17
Matplotlib 추천 Q&A 링크들  (0) 2014.05.21
위도, 경도 검색 프로그램  (0) 2014.05.09
Too many open files 에러가 로그에 남을 때  (0) 2014.04.07

+ Recent posts