2010-02-09 32 views
6

Estoy usando Python 3.1, pero puedo cambiar de versión si es necesario.Python - conteo de frecuencia de letras y traducción

Tengo un archivo ASCII que contiene un cuento escrito en uno de los idiomas cuyo alfabeto se puede representar con ASCII superior o inferior. Deseo:

1) detectar una codificación a lo mejor de mis habilidades, obtener algún tipo de métrica de confianza (variaría dependiendo de la longitud del archivo, a la derecha)

2) traducir automáticamente el conjunto? cosa usando algún servicio gratuito en línea o una biblioteca.

Pregunta adicional: ¿Qué pasa si el texto está escrito en un idioma donde se necesitan 2 o más bytes para representar una letra y la marca de orden de bytes no está allí para ayudarme?

Finalmente, ¿cómo manejo la puntuación y los caracteres misceláneos como el espacio? Ocurrirá con más frecuencia que algunas letras, ¿verdad? ¿Qué hay del hecho de que la puntuación y los caracteres se pueden mezclar a veces, puede haber dos representaciones de una coma, dos representaciones de lo que parece una "a", etc.?

Sí, he leído . Por favor ayúdenme con al menos algunos de estos artículos.

¡Gracias!

P.S. Esta no es una tarea, pero es para propósitos autoeducativos. Prefiero usar una biblioteca de letras de frecuencia que sea de código abierto y legible en comparación con la que está cerrada, eficiente, pero que hace bien el trabajo.

Respuesta

2

En esencia, hay tres tareas principales para poner en práctica la aplicación descrita:

  • 1a) Identificar la codificación de caracteres del texto de entrada
  • 1b) identificar el idioma del texto de entrada
  • 2) Get el texto traducido el texto, a modo de una de las API de servicios en línea

para 1a, es posible que desee echar un vistazo a decodeh.py, aparte de la propia secuencia de comandos, se proporciona muchos recursos muy útiles con respecto a conjuntos de caracteres y codificación en general. CharDet, mencionado en otra respuesta, también parece ser digno de consideración.

Una vez que se conoce la codificación de caracteres, como sugiere, puede resolver 1b) calculando el perfil de frecuencia de caracteres del texto y haciendo que coincida con las frecuencias conocidas.Si bien es simple, este enfoque generalmente proporciona una proporción de precisión decente, aunque puede ser débil en textos más cortos y también en textos que siguen patrones particulares; por ejemplo, un texto en francés con muchas referencias a unidades en el sistema métrico tendrá una proporción inusualmente alta de las letras M, K y C.

Un enfoque complementario y muy similar, use bi-grams (secuencias de dos letras)) y tri-gramos (tres letras) y las tablas correspondientes de referencias de distribución de frecuencia en varios idiomas.

Otros métodos de detección de idiomas implican tokenizar el texto, es decir, teniendo en cuenta las palabras dentro del texto. Los recursos NLP incluyen tablas con las palabras más usadas en varios idiomas. Tales palabras son típicamente artículos, adjetivos posesivos, adverbios y similares.

Una solución alternativa a la detección de idiomas es confiar en el servicio de traducción en línea para resolver esto. Lo que es importante es proporcionar al servicio de traducción texto en una codificación de caracteres que entienda, siempre que el lenguaje sea superfluo.

Finalmente, como muchas aplicaciones NLP prácticas, puede optar por implementar múltiples soluciones. Al usar un patrón de diseño de estrategia, se pueden aplicar varios filtros/clasificadores/pasos en un orden particular, y salir de esta lógica en diferentes puntos dependiendo de la situación. Por ejemplo, si una frecuencia de carácter simple/bigrama coincide con el texto en inglés (con una pequeña desviación), uno puede simplemente detenerse ahí. De lo contrario, si el idioma adivinado es francés o alemán, realice otra prueba, etc, etc

1

