2012-03-12 21 views
11

Tengo más de 30,000 artículos en francés en un archivo JSON. Me gustaría realizar algunos análisis de texto en artículos individuales y en el conjunto como un todo. Antes de seguir adelante, estoy empezando con objetivos simples:¿Cómo puedo etiquetar y analizar texto en francés usando NLTK y Python?

  • identificar las entidades importantes (personas, lugares, conceptos)
  • Encuentra cambios significativos en la importancia (~ = frecuencia) de las entidades a través del tiempo (usando el número de secuencia artículo como un proxy para el tiempo)

los pasos que he tomado hasta ahora:

  1. importan los datos en una lista de Python:

    import json 
    json_articles=open('articlefile.json') 
    articlelist = json.load(json_articles) 
    
  2. seleccionado un solo artículo para probar, y concatena el texto del cuerpo en una sola cadena:

    txt = ' '.join(data[10000]['body']) 
    
  3. cargado un tokenizer frase francesa y dividir la cadena en una lista de frases:

    nltk.data.load('tokenizers/punkt/french.pickle') 
    tokens = [french_tokenizer.tokenize(s) for s in sentences] 
    
  4. Ha intentado dividir las oraciones en palabras utilizando el WhiteSpaceTokenizer:

    from nltk.tokenize import WhitespaceTokenizer 
    wst = WhitespaceTokenizer() 
    tokens = [wst.tokenize(s) for s in sentences] 
    

Aquí es donde estoy atascado, por las siguientes razones:

  • NLTK no tiene un señalizador integrado en el que se puede dividir en palabras francesa. El espacio en blanco no funciona bien, en particular debido a que no se separará correctamente en los apóstrofos.
  • Incluso si tuviera que usar expresiones regulares para dividir en palabras individuales, no hay un etiquetador PoS francés (partes del discurso) que pueda usar para etiquetar esas palabras, y no hay forma de dividirlas en unidades lógicas de significado

para Inglés, podría etiquetar y en trozos el texto así:

tagged = [nltk.pos_tag(token) for token in tokens] 
    chunks = nltk.batch_ne_chunk(tagged) 

Mis opciones principales (en orden de preferencia actual) parecen ser:

  1. uso nltk-trainer para entrenar mi propio etiquetador y chunker.
  2. Utilice el contenedor de Python para TreeTagger solo para esta parte, ya que TreeTagger ya puede etiquetar francés, y alguien ha escrito un contenedor que llama al binario TreeTagger y analiza los resultados.
  3. Use una herramienta diferente por completo.

Si tuviera que hacer (1), me imagino que tendría que crear mi propio corpus etiquetado. ¿Es correcto, o sería posible (y predefinido) utilizar el Treebank francés?

Si el formato del corpus French Treebank (example here) no es adecuado para uso con nltk-trainer, ¿es factible convertirlo a dicho formato?

¿Qué enfoques han llevado a los usuarios de NLTK de habla francesa a la etiqueta PoS y al texto del fragmento?

Respuesta

4

Aquí están algunas sugerencias:

  1. WhitespaceTokenizer está haciendo lo que se supone que debe. Si desea dividir en apóstrofes, intente WordPunctTokenizer, revise los otros tokenizadores disponibles, o imprima el suyo con el tokenizador Regexp o directamente con el módulo re.

  2. Asegúrate de haber resuelto los problemas de codificación de texto (unicode o latin1), de lo contrario, la tokenización seguirá fallando.

  3. El nltk solo viene con el etiquetador inglés, como descubriste. Parece que usar TreeTagger sería lo menos posible, ya que está (casi) listo para usar.

  4. Capacitar a los suyos también es una opción práctica. ¡Pero definitivamente no deberías crear tu propio corpus de entrenamiento! Utilice un corpus etiquetado existente de francés. Obtendrá los mejores resultados si el género del texto de capacitación coincide con su dominio (artículos). Además, puede usar nltk-trainer pero también puede usar las funciones NLTK directamente.

  5. Puede utilizar el corpus French Treebank para el entrenamiento, pero no sé si hay un lector que conozca su formato exacto. De lo contrario, debe comenzar con XMLCorpusReader y crear una subclase para proporcionar un método tagged_sents().

  6. Si todavía no está en la lista de distribución de usuarios nltk, creo que querrá participar.

+1

+1 WordPunctTokenizer. Si hay un Treebank francés, entonces ese es probablemente un gran recurso para entrenar a un postagger. Y si requiere la creación de un lector de corpus personalizado, entonces estoy seguro de que NLTK estaría feliz de incluirlo. Una vez que haya hecho eso, nltk-trainer admite la especificación de un lector de corpus personalizado. – Jacob

+0

Gracias Alexis y Jacob. No conozco un corpus etiquetado francés existente, así que probablemente probaré TreeTagger primero. Como dices, probablemente sea más fácil que escribir un lector de corpus personalizado para leer French Treebank. Gracias por la sugerencia re: la lista de correo nltk-users. Leí algunas publicaciones anteriores en el archivo web, pero olvidé suscribirme. – Rahim

5

A partir de la versión 3.1.0 (enero de 2012), el Stanford PoS tagger admite francés.

Debería ser posible utilizar este etiquetador francés en NLTK, usando de Nitin Madnani Interface to the Stanford POS-tagger

No he probado esto todavía, pero suena más fácil que los otros enfoques que he considerado, y que debería ser capaz para controlar todo el pipeline desde dentro de un script de Python. Voy a comentar esta publicación cuando tenga un resultado para compartir.

+0

El etiquetador Stan PoS está lleno de HTML en bruto en francés y se mezcla con palabras en inglés. No recomiendo la solución – c24b

+0

El etiquetador PoS de Stanford parece no ser la mejor manera en términos de rendimiento. Mezclar Python con una JVM no es realmente una manera pitónica de proceder. – toshiro92

5

También hay TreeTagger (compatible con corpus francés) con un contenedor de Python. Esta es la solución que estoy usando actualmente y funciona bastante bien.

Cuestiones relacionadas