2011-08-11 20 views
5

Estoy buscando nltk para python, pero se divide (tokenize) won't como ['wo',"n't"]. ¿Hay bibliotecas que hacen esto de forma más robusta?¿Hay una biblioteca para dividir la oración en una lista de palabras?

Sé que puedo construir una expresión regular de algún tipo para resolver este problema, pero estoy buscando una biblioteca/herramienta porque sería un enfoque más directo. Por ejemplo, después de una expresión regular básica con puntos y comas, me di cuenta de palabras como 'Sr. 'romperá el sistema.

(@artsiom)

Si la sentencia era "usted no?", Split() me dará [ "usted", "no lo hará?"]. Entonces hay un extra '?' con lo que tengo que lidiar Estoy buscando un método probado que elimine las fallas como el mencionado anteriormente y también muchas excepciones que estoy seguro existen. Por supuesto, recurriré a una división (regex) si no encuentro ninguna.

+3

Lo siento si te extraño somenthing pero por qué no text.split()? –

+1

¿qué resultado espera? – Simon

Respuesta

3

@Karthick, aquí es un simple algoritmo he usado desde hace mucho tiempo para dividir un texto en una lista de palabras:

  1. texto de entrada
  2. repetir por los caracteres de texto.
  3. Si el carácter actual está en "alfabeto", añádalo a una palabra. De lo contrario: agregue la palabra previamente creada a una lista y comience una nueva palabra.

alphabet = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') 
text = "I won't answer this question!" 

word = '' 
wordlist = [] 

for c in text: 
    if c in alphabet: 
     word += c 
    else: 
     if len(word) > 0: 
      wordlist.append(word) 
     word = '' 

print wordlist 
['I', "won't", 'answer', 'this', 'question'] 

Es sólo una plataforma de lanzamiento y definitivamente se puede modificar este algoritmo para que sea más inteligente :)

+0

supongo que tendré que hacer eso (usando expresiones regulares y división). =) – Karthick

9

The Natural Language Toolkit (NLTK) es probablemente lo que usted necesita.

>>> from nltk.tokenize import word_tokenize 
>>> word_tokenize("'Hello. This is a test. It works!") 
["'Hello", '.', 'This', 'is', 'a', 'test', '.', 'It', 'works', '!'] 
>>> word_tokenize("I won't fix your computer") 
['I', 'wo', "n't", 'fix', 'your', 'computer'] 

nltk.tokenize.word_tokenize por defecto utiliza el TreebankWordTokenizer, una palabra que tokenizer tokenizes frases con las convenciones Penn Treebank.

Tenga en cuenta que este tokenizer asume que el texto ya se ha segmentado en oraciones .

Puede probar algunos de los diversos tokenizadores proporcionados por NLTK (es decir, WordPunctTokenizer, WhitespaceTokenizer ...) en este page.

+3

¿Cuál es la razón para la división "no" en "dónde" y "emergencia"? – Cascabel

+0

Debido a que es en realidad dos palabras, ¿no = no lo hará. Por supuesto que no es lo suficientemente inteligente como para reemplazar el dónde y con quiera, pero por ejemplo en la situación de 'don't' no es tan mala :). – skorks

+0

@ Jefromi 'ntlk.word_tokenize' es una palabra tokenizer hizo tokenizes oraciones usando las convenciones utilizadas por el [Árbol Banco Penn] (http://www.cis.upenn.edu/~treebank/tokenization.html). .Según este tokenización, contracciones verbales y el genitivo anglosajón de los sustantivos se separan en sus morfemas compo nentes, y cada morfema es tocado por separado ('won't' ->' donde n't', 'he'll' - > 'él ll'). –

1

NLTK viene con una cantidad de tokenizadores diferentes, y puede ver demostraciones para cada línea en línea en text-processing.com word tokenization demo. Para su caso, parece que el WhitespaceTokenizer es el mejor, que es esencialmente lo mismo que hacer string.split().

5

A pesar de lo que diga, NLTK es su mejor apuesta. No encontrará un método más "probado" que los tokenizadores (ya que algunos están basados ​​en calsificadores capacitados especialmente para esto). Solo necesita elegir el tokenizador correcto para sus necesidades. Tomemos la siguiente oración:

I am a happy teapot that won't do stuff? 

Así es como los diversos tokenizadores en NLTK lo dividirán.

TreebankWordTokenizer

I am a happy teapot that wo n't do stuff ? 

WordPunctTokenizer

I am a happy teapot that won ' t do stuff ? 

PunktWordTokenizer

I am a happy teapot that won 't do stuff ? 

WhitespaceTokenizer

I am a happy teapot that won't do stuff? 

Su mejor apuesta podría ser una combinación de enfoques. Por ejemplo, puede utilizar el PunktSentenceTokenizer a tokenize su correo en primer lugar, este extremle Tiende a ser exacta. Luego, para cada oración, elimine los caracteres de puntuación al final, si los hubiera. Luego use el WhitespaceTokenizer, por lo que evitará la combinación final de puntuación/palabra, p. stuff?, ya que se le han eliminado los caracteres de puntuación final de cada frase, pero aún así saber donde se delimitan las frases (por ejemplo almacenarlos en una matriz) y que no tendrá palabras examinaron won't se divide de forma inesperada.

0

Puede probar esto:

op = [] 
string_big = "One of Python's coolest features is the string format operator This operator is unique to strings" 
Flag = None 
postion_start = 0 
while postion_start < len(string_big): 
    Flag = (' ' in string_big) 
    if Flag == True: 
     space_found = string_big.index(' ') 
     print(string_big[postion_start:space_found]) 
     #print(space_found) 
     op.append(string_big[postion_start:space_found]) 
     #postion_start = space_found 
     string_big = string_big[space_found+1:len(string_big)] 
     #print string_big 
    else: 
     op.append(string_big[postion_start:]) 
     break 

print op 
Cuestiones relacionadas