[python] NLTK 토크 나이저를 사용하여 구두점을 제거하는 방법은 무엇입니까?

방금 NLTK를 사용하기 시작했는데 텍스트에서 단어 목록을 얻는 방법을 잘 모르겠습니다. 을 사용하면 nltk.word_tokenize()단어 목록과 구두점을 얻습니다. 대신 단어 만 필요합니다. 구두점을 제거하려면 어떻게해야합니까? 또한 word_tokenize여러 문장에서 작동하지 않습니다. 점이 마지막 단어에 추가됩니다.



답변

nltk가 여기에서 제공하는 다른 토큰 화 옵션을 살펴 보십시오 . 예를 들어 일련의 영숫자 문자를 토큰으로 선택하고 나머지는 모두 삭제하는 토크 나이저를 정의 할 수 있습니다.

from nltk.tokenize import RegexpTokenizer

tokenizer = RegexpTokenizer(r'\w+')
tokenizer.tokenize('Eighty-seven miles to go, yet.  Onward!')

산출:

['Eighty', 'seven', 'miles', 'to', 'go', 'yet', 'Onward']


답변

구두점을 제거하기 위해 NLTK가 필요하지 않습니다. 간단한 파이썬으로 제거 할 수 있습니다. 문자열의 경우 :

import string
s = '... some string with punctuation ...'
s = s.translate(None, string.punctuation)

또는 유니 코드의 경우 :

import string
translate_table = dict((ord(char), None) for char in string.punctuation)
s.translate(translate_table)

그런 다음 토크 나이저에서이 문자열을 사용합니다.

PS 문자열 모듈에는 제거 할 수있는 다른 요소 세트 (예 : 숫자)가 있습니다.


답변

아래 코드는 모든 문장 부호와 알파벳이 아닌 문자를 제거합니다. 그들의 책에서 복사했습니다.

http://www.nltk.org/book/ch01.html

import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time. @ sd  4 232"

words = nltk.word_tokenize(s)

words=[word.lower() for word in words if word.isalpha()]

print(words)

산출

['i', 'ca', 'do', 'this', 'now', 'because', 'i', 'so', 'tired', 'please', 'give', 'me', 'some', 'time', 'sd']


답변

주석에서 알 수 있듯이 word_tokenize ()는 단일 문장에서만 작동하기 때문에 sent_tokenize ()로 시작합니다. filter ()를 사용하여 구두점을 필터링 할 수 있습니다. 그리고 만약 당신이 유니 코드 문자열을 가지고 있다면 그것이 유니 코드 객체인지 확인하십시오 ( ‘utf-8’과 같은 인코딩으로 인코딩 된 ‘str’이 아님).

from nltk.tokenize import word_tokenize, sent_tokenize

text = '''It is a blue, small, and extraordinary ball. Like no other'''
tokens = [word for sent in sent_tokenize(text) for word in word_tokenize(sent)]
print filter(lambda word: word not in ',-', tokens)


답변

방금 다음 코드를 사용하여 모든 구두점을 제거했습니다.

tokens = nltk.wordpunct_tokenize(raw)

type(tokens)

text = nltk.Text(tokens)

type(text)

words = [w.lower() for w in text if w.isalpha()]


답변

일종의 정규식 일치가 필요하다고 생각합니다 (다음 코드는 Python 3에 있습니다).

import string
import re
import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time."
l = nltk.word_tokenize(s)
ll = [x for x in l if not re.fullmatch('[' + string.punctuation + ']+', x)]
print(l)
print(ll)

산출:

['I', 'ca', "n't", 'do', 'this', 'now', ',', 'because', 'I', "'m", 'so', 'tired', '.', 'Please', 'give', 'me', 'some', 'time', '.']
['I', 'ca', "n't", 'do', 'this', 'now', 'because', 'I', "'m", 'so', 'tired', 'Please', 'give', 'me', 'some', 'time']

“n’t”와 같은 토큰을 보존하면서 구두점을 제거하기 때문에 대부분의 경우 잘 작동합니다 wordpunct_tokenize. 이는와 같은 정규식 토크 나이저에서 얻을 수 없습니다 .


답변

진심으로 묻는다, 단어는 무엇입니까? 단어가 알파벳 문자로만 구성되어 있다고 가정하는 경우 , 토큰 화 전에 구두점을 제거하면와 같은 단어 can't가 조각으로 파괴되므로 (예 : cant) 프로그램에 부정적인 영향을 미칠 가능성이 큽니다.

따라서 해결책은 구두점 토큰을 토큰 화 한 다음 제거하는 것 입니다.

import string

from nltk.tokenize import word_tokenize

tokens = word_tokenize("I'm a southern salesman.")
# ['I', "'m", 'a', 'southern', 'salesman', '.']

tokens = list(filter(lambda token: token not in string.punctuation, tokens))
# ['I', "'m", 'a', 'southern', 'salesman']

… 원하는 경우,와 같은 특정 토큰 'mam.