.net - online - ¿Cómo determinar el lenguaje(natural) de un documento?
text mining software 2017 (11)
Tengo un conjunto de documentos en dos idiomas: inglés y alemán. No hay información meta utilizable sobre estos documentos, un programa puede ver solo el contenido. Sobre esta base, el programa debe decidir en cuál de los dos idiomas está escrito el documento.
¿Existe algún algoritmo "estándar" para este problema que pueda implementarse en unas pocas horas? ¿O alternativamente, una biblioteca .NET gratuita o un kit de herramientas que puede hacer esto? Sé de LingPipe , pero es
- Java
- No es gratis para uso "semi-comercial"
Este problema parece ser sorprendentemente difícil. Revisé la API de Google AJAX Language (que encontré al buscar en este sitio primero), pero fue ridículamente mala. Para seis páginas web en alemán a las que apunté solo una suposición era correcta. Las otras conjeturas fueron suecas, inglesas, danesas y francesas ...
Un enfoque simple que se me ocurrió es usar una lista de palabras vacías. Mi aplicación ya usa dicha lista para documentos alemanes para analizarlos con Lucene.Net. Si mi aplicación escanea los documentos en busca de ocurrencias de palabras vacías en cualquiera de los dos idiomas, la que tenga más repeticiones ganará. Un enfoque muy ingenuo, sin duda, pero podría ser lo suficientemente bueno. Lamentablemente, no tengo tiempo para convertirme en un experto en procesamiento de lenguaje natural, aunque es un tema interesante.
¿Has probado Apache Tika ? Puede determinar el idioma de un texto dado:
No tengo experiencia con .Net pero ese enlace podría ayudar. Si puedes ejecutar un jar en tu entorno, prueba esto:
java -jar tika-app-1.0.jar -l http://www.admin.ch/
Salida:
de
Espero que ayude.
¿No es más fácil el problema varios órdenes de magnitud si solo tiene dos idiomas (inglés y alemán) para elegir? En este caso, su enfoque de una lista de palabras vacías puede ser lo suficientemente bueno.
Obviamente, deberías considerar una reescritura si agregaste más idiomas a tu lista.
Creo que el procedimiento estándar es medir la calidad de un algoritmo propuesto con datos de prueba (es decir, con un corpus ). Defina el porcentaje de análisis correcto que desea que logre el algoritmo y luego ejecútelo sobre una serie de documentos que ha clasificado manualmente.
En cuanto al algoritmo específico: usar una lista de palabras para detener suena bien. Otro enfoque que se ha informado que funciona es usar un filtro bayesiano , por ejemplo, SpamBayes . En lugar de entrenarlo en jamón y correo no deseado, entrenarlo en inglés y alemán. Use una parte de su cuerpo, ejecútelo a través de spambayes y luego pruébelo con los datos completos.
El enfoque de las palabras de alto nivel para los dos idiomas es rápido y se haría más rápido si se ponderaran los que no aparecen en el otro idioma "das" en alemán y "the" en inglés, por ejemplo. El uso de las "palabras exclusivas" ayudaría a extender este enfoque sólidamente a un grupo más grande de idiomas también.
El inglés y el alemán usan el mismo conjunto de letras, excepto ä, ö, ü y ß (eszett). Puedes buscar esas letras para determinar el idioma.
También puede consultar este texto ( Comparación de dos esquemas de identificación de idioma ) desde Grefenstette. Mira las letras trigramas y palabras cortas. Trigramas comunes para alemán en_, er_, _de. Trigramas comunes para el inglés the_, he_, the ...
También está Bob Carpenter. ¿Cómo realiza LingPipe la identificación de idioma?
El problema con el uso de una lista de palabras vacías es uno de robustez. Las listas de palabras de parada son básicamente un conjunto de reglas, una regla por palabra. Los métodos basados en reglas tienden a ser menos robustos a los datos invisibles que los métodos estadísticos. Algunos de los problemas con los que se encontrará son documentos que contienen recuentos iguales de palabras para parar en cada idioma, documentos que no tienen palabras para parar, documentos que tienen palabras en el idioma incorrecto, etc. Los métodos basados en reglas no pueden hacer nada que sus reglas no hagan. t especifica
Un enfoque que no requiere que usted mismo implemente Naive Bayes o cualquier otro algoritmo matemático o de aprendizaje automático complicado es contar bigramas y trigramas de caracteres (dependiendo de si tiene mucha o poca información con la cual comenzar, los bigramas trabajar con menos datos de entrenamiento). Ejecute los conteos en un puñado de documentos (cuanto más mejor) del idioma de origen conocido y luego construya una lista ordenada para cada idioma por el número de conteos. Por ejemplo, el inglés tendría "th" como el bigrama más común. Con sus listas ordenadas en la mano, cuente los bigramas en un documento que desee clasificar y ordénelos. Luego repase cada una y compare su ubicación en la lista de documentos desconocidos ordenados con su rango en cada una de las listas de capacitación. Dar a cada bigrama una puntuación para cada idioma como
1 / ABS(RankInUnknown - RankInLanguage + 1)
.
El idioma que obtenga la puntuación más alta es el ganador. Es simple, no requiere mucha codificación y no requiere muchos datos de entrenamiento. Aún mejor, puedes seguir agregándole datos a medida que avanzas y mejorará. Además, no tiene que crear a mano una lista de palabras vacías y no fallará solo porque no hay palabras vacías en un documento.
Todavía se confundirá con documentos que contienen igual número de bigramas simétricos. Si puede obtener suficientes datos de entrenamiento, el uso de trigramas hará que esto sea menos probable. Pero el uso de trigramas significa que también necesita que el documento desconocido sea más largo. Los documentos realmente cortos pueden requerir que se desplieguen en conteos de un solo carácter (unigram)
Todo esto dicho, vas a tener errores. No hay bala de plata. Combinar métodos y elegir el idioma que maximice su confianza en cada método puede ser lo más inteligente.
La detección del lenguaje no es muy difícil conceptualmente. Por favor mire mi respuesta a una pregunta relacionada y otras respuestas a la misma pregunta.
En caso de que desee tomar una oportunidad de escribirlo usted mismo, debería poder escribir un detector ingenuo en medio día. Usamos algo similar al siguiente algoritmo en el trabajo y funciona sorprendentemente bien. También lea el tutorial de implementación de python en la publicación que vinculé.
Pasos
Tome dos corpus para los dos idiomas y extraiga bigramas a nivel de caracteres, trigramas y tokens (palabras) delimitados por espacios en blanco. Mantenga un seguimiento de sus frecuencias. Este paso construye su "Modelo de Idioma" para ambos idiomas.
Dado un fragmento de texto, identifique los bigramas de caracteres, los trigramas y las fichas delimitadas por espacios en blanco y sus correspondientes "frecuencias relativas" para cada corpus. Si falta una "característica" particular (char bigram / trigram o token) en su modelo, trate su "cuenta bruta" como 1 y utilícela para calcular su "frecuencia relativa".
El producto de las frecuencias relativas para un idioma en particular da la "puntuación" para el idioma. Esta es una aproximación muy ingenua de la probabilidad de que la oración pertenezca a ese idioma.
El lenguaje de mayor puntuación gana.
Nota 1: tratamos la "cuenta bruta" como 1 para las características que no se producen en nuestro modelo de idioma. Esto se debe a que, en realidad, esa característica tendría un valor muy pequeño, pero dado que tenemos un corpus finito, es posible que no lo hayamos encontrado todavía. Si considera que su conteo es cero, entonces su producto completo también sería cero. Para evitar esto, asumimos que su ocurrencia es 1 en nuestro cuerpo. Esto se denomina suavizado adicional. Existen otras técnicas avanzadas de alisado .
Nota 2: Ya que estará multiplicando un gran número de fracciones, puede ejecutar fácilmente a cero. Para evitar esto, puedes trabajar en un espacio logarítmico y usar esta ecuación para calcular tu puntuación.
a X b = exp(log(a)+log(b))
Nota 3: El algoritmo que describí es una versión "muy ingenua" del " Algoritmo ingenuo de Bayes ".
Lo primero es lo primero, debe configurar una prueba de su solución actual y ver si alcanza el nivel de precisión deseado. El éxito en su dominio específico es más importante que seguir un procedimiento estándar.
Si su método necesita mejorar, intente ponderar sus palabras de alto por la rareza en un corpus grande de inglés y alemán. O podrías usar una técnica más complicada como entrenar un modelo de Markov o un clasificador bayesiano . Puede ampliar cualquiera de los algoritmos para ver n-grams orden superior (por ejemplo, dos o tres secuencias de palabras) u otras características en el texto.
Puede utilizar la API de detección de idioma de Google.
Aquí hay un pequeño programa que lo usa:
baseUrl = "http://ajax.googleapis.com/ajax/services/language/detect"
def detect(text):
import json,urllib
"""Returns the W3C language code of a natural language"""
params = urllib.urlencode({''v'': ''1.0'' , "q":text[0:3000]}) # only use first 3000 characters
resp = json.load(urllib.urlopen(baseUrl + "?" + params))
try:
retText = resp[''responseData''][''language'']
except:
raise
return retText
def test():
print "Type some text to detect its language:"
while True:
text = raw_input(''#> '')
retText = detect(text)
print retText
if __name__==''__main__'':
import sys
try:
test()
except KeyboardInterrupt:
print "/n"
sys.exit(0)
Otras referencias útiles:
Google anuncia API (y demostración): http://googleblog.blogspot.com/2008/03/new-google-ajax-language-api-tools-for.html
Envoltura de Python: http://code.activestate.com/recipes/576890-python-wrapper-for-google-ajax-language-api/
Otro script en python: http://www.halotis.com/2009/09/15/google-translate-api-python-script/
RFC 1766 define lenguajes W3C
Obtenga los códigos de idioma actuales en: http://www.iana.org/assignments/language-subtag-registry
Si está buscando flexionar sus músculos de programación intentando resolver el problema usted mismo, lo aliento a que lo haga; sin embargo, la rueda existe si desea que la use.
Windows 7 viene con esta funcionalidad incorporada. Un componente llamado "Servicios Lingüísticos Extendidos" (ELS) tiene la capacidad de detectar scripts y lenguajes naturales, y está en la caja, en cualquier máquina con Windows 7 o Windows Server 2008. Dependiendo de si tiene alguna de esas máquinas disponibles y de lo que quiere decir cuando dice "gratis", eso lo hará por usted. En cualquier caso, esta es una alternativa a Google o a los otros proveedores mencionados aquí.
http://msdn.microsoft.com/en-us/library/dd317700(v=VS.85).aspx
Y si desea acceder a esto desde .NET, hay información aquí:
http://windowsteamblog.com/blogs/developers/archive/2009/05/18/windows-7-managed-code-apis.aspx
Espero que ayude.
Trate de medir las ocurrencias de cada letra en el texto. Para los textos en inglés y alemán se calculan las frecuencias y, tal vez, las distribuciones de los mismos. Una vez obtenidos estos datos, puede razonar a qué idioma pertenece la distribución de frecuencias de su texto.
Debe usar la inferencia bayesiana para determinar el idioma más cercano (con cierta probabilidad de error) o, quizás, existen otros métodos estadísticos para tales tareas.