programing

NLTK 토큰라이저를 사용하여 구두점을 제거하는 방법은 무엇입니까?

powerit 2023. 7. 17. 21:27
반응형

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

반응형