Estou começando a usar o NLTK e não entendo como obter uma lista de palavras do texto. Se eu usar nltk.word_tokenize()
, recebo uma lista de palavras e pontuação. Eu preciso apenas das palavras. Como posso me livrar da pontuação? Também word_tokenize
não funciona com várias frases: pontos são adicionados à última palavra.
125
nltk.word_tokenize(the_text.translate(None, string.punctuation))
deve funcionar em python2 enquanto em python3 você pode fazernltk.work_tokenize(the_text.translate(dict.fromkeys(string.punctuation)))
.word_tokenize()
que não funciona com várias frases. Para se livrar da pontuação, você pode usar uma expressão regular ou aisalnum()
função python .>>> 'with dot.'.translate(None, string.punctuation) 'with dot'
(nota sem ponto no final do resultado) Isso pode causar problemas se você tem coisas como'end of sentence.No space'
, caso em que fazer isso em vez disso:the_text.translate(string.maketrans(string.punctuation, ' '*len(string.punctuation)))
que substitui toda a pontuação com espaços em branco.Respostas:
Dê uma olhada nas outras opções de tokenização que o nltk fornece aqui . Por exemplo, você pode definir um tokenizador que seleciona sequências de caracteres alfanuméricos como tokens e descarta todo o resto:
Resultado:
fonte
word_tokenize
dividir contrações. Você pode dividir ingenuamente a regex\w+
sem a necessidade do NLTK.Você realmente não precisa do NLTK para remover a pontuação. Você pode removê-lo com python simples. Para strings:
Ou para unicode:
e use essa string no seu tokenizer.
O módulo de string PS possui alguns outros conjuntos de elementos que podem ser removidos (como dígitos).
fonte
a = "*fa,fd.1lk#$" print("".join([w for w in a if w not in string.punctuation]))
O código abaixo removerá todos os sinais de pontuação e os caracteres não alfabéticos. Copiado do livro deles.
http://www.nltk.org/book/ch01.html
resultado
fonte
Conforme observado nos comentários, comece com sent_tokenize (), porque o word_tokenize () funciona apenas em uma única frase. Você pode filtrar a pontuação com filter (). E se você tiver uma string unicode, verifique se é um objeto unicode (não uma 'str' codificada com alguma codificação como 'utf-8').
fonte
word_tokenize
é uma função que retorna[token for sent in sent_tokenize(text, language) for token in _treebank_word_tokenize(sent)]
. Então, acho que sua resposta está fazendo o que o nltk já faz: usandosent_tokenize()
antes de usarword_tokenize()
. Pelo menos isso é para nltk3.did
en't
não.
Acabei de usar o código a seguir, que removeu toda a pontuação:
fonte
Eu acho que você precisa de algum tipo de correspondência de expressão regular (o código a seguir está no Python 3):
Resultado:
Na maioria dos casos, deve funcionar bem, pois remove a pontuação e preserva tokens como "n't", que não podem ser obtidos em tokenizadores de regex, como
wordpunct_tokenize
.fonte
...
e--
quando as contrações preservando, ques.translate(None, string.punctuation)
não vaiSinceramente perguntando, o que é uma palavra? Se você pressupõe que uma palavra consiste apenas em caracteres alfabéticos, você está errado, pois palavras como
can't
serão destruídas em pedaços (comocan
et
) se você remover a pontuação antes da tokenização , o que provavelmente afetará negativamente o seu programa.Portanto, a solução é tokenizar e remover os tokens de pontuação .
... e, se desejar, você pode substituir certos tokens, como
'm
poram
.fonte
Eu uso esse código para remover a pontuação:
E se você quiser verificar se um token é uma palavra válida em inglês ou não, pode ser necessário o PyEnchant
Tutorial:
fonte
word_tokenize
uso o tokenizer padrão,TreebankWordTokenizer
, que divide as contrações (por exemplo,can't
a (ca
,n't
) No entanto.n't
Não é alfanumérico e se perder no processo.Remover pontuação (isso removerá., Bem como parte do tratamento da pontuação usando o código abaixo)
Entrada / Saída de amostra:
['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']
fonte
Apenas adicionando à solução por @rmalouf, isso não incluirá nenhum número porque \ w + é equivalente a [a-zA-Z0-9_]
fonte
Você pode fazer isso em uma linha sem o nltk (python 3.x).
fonte