방금 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
가 조각으로 파괴되므로 (예 : can
및 t
) 프로그램에 부정적인 영향을 미칠 가능성이 큽니다.
따라서 해결책은 구두점 토큰을 토큰 화 한 다음 제거하는 것 입니다.
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']
… 원하는 경우,와 같은 특정 토큰 'm
을 am
.