세상에... 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

여러 리스트들의 값을 가로가 아닌 세로로 출력해야 할 때가 있다. 다음과 같이...


A = [a, b, c]

B = [10, 20, 30, 40]

C = [뭐]

이를 아래처럼 출력

a    10    뭐

b    20    none

c    30    none

none    40    none


이렇게 하려고 세로로 출력하는 엄청 귀찮은 함수를 짜야 한다면... 다음과 같이 해보시라!!!


import itertools

list(itertools.izip_longest(a, b, c))


원래 파이썬에서는 zip이라는 함수가 존재하는데(Ref), 하는 일은 위의 itertools의 izip_longest와 똑같지만 주어진 list들 중 가장 짧은 애의 길이로 출력해준다. 그래서 위의 예제에서는 첫번째 행만 출력되는 안습상황이 펼쳐진다. 가장 긴 리스트의 길이로 맞추어 출력하고 싶다면, itertools의 izip_longest를 쓰시길!


추가: 만약 리스트 하나에 A, B, C가 들어있다면 다음과 같이 합니다.


data = [A, B, C]

izip_longest(*data,fillvalue='')

http://stackoverflow.com/questions/10071342/python-how-to-write-blocks-of-data-in-columns


출처: http://stackoverflow.com/questions/1277278/python-zip-like-function-that-pads-to-longest-length

+ Recent posts