Si tiene un archivo ASCII, puedo decirle con 100% de confianza que está codificado en ASCII. Más allá de eso intente chardet. Pero saber que la codificación no es necesariamente suficiente para determinar en qué idioma está.

En cuanto a las codificaciones multibyte, la única forma confiable de manejarlo es esperar que tenga caracteres en el alfabeto latino y buscar qué mitad del el par tiene el NULL. De lo contrario, trátela como UTF-8 a menos que lo sepa mejor (Shift-JIS, GB2312, etc.).

Ah, y UTF-8. UTF-8, UTF-8, UTF-8. No creo que pueda enfatizar eso lo suficiente. Y en caso de que no lo haya hecho ... UTF-8.

+0

Gracias. Por favor, elabore sobre el segundo párrafo. Supongo que mi conocimiento de las codificaciones no es tan profundo como pensaba. –

+2

¿Alguien dijo UTF-8 ?! – jathanism

2

frecuencia carácter es bastante sencillo

Acabo de notar que está utilizando Python3.1 así que esto es aún más fácil

>>> from collections import Counter 
>>> Counter("Μεταλλικα") 
Counter({'α': 2, 'λ': 2, 'τ': 1, 'ε': 1, 'ι': 1, 'κ': 1, 'Μ': 1}) 

Para versiones anteriores de Python:

>>> from collections import defaultdict 
>>> letter_freq=defaultdict(int) 
>>> unistring = "Μεταλλικα" 
>>> for uc in unistring: letter_freq[uc]+=1 
... 
>>> letter_freq 
defaultdict(<class 'int'>, {'τ': 1, 'α': 2, 'ε': 1, 'ι': 1, 'λ': 2, 'κ': 1, 'Μ': 1}) 
+0

Metallika, lol. Bueno, sí, puedo calcular una frecuencia que llamo "ingenua", pero ¿cómo comparo esa distribución con algunas de las conocidas? –

1

que he proporcionado algunas respuestas condicionales sin embargo, su pregunta es un poco vago e inconsistente. Por favor edite su pregunta para proporcionar respuestas a mis preguntas a continuación.

(1) ¿Dice que el archivo es ASCII pero desea detectar una codificación? ¿Huh? ¿No es la respuesta "ascii"? Si realmente necesita detectar una codificación, use chardet

(2) ¿Traducir automáticamente qué? codificación? ¿idioma? Si es el lenguaje, ¿sabe cuál es el idioma de entrada o intenta detectar eso también? Para detectar el lenguaje, pruebe guess-language ... tenga en cuenta que necesita un ajuste para una mejor detección de japonés. Consulte this SO topic que señala el problema japonés y también resalta que para CUALQUIER identificador de lenguaje, necesita eliminar todo el ruido HTML/XML/Javascript/etc de su texto, de lo contrario se sesgará fuertemente el resultado hacia lenguajes solo ASCII como inglés (o catalán !).

(3) Está hablando de una "biblioteca de letras y frecuencias" ... ¿va a utilizar esta biblioteca para hacer qué? Si se adivina el lenguaje, parece que usar frecuencia de letras individuales no ayuda mucho a distinguir entre los idiomas que usan el mismo (o casi el mismo) conjunto de caracteres; uno necesita usar la frecuencia de grupos de tres letras ("trigramas").

(4) Sus preguntas sobre puntuación y espacios: depende de su propósito (del que todavía no estamos seguros). Si el propósito es la detección del lenguaje, la idea es estandarizar el texto; p.ej. reemplace todas las ejecuciones de no (letra o apóstrofo) con un solo espacio, luego elimine cualquier espacio en blanco inicial/final, luego agregue 1 espacio inicial y 1 posterior; se obtiene más precisión al tratar los biagramos de inicio/final de palabra como trigramas.Tenga en cuenta que, como es habitual en todo el procesamiento de texto, debe decodificar su entrada en Unicode inmediatamente y luego trabajar con Unicode.

Cuestiones relacionadas