앎을 경계하기

Programming/Python

Python N-gram 생성

양갱맨 2020. 1. 2. 00:42

출처 : https://dojang.io/mod/page/view.php?id=2332

 

파이썬 코딩 도장: 28.2 N-gram 만들기

N-gram은 문자열에서 N개의 연속된 요소를 추출하는 방법입니다. 만약 'Hello'라는 문자열을 문자(글자) 단위 2-gram으로 추출하면 다음과 같이 됩니다. 즉, 문자열의 처음부터 문자열 끝까지 한 글자씩 이동하면서 2글자를 추출합니다. 3-gram은 3글자, 4-gram은 4글자를 추출하겠죠? 28.2.1  반복문으로 N-gram 출력하기 이제 반복문으로 문자 단위 2-gram을 출력해보겠습니다. 2_gram_character.py text =

dojang.io

 

N-gram : 문자열에서 N개 요소를 연속으로 추출한다.

1. 반복문 사용하기

#반복문을 사용한 2-gram

text = 'Hello'

for i in range(len(text)-1):
	print(text[i],text[i+1],sep='')
He
el
ll
lo

단어 단위로 N-gram 적용

text = 'this is python script'
words  text.split()				# 공백으로 문자열을 분리해 리스트로 생성

for i in range(len(words)-1):
	print(words[i], words[i+1])
this is
is python
python script

 

2. zip 사용하기

text = 'Hello'

two_gram = zip(text, text[1:])
for i in two_gram:
	print(i[0], i[1], sep='')

zip(text, text[1:])은 다음과 같다.

'Hello'와 'ello'를 요소를 각각 순서대로 묶어서 튜플로 만든다.

튜플결과는 다음과 같다.

('h', 'e'), ('e', 'l'), ('l', 'l'), ('l', 'o')

단어 단위로도 다음과 같이 만들 수 있다.

text = 'this is python script'
words = text.split()
list(zip(words, words[1:]))
[('this', 'is'), ('is', 'python'), ('python', 'script')]

만약 3-gram을 만든다면 zip(words, words[1:], words[2:])로 만들면 된다.

3. zip, 리스트 표현식 사용하기

위처럼 list(zip(words, words[1:], words[2:], ...)) 으로 슬라이스를 반복해서 명시하는 것은 번거롭다.

이 과정을 리스트 표현식을 사용해서 편하게 사용해보자.

list(zip(*[text[i:] for i in range(3)]))
[('h', 'e', 'l'), ('e', 'l', 'l'), ('l', 'l', 'o')]

*은 list unpacking이라고 한다. zip을 사용할 때 리스트의 각 요소를 콤마로 구분해서 넣을 수 있다.