libreria - ¿Hay API para el análisis/extracción de texto en Java?
streams java ejemplos (5)
Quiero saber si hay una API para hacer análisis de texto en Java. Algo que puede extraer todas las palabras en un texto, separar palabras, expresiones, etc. Algo que puede informar si una palabra encontrada es un número, fecha, año, nombre, moneda, etc.
Estoy comenzando el análisis de texto ahora, así que solo necesito una API para comenzar. Hice un rastreador web, ahora necesito algo para analizar los datos descargados. Se necesitan métodos para contar la cantidad de palabras en una página, palabras similares, tipo de datos y otros recursos relacionados con el texto.
¿Hay API para el análisis de texto en Java?
EDITAR: minería de texto, quiero minar el texto. Una API para Java que proporciona esto.
Parece que estás buscando un Reconocimiento de entidad con nombre .
Tienes un par de opciones.
CRFClassifier del Stanford Natural Language Processing Group, es una implementación de Java de un reconocedor de entidades con nombre.
GATE (Arquitectura general para ingeniería de texto) , un conjunto de código abierto para el procesamiento del lenguaje. Eche un vistazo a las capturas de pantalla en la página para desarrolladores: http://gate.ac.uk/family/developer.html . Debería darle una breve idea de lo que esto puede hacer. El video tutorial le brinda una mejor visión general de lo que este software tiene para ofrecer.
Es posible que necesite personalizar uno de ellos para satisfacer sus necesidades.
También tienes otras opciones:
- extracción de texto simple a través de servicios web: por ejemplo Tagthe.net y Term Extractor de Yahoo .
- etiquetado de parte de la palabra (POS) : extracción de parte del discurso (por ejemplo, verbos, sustantivos) del texto. Aquí hay una publicación en SO: ¿Qué es una buena biblioteca de Java para el etiquetado Parts-Of-Speech? .
En términos de capacitación para CRFClassifier, puede encontrar una breve explicación en sus preguntas frecuentes :
... los datos de entrenamiento deben estar en columnas separadas por tabulaciones, y usted define el significado de esas columnas a través de un mapa. Una columna debe llamarse "respuesta" y tiene la clase NER, y las características existentes conocen nombres como "palabra" y "etiqueta". Usted define el archivo de datos, el mapa y las características que generará a través de un archivo de propiedades. Existe una documentación considerable de las características que generan diferentes propiedades en el Javadoc de NERFeatureFactory, aunque en última instancia debe ir al código fuente para responder algunas preguntas ...
También puede encontrar un fragmento de código en el javadoc de CRFClassifier :
Uso típico de línea de comandos
Para ejecutar un modelo entrenado con un clasificador serializado provisto en un archivo de texto:
java -mx500m edu.stanford.nlp.ie.crf.CRFClassifier -loadClassifier conll.ner.gz -textFile samplesentences.txt
Al especificar todos los parámetros en un archivo de propiedades (tren, prueba o tiempo de ejecución):
java -mx1g edu.stanford.nlp.ie.crf.CRFClassifier -prop propFile
Para entrenar y probar un modelo NER simple desde la línea de comando:
java -mx1000m edu.stanford.nlp.ie.crf.CRFClassifier -trainFile trainFile -testFile testFile -macro > output
Preferiría adaptar las clases de Análisis y Stemmer de Lucene en lugar de reinventar la rueda. Tienen una gran mayoría de casos cubiertos. Ver también las clases adicionales y contrib.
Si está tratando con grandes cantidades de datos, tal vez el Lucene de Apache le ayude con lo que necesita.
De lo contrario, podría ser más fácil crear su propia clase de Analizador que se apoye fuertemente en la clase de Patrón estándar. De esta forma, puede controlar qué texto se considera una palabra, un límite, un número, una fecha, etc. Por ejemplo, ¿20110723 es una fecha o número? Es posible que necesite implementar un algoritmo de análisis de paso múltiple para "comprender" mejor los datos.
También recomiendo mirar LingPipe . Si está de acuerdo con los servicios web, este artículo tiene un buen resumen de diferentes API
Por ejemplo, puede usar algunas clases de la biblioteca estándar java.text
o usar StreamTokenizer
(puede personalizarlo según sus requisitos). Pero como usted sabe, los datos de texto de las fuentes de Internet suelen tener muchos errores ortográficos y, para obtener un mejor rendimiento, debe usar algo como el token de fuzzy : java.text y otras utilidades estándar tienen capacidades demasiado limitadas en dicho contexto .
Por lo tanto, te aconsejo que uses expresiones regulares (java.util.regex) y crees un tipo de tokenizador propio según tus necesidades.
PD De acuerdo con sus necesidades, puede crear un analizador de máquina de estado para reconocer partes con plantilla en textos sin formato. Puede ver el reconocedor de máquina de estado simple en la imagen a continuación (puede construir un analizador más avanzado, que podría reconocer plantillas mucho más complejas en el texto).