2010-10-03 15 views
6

me preguntó cómo que a ir sobre la tokenizar cadenas en Inglés (u otros idiomas occidentales) si se eliminaran los espacios en blanco?Justadistraction: tokenizing Inglés sin espacios en blanco. Murakami Sheepman

La inspiración para la cuestión es el carácter Ovejas Hombre en la novela de Murakami Dance Dance Dance '

En la novela, el hombre ovejas se traduce como diciendo cosas como:

"likewesaid, nos' llunderhatwecan. Trytoreconnectyou, towhatyouwant ", dijo el hombre de las ovejas. "Pero no podemos hacerlo solos. Tú también trabajaste".

Por lo tanto, se conservan algunos signos de puntuación, pero no todos. Suficiente para que un humano lo lea, pero algo arbitrario.

¿Cuál sería su estrategia para la construcción de un analizador para esto? Combinaciones comunes de letras, recuentos de sílabas, gramáticas condicionales, expresiones anticipadas/regexps detrás, etc.

Específicamente, pitón-sabia, ¿cómo estructurar un flujo de traducción (perdón)? No está pidiendo una respuesta completa, solo más cómo su proceso de pensamiento sería sobre la solución del problema.

lo pido de una manera frívola, pero yo creo que es una pregunta que podría obtener algunos (/ PNL/cripto frecuencia/sociales) respuestas interesantes. Gracias!

Respuesta

3

En realidad, hice algo como esto por trabajo hace unos ocho meses. Acabo de utilizar un diccionario de palabras en inglés en una tabla hash (para O (1) veces de búsqueda). Iría letra por letra combinando palabras enteras. Funciona bien, pero hay numerosas ambigüedades. (Asshit puede ser golpeado por el culo o como una mierda). Para resolver esas ambigüedades se requeriría un análisis gramatical mucho más sofisticado.

+0

Usted puede tratar de un árbol de raíz de letra por letra las búsquedas. También le permitiría saber fácilmente si hubo coincidencias potenciales más largas. – Olson

+1

Oh, wow. Había pensado en algo así (un árbol con 26 niños en cada nodo, fue mi idea), pero mi jefe dijo que era una idea ridícula. Debo dejar de escucharlo. > :( – JoshD

+0

+1 Realmente había pensado en algo como esto hace un tiempo. Incluso me encontré con los mismos problemas: "hola allí" == "hithere" == "golpea aquí". "Para obtenerla" == " juntos "==" juntos ". – inspectorG4dget

2

En primer lugar, creo que necesitas un diccionario de palabras en inglés - usted podría intentar algunos métodos que se basan únicamente en algunos análisis estadísticos, pero creo que un diccionario tiene más posibilidades de buenos resultados.

Una vez que tenga las palabras, tiene dos enfoques posibles:

Se podría clasificar las palabras en categorías gramaticales y el uso de una gramática formal para analizar las frases - Obviamente, usted conseguir a veces hay coincidencias con los partidos o múltiples - No estoy familiarizado con las técnicas que te permitirían aflojar las reglas de la gramática en caso de que no coincidan, pero estoy seguro de que debe haber algunas.

Por otro lado, puede tomar un gran corpus de texto en inglés y calcular las probabilidades relativas de que ciertas palabras estén una al lado de la otra, obteniendo una lista de pares y triples de palabras. Como esa estructura de datos sería bastante grande, podría usar categorías de palabras (gramaticales y/o basadas en el significado) para simplificarla. Luego, simplemente construyes un autómata y eliges las transiciones más probables entre las palabras.

estoy seguro de que hay muchos enfoques más posibles. Incluso puede combinar los dos que mencioné, construyendo algún tipo de gramática con peso adjunto a sus reglas. Es un campo rico para experimentar.

1

Esto es solo un código rápido que escribí que creo que funcionaría bastante bien para extraer palabras de un fragmento como el que diste ... No está completamente pensado, pero creo que algo en esta línea funcionaría si no se puede encontrar un tipo de pre-empaquetado de la solución

textstring = "likewesaid, we'lldowhatwecan. Trytoreconnectyou, towhatyouwant," said the Sheep Man. "Butwecan'tdoit-alone. Yougottaworktoo." 

indiv_characters = list(textstring) #splits string into individual characters 

teststring = '' 
sequential_indiv_word_list = [] 

for cur_char in indiv_characters: 
    teststring = teststring + cur_char 
    # do some action here to test the testsring against an English dictionary where you can API into it to get True/False if it exists as an entry 
    if in_english_dict == True: 
     sequential_indiv_word_list.append(teststring) 
     teststring = '' 

#at the end just assemble a sentence from the pieces of sequential_indiv_word_list by putting a space between each word 

Hay algunas cuestiones más por resolver, como si nunca devuelve una coincidencia, esto obviamente no funciona, ya que nunca se correspondería si seguí agregando más caracteres, sin embargo, dado que la secuencia de demostración tenía algunos espacios, podría tener que reconocerlos también y comenzar de nuevo automáticamente en cada uno de estos.

También es necesario dar cuenta de puntuacion, escribir condicionales como

if cur_char == ',' or cur_char =='.': 
    #do action to start new "word" automatically 
Cuestiones relacionadas