세상에... 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 리스트와 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 |