Estoy empezando a usar NLTK y no entiendo cómo obtener una lista de palabras del texto. Si lo uso nltk.word_tokenize()
, obtengo una lista de palabras y puntuación. Solo necesito las palabras en su lugar. ¿Cómo puedo deshacerme de la puntuación? Tampoco word_tokenize
funciona con varias oraciones: se agregan puntos a la última palabra.
125
nltk.word_tokenize(the_text.translate(None, string.punctuation))
debería funcionar en python2 mientras que en python3 puedes hacerlonltk.work_tokenize(the_text.translate(dict.fromkeys(string.punctuation)))
.word_tokenize()
no funciona con múltiples oraciones. Para deshacerse de la puntuación, puede usar una expresión regular o laisalnum()
función de Python .>>> 'with dot.'.translate(None, string.punctuation) 'with dot'
(nota sin punto al final del resultado) que puede causar problemas si tiene cosas como'end of sentence.No space'
, en cuyo caso debe hacerse lo siguiente:the_text.translate(string.maketrans(string.punctuation, ' '*len(string.punctuation)))
que sustituye a todos los puntuacion con espacios en blanco.Respuestas:
Eche un vistazo a las otras opciones de tokenización que nltk proporciona aquí . Por ejemplo, puede definir un tokenizador que seleccione secuencias de caracteres alfanuméricos como tokens y suelte todo lo demás:
Salida:
fuente
word_tokenize
como separar las contracciones. Puede dividirse ingenuamente en la expresión regular\w+
sin necesidad de NLTK.Realmente no necesita NLTK para eliminar la puntuación. Puede eliminarlo con python simple. Para cuerdas:
O para unicode:
y luego usa esta cadena en tu tokenizer.
El módulo de cadena PS tiene algunos otros conjuntos de elementos que se pueden eliminar (como dígitos).
fuente
a = "*fa,fd.1lk#$" print("".join([w for w in a if w not in string.punctuation]))
El siguiente código eliminará todos los signos de puntuación, así como los caracteres no alfabéticos. Copiado de su libro.
http://www.nltk.org/book/ch01.html
salida
fuente
Como se observó en los comentarios, comience con sent_tokenize (), porque word_tokenize () solo funciona en una sola oración. Puede filtrar la puntuación con filter (). Y si tiene cadenas unicode, asegúrese de que sea un objeto unicode (no una 'str' codificada con alguna codificación como 'utf-8').
fuente
word_tokenize
Es una función que regresa[token for sent in sent_tokenize(text, language) for token in _treebank_word_tokenize(sent)]
. Así que creo que su respuesta es hacer lo que nltk ya hace: usarsent_tokenize()
antes de usarword_tokenize()
. Al menos esto es para nltk3.did
yn't
no.
Acabo de usar el siguiente código, que eliminó toda la puntuación:
fuente
Creo que necesita algún tipo de coincidencia de expresiones regulares (el siguiente código está en Python 3):
Salida:
Debería funcionar bien en la mayoría de los casos, ya que elimina la puntuación al tiempo que conserva los tokens como "n't", que no se pueden obtener de los tokenizadores regex como
wordpunct_tokenize
.fuente
...
y--
al mismo tiempo preservará las contracciones, ques.translate(None, string.punctuation)
no lo haránSinceramente preguntando, ¿qué es una palabra? Si su suposición es que una palabra consiste solo en caracteres alfabéticos, está equivocado ya que las palabras como
can't
se destruirán en pedazos (comocan
yt
) si elimina la puntuación antes de la tokenización , lo que es muy probable que afecte negativamente a su programa.Por lo tanto, la solución es tokenizar y luego eliminar los tokens de puntuación .
... y luego, si lo desea, puede reemplazar ciertas fichas como
'm
conam
.fuente
Yo uso este código para eliminar la puntuación:
Y si desea verificar si un token es una palabra inglesa válida o no, es posible que necesite PyEnchant
Tutorial:
fuente
word_tokenize
usa el tokenizador estándarTreebankWordTokenizer
, que divide las contracciones (por ejemplo,can't
a (ca
,n't
). Sin embargo,n't
no es alfanumérico y se pierde en el proceso.Eliminar puntuación (eliminará, así como parte del manejo de puntuación usando el código a continuación)
Muestra de entrada / salida:
['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']
fuente
Simplemente agregando a la solución por @rmalouf, esto no incluirá ningún número porque \ w + es equivalente a [a-zA-Z0-9_]
fuente
Puede hacerlo en una línea sin nltk (python 3.x).
fuente