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)
토큰화기에 이 문자열을 사용합니다.
P.S. 문자열 모듈에는 숫자와 같이 제거할 수 있는 몇 가지 다른 요소 세트가 있습니다.
아래 코드는 영문자가 아닌 모든 문장 부호를 제거합니다.그들의 책에서 복사했습니다.
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']
주석에서 알 수 있듯이 sent_tokenize()로 시작합니다. word_tokenize()는 단일 문장에서만 작동하기 때문입니다.필터()를 사용하여 구두점을 필터링할 수 있습니다.또한 유니코드 문자열이 있는 경우 유니코드 개체('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()]
진심으로 묻습니다, 단어란 무엇인가요?단어가 알파벳 문자로만 구성되어 있다고 가정한다면, 다음과 같은 단어들 때문에 틀린 것입니다.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
.
나는 당신이 일종의 정규 표현 매칭이 필요하다고 생각합니다 (다음 코드는 파이썬 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와 토큰을 에 잘 해야 합니다. "와 같은 정규식 토큰화 프로그램에서는 수 .wordpunct_tokenize
.
nltk(python 3.x) 없이 한 줄로 할 수 있습니다.
import string
string_text= string_text.translate(str.maketrans('','',string.punctuation))
이 코드를 사용하여 구두점을 제거합니다.
import nltk
def getTerms(sentences):
tokens = nltk.word_tokenize(sentences)
words = [w.lower() for w in tokens if w.isalnum()]
print tokens
print words
getTerms("hh, hh3h. wo shi 2 4 A . fdffdf. A&&B ")
그리고 토큰이 유효한 영어 단어인지 확인하고 싶다면 PyEnchant가 필요할 수 있습니다.
자습서:
import enchant
d = enchant.Dict("en_US")
d.check("Hello")
d.check("Helo")
d.suggest("Helo")
@rmalouf에 의해 솔루션에 추가하기만 하면, \w+는 [a-zA-Z0-9_]와 같기 때문에 여기에는 숫자가 포함되지 않습니다.
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'[a-zA-Z]')
tokenizer.tokenize('Eighty-seven miles to go, yet. Onward!')
구두점 제거(아래 코드를 사용하여 구두점 처리의 일부와 .를 제거합니다.)
tbl = dict.fromkeys(i for i in range(sys.maxunicode) if unicodedata.category(chr(i)).startswith('P'))
text_string = text_string.translate(tbl) #text_string don't have punctuation
w = word_tokenize(text_string) #now tokenize the string
샘플 입력/출력:
direct flat in oberoi esquire. 3 bhk 2195 saleable 1330 carpet. rate of 14500 final plus 1% floor rise. tax approx 9% only. flat cost with parking 3.89 cr plus taxes plus possession charger. middle floor. north door. arey and oberoi woods facing. 53% paymemt due. 1% transfer charge with buyer. total cost around 4.20 cr approx plus possession charges. rahul soni
['direct', 'flat', 'oberoi', 'esquire', '3', 'bhk', '2195', 'saleable', '1330', 'carpet', 'rate', '14500', 'final', 'plus', '1', 'floor', 'rise', 'tax', 'approx', '9', 'flat', 'cost', 'parking', '389', 'cr', 'plus', 'taxes', 'plus', 'possession', 'charger', 'middle', 'floor', 'north', 'door', 'arey', 'oberoi', 'woods', 'facing', '53', 'paymemt', 'due', '1', 'transfer', 'charge', 'buyer', 'total', 'cost', 'around', '420', 'cr', 'approx', 'plus', 'possession', 'charges', 'rahul', 'soni']
부터from string import punctuation
문자열 변수만 제공합니다.punctuation
특수 문자 포함...
!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~
단어와 같이 아포스트로피를 제자리에 두기 위해 단일 인용문을 제거하는 것과 같이 맞춤화될 수 있습니다.it's
자신의 것을 할당할 수 있습니다.옷 갈아입고 있어요punctuation
로.punctuations
's'가 추가되고 다른 답변에 연결할 수 있습니다.
punctuations = '!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~' # \' removed
text = " It'll be ok-ish!?? "
text = ' '.join(filter(None, (word.strip(punctuation) for word in text.split())))
...어디에text
다음이 됩니다.
"It'll be ok-ish"
언급URL : https://stackoverflow.com/questions/15547409/how-to-get-rid-of-punctuation-using-nltk-tokenizer
'programing' 카테고리의 다른 글
다른/변경된 경우 업데이트 (0) | 2023.07.17 |
---|---|
파이썬에서 사전을 쿼리 문자열로 변환하는 방법은 무엇입니까? (0) | 2023.07.17 |
Oracle: 열 순서가 인덱스에서 중요합니까? (0) | 2023.07.17 |
그래프(데이터 구조)를 Python으로 표현 (0) | 2023.07.17 |
onAuthStateChanged를 사용한 Float을 사용한 Firebase 로그인 (0) | 2023.07.17 |