Etiquetado POS en alemán

Estoy usando NLTK para extraer nombres de una cadena de texto que comienza con el siguiente comando:

tagged_text = nltk.pos_tag(nltk.Text(nltk.word_tokenize(some_string))) 

Funciona bien en inglés. ¿Hay una manera fácil de hacer que funcione para el alemán también?

(No tengo experiencia con la progtwigción en lenguaje natural, pero me las arreglé para usar la biblioteca nltk de python, que es genial hasta ahora)

El software de lenguaje natural hace su magia al aprovechar los cuerpos y las estadísticas que proporcionan. Tendrá que decirle a nltk acerca de algunos corpus alemanes para ayudarlo a tokenize alemán correctamente. Creo que el corpus de EUROPARL podría ayudarte a ponerte en marcha.

Consulte nltk.corpus.europarl_raw y esta respuesta para la configuración de ejemplo.

También, considere etiquetar esta pregunta con “nlp”.

La biblioteca de patrones incluye una función para analizar oraciones en alemán y el resultado incluye las tags de parte del discurso. Lo siguiente se copia de su documentación:

 from pattern.de import parse, split s = parse('Die Katze liegt auf der Matte.') s = split(s) print s.sentences[0] >>> Sentence('Die/DT/B-NP/O Katze/NN/I-NP/O liegt/VB/B-VP/O' 'auf/IN/B-PP/B-PNP der/DT/B-NP/I-PNP Matte/NN/I-NP/I-PNP ././O/O') 

Si prefiere el conjunto de tags SSTS, puede configurar el parámetro opcional tagset="STTS" .

El etiquetado de parte del discurso (POS) es muy específico de un lenguaje [natural] particular. NLTK incluye muchos etiquetadores diferentes, que utilizan distintas técnicas para inferir la etiqueta de un token dado en un token dado. La mayoría (pero no todos) de estos etiquetadores utilizan un modelo estadístico de tipo como el dispositivo principal o único para “hacer el truco”. Tales etiquetadores requieren algunos “datos de entrenamiento” sobre los cuales construir esta representación estadística del lenguaje, y los datos de entrenamiento vienen en forma de corpus.

La “distribución” de NTLK incluye muchos de estos corpus, así como un conjunto de “lectores de corpus” que proporcionan una API para leer diferentes tipos de corpus. No conozco el estado de cosas en NTLK propiamente dicho, y si esto incluye algún corpus alemán. Sin embargo, puede encontrar gratis algunos corpus gratuitos que luego deberá convertir a un formato que satisfaga al lector de corpus NTLK adecuado, y luego puede usar esto para capacitar a un etiquetador de POS para el idioma alemán.

Incluso puedes crear tu propio corpus, pero ese es un trabajo minucioso; Si trabajas en una universidad, debes encontrar formas de sobornar y de otra manera forzar a los estudiantes a que hagan eso por ti 😉

Posiblemente puede utilizar el etiquetador POS Stanford. A continuación hay una receta que escribí. Hay recetas de Python para la PNL alemana que he comstackdo y puedes acceder a ellas en http://htmlpreview.github.io/?https://github.com/alvations/DLTK/blob/master/docs/index.html

 #-*- coding: utf8 -*- import os, glob, codecs def installStanfordTag(): if not os.path.exists('stanford-postagger-full-2013-06-20'): os.system('wget http://nlp.stanford.edu/software/stanford-postagger-full-2013-06-20.zip') os.system('unzip stanford-postagger-full-2013-06-20.zip') return def tag(infile): cmd = "./stanford-postagger.sh "+models[m]+" "+infile tagout = os.popen(cmd).readlines() return [i.strip() for i in tagout] def taglinebyline(sents): tagged = [] for ss in sents: os.popen("echo '''"+ss+"''' > stanfordtemp.txt") tagged.append(tag('stanfordtemp.txt')[0]) return tagged installStanfordTag() stagdir = './stanford-postagger-full-2013-06-20/' models = {'fast':'models/german-fast.tagger', 'dewac':'models/german-dewac.tagger', 'hgc':'models/german-hgc.tagger'} os.chdir(stagdir) print os.getcwd() m = 'fast' # It's best to use the fast german tagger if your data is small. sentences = ['Ich bin schwanger .','Ich bin wieder schwanger .','Ich verstehe nur Bahnhof .'] tagged_sents = taglinebyline(sentences) # Call the stanford tagger for sent in tagged_sents: print sent 

He escrito un blog sobre cómo convertir el Corpus TIGER anotado alemán para usarlo con el NLTK. Échale un vistazo aquí.