2009-12-11 39 views
11

¿Alguien sabe la forma más fácil de extraer solo los nombres de un cuerpo de texto?Extraiga los nombres de los textos (Java)

He oído hablar del TreeTagger tool y traté de darle una oportunidad pero no pude hacerlo funcionar por alguna razón.

¿Alguna sugerencia?

Gracias Phil

EDIT:

 import org.annolab.tt4j.*; 
TreeTaggerWrapper tt = new TreeTaggerWrapper(); 

try { tt.setModel("/Nouns/english.par"); 

tt.setHandler(new TokenHandler() { 
    void token(String token, String pos, String lemma) {  
    System.out.println(token+"\t"+pos+"\t"+lemma); } }); 
    tt.process(words); // words = list of words 

    } finally { tt.destroy(); 
}

Esa es mi código, el Inglés es el idioma. Recibí el error: el tipo nuevo TokenHandler() {} debe implementar el método abstracto heredado TokenHandler.token. ¿Estoy haciendo algo mal?

+3

mente para explicar exactamente lo que no funcionó con TreeTagger? –

+1

¿Podría especificar su problema? Especialmente el lenguaje sería bueno saberlo ... El alemán, por ejemplo, tiene la agradable ventaja de que todos los sustantivos tienen la primera letra en mayúscula. – Chris

+0

No estoy familiarizado con la API TreeTagger, pero comenzaría instanciando TokenHandler fuera de setHandler(), que podría dar un mensaje más claro. Mi suposición es que TokenHandler es abstracto, pero ... –

Respuesta

22

Primero deberá tokenar su texto. Esto puede parecer trivial (dividir en cualquier espacio en blanco puede funcionar para usted) pero formalmente es más difícil. Entonces debes decidir qué es un sustantivo. ¿El "estacionamiento" contiene un sustantivo (estacionamiento), dos nombres (automóvil, parque) o un nombre (parque) y un adjetivo (automóvil)? Este es un problema difícil, pero de nuevo puede ser posible sin él.

¿"I saw the xyzzy" identifica un nombre que no está en el diccionario? La palabra "el" probablemente identifica a xyzzy como sustantivo.

Donde están los nombres en "el tiempo vuela como una flecha". Compare con "la fruta vuela como un plátano" (gracias a Groucho Marx).

Utilizamos el etiquetador Brown (Java) (http://en.wikipedia.org/wiki/Brown_Corpus) en el conjunto de herramientas OpenNLP (opennlp.tools.lang.english.PosTagger; opennlp.tools.postag.POSDictionary en http://opennlp.sourceforge.net/) para encontrar los nombres en Inglés normal y que había recomiendo comenzar con eso: hace la mayor parte de lo que piensas por ti. De lo contrario, observe cualquiera de los POSTaggers (http://en.wikipedia.org/wiki/POS_tagger) o (http://www-nlp.stanford.edu/links/statnlp.html#Taggers).

En tagging parte-de-voz por ordenador, es típico de distinguir de 50 a 150 piezas separadas de voz para Inglés, por ejemplo, NN para el singular los nombres comunes, NNS para plural común sustantivos, NP de los nombres propios singulares (ver las etiquetas de punto de venta usados ​​en el Brown Corpus )

Hay una lista muy completa de kits de herramientas de PNL en http://en.wikipedia.org/wiki/Natural_language_processing_toolkits. Le sugiero encarecidamente que use uno de esos en lugar de intentar hacer coincidir Wordnet u otras colecciones.

+0

+1 para las explicaciones. Algunas personas parecen pensar que NLP no es tan difícil, cuando en realidad es una de las cosas más complejas en la informática. Hay una gran cantidad de casos de esquina y todo será inútil cuando de repente cambie el idioma a procesar. Y que, en un nivel más teórico, también tienes el problema de que hay más de 1 definición para sustantivo, o verbo, o pronombre, etc. –

+0

@Maximilian gracias por el apoyo. Estamos de acuerdo en que es difícil. Afortunadamente, solo estamos tratando de interpretar el lenguaje escrito por los químicos y eso es mucho más fácil. –

+0

excelente publicación, gracias. Actualmente descargo lingpipe, estoy en Windows, espero que no tenga muchos guiones .sh desagradables. jaja – Phil

0

Eche un vistazo a la base de datos WordNet. Esta base de datos léxica Podrías tratar de unir cada palabra en contra de ella y verificar si es un sustantivo.

Sin embargo, dudo que tengas el 100% de precisión; la base de datos no coincide con todas las palabras posibles en el idioma inglés, pero al menos es un comienzo.

+1

Eso no es realmente exacto. Por ejemplo, tome la oración "Está caminando hacia la escuela". versus "Dijo que caminar es agotador". Ahora, en la segunda oración, "caminar" es un sustantivo (un verbo nominalizado a través de un gerundio), pero en la primera oración es la forma progresiva del verbo "caminar". Y eso es solo un ejemplo, hay más problemas. –

1

Echa un vistazo LingPipe. Supuestamente, puede elegir named entities del texto en inglés. Pero debo confesar que NLP no es mi área de especialización.

0

La manera más fácil sería comparar cada palabra en el texto con un diccionario de sustantivos. Después de eso, probablemente tendrá que hacer un análisis elemental y aceptar la corrección aproximada de los resultados. Muchas referencias en línea para analizar lenguajes naturales.

0

Busque un sitio web de diccionario con una API (por ejemplo, WS, RESTful) que puede usar para ejecutar consultas de búsqueda.

Los resultados deben venir en un formato fácil de consumir (por ejemplo, XML, JSON) y, por supuesto, deben incluir la categoría léxica de la palabra.

1

Basado en su edición:

El error dice que es necesario sustituir el token método abstracto, y tiene una definición para token en su clase interna anónima, pero tal vez la firma de su token de anulación no lo hace coincide con la firma del método abstracto definido en TokenHandler?

1

mi siguiente código funciona con TreeTagger:

public List<String> tag(String str) { 
    final List<String> tagLemme = new ArrayList<String>(); 
    String[] tokens =tokenizer.tokenize(str); 
     System.setProperty("treetagger.home", "parametresTreeTagger/TreeTagger"); 
    TreeTaggerWrapper tt = new TreeTaggerWrapper<String>(); 
    try { 
     tt.setModel("parametresTreeTagger/english/english.par"); 
     tt.setHandler(new TokenHandler<String>(){ 
       public void token(String token, String pos, String lemma) { 
         tagLemme.add(token + "_" + pos + "_" + lemma); 
         //System.out.println(token + "_" + pos + "_" + lemma); 
       } 
     }); 
     tt.process(asList(tokens)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     } catch (TreeTaggerException e) { 
     e.printStackTrace(); 
    } 
finally { 
     tt.destroy(); 
} 
    return tagLemme; 
} 
+0

Ni siquiera pude instalarlo correctamente http://stackoverflow.com/questions/15503388/treetagger-installation-successful-but-cannot-open-par-file – alvas

+0

Funciona bien para mí –

Cuestiones relacionadas