java - Detectar nombres propios con WordNet?
nlp (4)
Esa información no parece estar almacenada especialmente en WordNet. Sin embargo, puede ver la primera forma de palabra de un sustantivo sysnet para ver si está en mayúscula. No estoy seguro de qué tan oficial es, pero parece funcionar diciendo que volar no es un nombre propio y que Francia sí lo es.
Estoy usando JAWS para acceder a WordNet . Dada una palabra, ¿hay alguna forma de detectar si es un nombre propio? Parece que los synsets tienen categorías léxicas bastante burdas.
Para aclarar, no hay contexto para las palabras, solo se presentan individualmente. Si una palabra podría ser utilizada como un nombre común, es aceptable. Así que "marcar" está bien, porque aunque podría ser el nombre de alguien, también podría referirse a un punto. Sin embargo, "África" no lo es.
Déjame correr este pasado tuyo. Puede que tenga que revisar algunos libros en inglés para comprender mejor el hecho de que uno no puede determinar la parte del discurso de una palabra fuera de contexto.
Lo mejor que puede hacer es probar la exclusión ... determinar que WordNet no conoce el uso en una parte determinada del discurso. En algunos casos, es posible que encuentre que solo una parte del discurso aparece en WordNet. Por ejemplo, no conozco ningún uso de "automóvil" más que como sustantivo.
Distinguir los nombres propios de los comunes es aún más difícil. Ciertamente puedes usar la heurística ... un sustantivo que no es la palabra inicial de una oración y está en mayúscula pero no en ALLCAPS es probablemente un nombre propio.
En última instancia, la distinción es de semántica más que de análisis léxico. Dudo que encuentres una solución razonablemente sólida basada en buscar palabras en WordNet. Creo que tendrás que hacer un análisis gramatical del lenguaje natural antes de poder extraer sustantivos de manera confiable, y mucho menos detectar sustantivos propios en prosa.
Desafortunadamente, no podrá determinar de manera confiable la información de nombres propios de los sintonizadores de WordNet. Lo que estás buscando es un Reconocimiento de Entidad Nombrada . Hay enlaces a varias versiones disponibles en Java desde la página de wikipedia. Personalmente recomendaría Stanford NER o LingPipe .
Actualizado:
En función de la restricción adicional de no tener contexto para las palabras, puede usar las mayúsculas como indicador principal y luego verificar dos veces WordNet para ver si la palabra puede usarse como sustantivo. Quizás algo como esto:
String word = "foo";
boolean isProperNoun = false;
if (Character.isUpperCase(word.charAt(0))) {
WordNetDatabase database = WordNetDatabase.getFileInstance();
Synset[] synsets = database.getSynsets(word, SynsetType.NOUN);
isProperNoun = synsets.length > 0;
}
Eso eliminaría falsos positivos como este:
Si lo construyes ...
Como quieras ...
Oh Romeo, Romeo ...
Y aún captar solo los sustantivos en mayúscula en
En el Libro de Marcos dice ...
¿Has oído The Roots o The Who recientemente?
pero aún te dan falsos positivos en
Marque la primera instancia ...
Libro ''em, Danno.
porque podrían serlo, pero sin contexto no lo sabes.
Si quieres ser realmente complicado, puedes seguir el árbol de hypernym en cualquier sustantivo para ver si alcanzas algo obvio como ''compañía'' o ''país''. Sin embargo, la última vez que trabajé con WordNet (hace 4 años), las relaciones de Hypernym / Hyponym no fueron muy confiables ni consistentes, lo que podría causar muchos falsos negativos (y sin mejorar los falsos positivos que mencioné anteriormente porque esos son completamente Dependiente del contexto).
Si utiliza la línea de comandos de linux para usar Wordnet, puede usar ''wn -synsn'' para obtener todos los sintonizadores de una palabra. Los nombres propios se escriben con mayúscula. P.ej,
$: wn mark -synsn
Synonyms/Hypernyms (Ordered by Estimated Frequency) of noun mark
15 senses of mark
Sense 1
mark, grade, score
=> evaluation, valuation, rating
.
.
.
Sense 8
Mark, Saint Mark, St. Mark
INSTANCE OF=> Apostle, Apostelic Father
INSTANCE OF=> Evangelist
INSTANCE OF=> saint
Pero, en serio, no confíe solo en Wordnet para esto. Hay potencialmente millones de nombres propios para los que Wordnet no obtendrá ninguna información. ¡Prueba el nombre Henrik, por ejemplo!
Sin embargo, puede crear un contexto para su palabra w a partir de conjuntos de datos como Google n-gram corpus, y usar dichos contextos para construir un clasificador que devuelva un puntaje de confianza (es decir, el clasificador puede decir w es un nombre propio con 0 < = c <= 1 confianza.)