¿Qué algoritmos / herramientas de programación se utilizan para aplicaciones web basadas en análisis de texto como ‘I Write Like’ o ‘750Words’?

Estoy de acuerdo con Ghalib Suleiman en que el primer paso para comparar dos textos es generar una frecuencia de palabra (fácil) o quizás una frecuencia de bi-gramo o n-gramo (más difícil) como se describe en http://en.wikipedia.org/ wiki / Lan … Precalcula estas frecuencias para varios autores (digamos Stephen King y Shakespeare) y obtienes vectores de probabilidades , que el artículo del modelo de lenguaje describe como [matemáticas] P (w_1, …, w_n) [/ matemáticas]. Debe imaginar e implementar estos de manera efectiva como hashes / colecciones / asociaciones algo así como:
[matemáticas] \ vec {P} _ {rey} = [“cujo” = 0.25, “brillante” = 0.25] [/ matemáticas]
y
[matemáticas] \ vec {P} _ {shakespeare} = [“allá” = 0.50, “tu” = 0.60] [/ matemáticas]
pero poblada con muchas más palabras o n-gramas y sus frecuencias de ocurrencia. Luego, cuando alguien envía una muestra de escritura, usted calcula un vector / hash para ellos [matemáticas] \ vec {P} _ {usuario} = [“the” = 0.25, “omg” = 0.50, “gaga” = 0.33] [/ mates].
Lo que luego hace con estos vectores, la comparación del vector multidimensional de un usuario con los vectores precalculados de los autores … ah, bueno, resulta que de eso se trata la personalización y la recomendación en Internet, comparando vectores de información sobre personas, agrupación o agrupación de personas para que pueda recomendarle cosas a una persona en función de lo que otras personas en su grupo hayan hecho, comprado, leído, visto, comprado, escuchado, jugado o comentado, encontrando conexiones probables entre personas basadas en sus vectores.
Aunque existen algoritmos profundos en el aprendizaje automático y en otras partes de la ciencia de la computación que realmente se vuelven locos con estas comparaciones “vectoriales”, un algoritmo muy rápido de “emparejamiento” en situaciones como “I Write Like” es simplemente una comparación de productos de punto, también conocido como [matemáticas] \ Theta [/ matemáticas] – comparación de ángulos – calculando el ángulo entre el vector del usuario y cada uno de los vectores del autor mediante el uso de la ecuación del producto de punto:
[matemáticas] \ vec {P} _ {usuario} \ cdot \ vec {P} _ {autor} = \ parallel \ vec {P} _ {usuario} \ parallel \ parallel \ vec {P} _ {author} \ parallel \ cos \ Theta [/ matemáticas]
asi que
[matemáticas] \ cos \ Theta = {\ vec {P} _ {usuario} \ cdot \ vec {P} _ {autor} \ over \ parallel \ vec {P} _ {usuario} \ parallel \ parallel \ vec {P } _ {author} \ parallel} [/ math] y hacer coincidir el usuario con el autor con la menor distancia [math] \ Theta [/ math].
(Si no está claro cómo las palabras son “dimensiones” y las probabilidades son “magnitudes” en estos “vectores” y cómo calcularía sus valores, puedo agregar algunos indicadores adicionales. La primera vez que manipula datos de esta manera es siempre el mayor salto mental: entonces comienzas a encontrar álgebra lineal debajo de cada roca en informática.

Miré a ambos sitios web y no pude saber qué cosas avanzadas hace 750Words (si las hubiera), pero para ‘I Write Like’, una forma popular de hacer este tipo de cosas es generar primero un modelo de lenguaje ( http: // en .wikipedia.org / wiki / Lan …) para cada autor de conjuntos de escritura preexistentes. Puede pensar en esto como generar una tabla de probabilidades para cada secuencia de palabras (generalmente de longitud 3 o 4) posiblemente escrita por ese autor.

Luego, por cada nueva pieza de escritura (en el caso de ‘I Write Like’, que sería la escritura que pegue), se realiza una coincidencia con el modelo más probable y se devuelve el autor de ese modelo. Desde un nivel alto, el algoritmo es algo como esto:

1) Generar un modelo de idioma por autor a partir de textos preexistentes.
2) Dado el nuevo texto t:
para cada modelo m:
Sea p = probabilidad de que t sea generada por m
Autor de salida cuyo modelo da la p más alta

He tratado de mantener las cosas lo suficientemente simples, pero avíseme si no he sido claro.

Puede ver el código fuente de iwritelike en https://github.com/dchest/iwl

Puede encontrar interesante el ensayo de Paul Graham “A Plan for Spam”. Tenía curiosidad sobre el análisis de texto recientemente y este ensayo me dio una buena idea de cómo funciona, al menos en un contexto. http://www.paulgraham.com/spam.html

Me parece que un buen tipo de análisis tipo I-write tendría que profundizar más que la frecuencia de palabras, bi-gramos y n-gramos. También analizaría el ritmo y la estructura (p. Ej., Longitud promedio de palabras, oraciones y párrafos, longitud relativa de palabras consecutivas, oraciones y párrafos, frecuencia de diferentes partes del discurso y tipos de puntuación por ubicación de párrafo, frecuencia de repetición de palabras dentro de la oración / oraciones consecutivas, etc.).