encoding - teaching - nlp trainer
Teoría: "Codificación léxica" (8)
Estoy usando el término "codificación léxica" para mi falta de una mejor.
Una palabra es posiblemente la unidad fundamental de comunicación en lugar de una letra. Unicode intenta asignar un valor numérico a cada letra de todos los alfabetos conocidos. Lo que es una letra para un idioma, es un glifo para otro. Unicode 5.1 asigna más de 100.000 valores a estos Glyphs actualmente. De las aproximadamente 180,000 palabras que se usan en inglés moderno, se dice que con un vocabulario de aproximadamente 2,000 palabras, debería poder conversar en términos generales. Una "codificación léxica" codificaría cada palabra, no cada letra, y las encapsularía dentro de una oración.
// An simplified example of a "Lexical Encoding"
String sentence = "How are you today?";
int[] sentence = { 93, 22, 14, 330, QUERY };
En este ejemplo, cada Token en la Cadena se codificó como un Entero. El esquema de codificación aquí simplemente asignó un valor int basado en la clasificación estadística generalizada del uso de la palabra, y asignó una constante al signo de interrogación.
En última instancia, una palabra tiene tanto ortografía como significado. Cualquier "codificación léxica" preservaría el significado y la intención de la oración como un todo, y no sería un idioma específico. Una oración en inglés se codificaría en "... elementos atómicos de significado de lenguaje ..." que luego podrían reconstituirse en cualquier lenguaje con una Forma sintáctica estructurada y una Estructura gramatical.
¿Cuáles son otros ejemplos de técnicas de "codificación léxica"?
Si estaba interesado en el origen de las estadísticas de uso de palabras:
http://www.wordcount.org
Este es un pequeño ejercicio interesante, pero le insto a que lo considere nada más que una introducción al concepto de la diferencia en el lenguaje natural entre tipos y tokens.
Un tipo es una instancia única de una palabra que representa todas las instancias. Un token es un recuento único para cada instancia de la palabra. Déjame explicar esto con el siguiente ejemplo:
"Juan fue a la tienda de pan. Compró el pan".
Aquí hay algunos recuentos de frecuencia para este ejemplo, con los recuentos que significan el número de tokens:
John: 1
went: 1
to: 1
the: 2
store: 1
he: 1
bought: 1
bread: 2
Tenga en cuenta que "el" se cuenta dos veces; hay dos tokens de "the". Sin embargo, tenga en cuenta que si bien hay diez palabras, solo hay ocho de estos pares de palabras a frecuencia. Las palabras se dividen en tipos y se combinan con su conteo de fichas.
Los tipos y tokens son útiles en estadísticas NLP. "Codificación léxica" por otro lado, me gustaría tener cuidado. Esta es una transición hacia enfoques mucho más anticuados para la PNL, con abundantes preprogramaciones y racionalismo. Ni siquiera conozco ningún MT estadístico que realmente asigne una "dirección" específica a una palabra. Para empezar, hay demasiadas relaciones entre las palabras para construir cualquier tipo de ontología numérica bien pensada, y si solo estamos lanzando números a las palabras para categorizarlas, deberíamos pensar en cosas como la administración de la memoria y la asignación de velocidad. .
Sugiero revisar NLTK, el kit de herramientas de lenguaje natural, escrito en Python, para una introducción más amplia a NLP y sus usos prácticos.
¿Cómo manejaría el sistema la pluralización de sustantivos o la conjugación de verbos? ¿Tendrían estos cada uno su propio valor "Unicode"?
Como esquema de traducción, esto probablemente no funcionará sin mucho más trabajo. Le gustaría pensar que puede asignar un número a cada palabra, luego traducirlo mecánicamente a otro idioma. En realidad, los idiomas tienen el problema de las palabras múltiples que se deletrean de la misma manera: "el viento le devolvió el pelo" y "enrolla el reloj".
Para transmitir texto, donde presumiblemente tendría un alfabeto por idioma, funcionaría bien, aunque me pregunto qué ganaría allí en lugar de usar un diccionario de longitud variable, como lo hace ZIP.
Es bastante fácil inventar uno para ti. Convierta cada palabra en un bytestream canónico (por ejemplo, UCS32 descompuesto en minúsculas), luego descárguelo en un entero. 32 bits probablemente sería suficiente, pero si no, entonces los 64 bits ciertamente lo harían.
Antes de decidirse por darle una respuesta sarcástica, considere que el propósito de Unicode es simplemente asignarle a cada glifo un identificador único. No para clasificarlos, ordenarlos o agruparlos, sino simplemente para asignarlos a un identificador único en el que todos estén de acuerdo.
Esta pregunta incide en la lingüística más que en la programación, pero para lenguajes altamente sintéticos (que tienen palabras compuestas por múltiples morfemas combinados), puede ser un problema muy complejo tratar de "numerar" todas las palabras posibles, a diferencia de lenguajes como Inglés que son al menos algo aislantes, o idiomas como el chino que son altamente analíticos.
Es decir, las palabras no se pueden dividir y contar fácilmente en función de los glifos que las componen en algunos idiomas.
Este artículo de Wikipedia sobre aislamiento de idiomas puede ser útil para explicar el problema.
En realidad, solo necesitas unas 600 palabras para un vocabulario medio decente.
Esta es una pregunta interesante, pero sospecho que lo estás preguntando por los motivos equivocados. ¿Estás pensando en este Unicode "léxico" como algo que te permitiría descomponer las oraciones en elementos atómicos de sentido del lenguaje y luego ser capaz de reconstituirlos en algún otro lenguaje concreto? Como un medio para lograr un traductor universal, tal vez?
Incluso si puede codificar y almacenar, por ejemplo, una oración en inglés utilizando un "unicode léxico", no puede esperar leerlo y presentarlo mágicamente en, por ejemplo, chino, manteniendo intacto el significado.
Sin embargo, su analogía con Unicode es muy útil.
Tenga en cuenta que Unicode, aunque es un código "universal", no incluye la pronunciación, el significado o el uso del personaje en cuestión. Cada punto de código se refiere a un glifo específico en un idioma específico (o más bien el guión utilizado por un grupo de idiomas). Es elemental en el nivel de representación visual de un glifo (dentro de los límites de estilo, formato y fuentes). El punto de código Unicode para la letra latina ''A'' es solo eso. Es la letra latina ''A''. No se puede representar automágicamente como, por ejemplo, la letra árabe Alif (ا) o la letra índica (Devnagari) ''A'' (अ).
Siguiendo la analogía de Unicode, su Unicode léxico tendría puntos de código para cada palabra (forma de palabra) en cada idioma. Unicode tiene rangos de puntos de código para un script específico. Su Unicode léxico debería tener un rango de códigos para cada idioma. Las diferentes palabras en diferentes idiomas, incluso si tienen el mismo significado (sinónimos), tendrían que tener diferentes puntos de código. La misma palabra que tiene diferentes significados, o diferentes pronunciaciones (homónimos), debería tener diferentes puntos de código.
En Unicode, para algunos idiomas (pero no todos) donde el mismo personaje tiene una forma diferente dependiendo de su posición en la palabra, por ejemplo, en hebreo y árabe, la forma de un glifo cambia al final de la palabra, entonces tiene un punto de código diferente. Asimismo, en su Unicode léxico, si una palabra tiene una forma diferente dependiendo de su posición en la oración, puede garantizar su propio punto de código.
Quizás la forma más fácil de encontrar puntos de código para el idioma inglés sea basar su sistema en, digamos, una edición particular del Oxford English Dictionary y asignarle un código único a cada palabra secuencialmente. Tendrá que usar un código diferente para cada significado diferente de la misma palabra, y deberá usar un código diferente para las diferentes formas; por ejemplo, si la misma palabra se puede usar como sustantivo y como verbo, entonces necesitará dos códigos
Luego, tendrá que hacer lo mismo para cada otro idioma que quiera incluir, utilizando el diccionario más autorizado para ese idioma.
Lo más probable es que este ejercicio sea más esfuerzo de lo que vale. Si decides incluir todos los idiomas vivos del mundo, además de algunos muertos históricos y algunos de ficción, como lo hace Unicode, terminarás teniendo un espacio de código tan grande que tu código tendría que ser extremadamente ancho para acomodarlo. No obtendrá nada en términos de compresión: es probable que una oración representada como una cadena en el idioma original ocupe menos espacio que la misma oración representada como código.
PD: para aquellos que dicen que esto es una tarea imposible porque los significados de las palabras cambian, no lo veo como un problema. Para usar la analogía de Unicode, el uso de las letras ha cambiado (ciertamente no tan rápido como el significado de las palabras), pero no es de preocupación para Unicode que ''th'' solía pronunciarse como ''y'' en la Edad Media. Unicode tiene un punto de código para ''t'', ''h'' e ''y'' y cada uno cumple su función.
PPS En realidad, es preocupante para Unicode que ''oe'' también sea ''œ'' o que ''ss'' se pueda escribir ''ß'' en alemán.
Hay varios problemas importantes con esta idea. En la mayoría de los idiomas, el significado de una palabra y la palabra asociada con un significado cambian muy rápidamente.
Tan pronto como tenga un número asignado a una palabra, antes de que el significado de la palabra cambie. Por ejemplo, la palabra "gay" solía significar solo "feliz" o "feliz", pero ahora se usa principalmente para referirse a homosexual. Otro ejemplo es el morfema "gracias" que originalmente vino del alemán "danke" que es solo una palabra. Otro ejemplo más es "Adiós", que es un acortamiento de "Dios te bendiga".
Otro problema es que incluso si uno toma una instantánea de una palabra en cualquier punto del tiempo, el significado y el uso de la palabra estarían en disputa, incluso dentro de la misma provincia. Cuando se escriben diccionarios, no es raro que los académicos responsables discutan sobre una sola palabra.
En resumen, no podrías hacerlo con un idioma existente. Tendría que considerar inventar un lenguaje propio, para el propósito, o usar un lenguaje bastante estático que ya se haya inventado, como Interlingua o Esperanto. Sin embargo, incluso estos no serían perfectos para definir los morfemas estáticos en un léxico siempre estándar.
Incluso en chino, donde hay un mapeo aproximado del carácter con el significado, todavía no funcionaría. Muchos personajes cambian sus significados dependiendo de ambos contextos, y qué caracteres preceden o postfijan.
El problema es peor cuando intentas traducir entre idiomas. Puede haber una palabra en inglés que se puede usar en varios casos, pero que no se puede usar directamente en otro idioma. Un ejemplo de esto es "gratis". En español, se puede usar "libre", que significa "gratis" como en el habla, o "gratis", que significa "gratis", como en la cerveza (y usar la palabra incorrecta en lugar de "gratis" sería muy divertido).
Hay otras palabras que son aún más difíciles de ponerle sentido, como la palabra hermosa en coreano; cuando se llama hermosa a una chica, habría varios candidatos para la sustitución; pero cuando se dice que la comida es hermosa, a menos que quiera decir que la comida es buena, hay varios otros candidatos que son completamente diferentes.
A lo que se reduce, aunque solo usamos unas 200 mil palabras en inglés, nuestros vocabularios son en realidad más grandes en algunos aspectos porque asignamos muchos significados diferentes a la misma palabra. Los mismos problemas se aplican al Esperanto e Interlingua, y a cualquier otro idioma significativo para la conversación. El habla humana no es una máquina bien definida y bien engrasada. Entonces, a pesar de que podría crear un léxico tal que cada "palabra" tuviera su propio significado único, sería muy difícil, y casi imposible para las máquinas que usan técnicas actuales, traducir de cualquier lenguaje humano a su léxico estandarizado especial.
Esta es la razón por la cual la traducción automática todavía apesta, y lo seguirá haciendo durante mucho tiempo. Si puede hacerlo mejor (y espero que pueda hacerlo), entonces probablemente debería considerar hacerlo con algún tipo de beca y / o financiamiento de la universidad / gobierno, trabajando para un PHD; o simplemente haga un montón de dinero, lo que sea que mantenga a su barco humeante.