2012-03-18 13 views
5

Me gustaría crear un algoritmo para distinguir a las personas que escriben en el foro bajo diferentes apodos.Descubre el usuario detrás de múltiples cuentas de usuario diferentes según las palabras que usa

El objetivo es descubrir a las personas que registran una cuenta nueva en el foro de llama de forma anónima, no en su cuenta principal.

Básicamente estaba pensando en derivar palabras que usan y comparar usuarios según las similitudes o estas palabras.

Users using words

Como se muestra en la imagen no es User3 y user4 que utiliza mismas palabras. Significa que probablemente haya una persona detrás de la computadora.

Está claro que hay muchas palabras comunes que están siendo utilizadas por todos los usuarios. Así que debería centrarme en las palabras "específicas del usuario".

de entrada está (relacionado con la imagen de arriba):

<word1, user1> 
<word2, user1> 
<word2, user2> 
<word3, user2> 
<word4, user2> 
<word5, user3> 
<word5, user4> 
... etc. The order doesnt matter 

de salida debe ser:

user1 
user2 
user3 = user4 

estoy haciendo esto en Java pero quiero esta pregunta sea independiente del lenguaje.

¿Alguna idea de cómo hacerlo?

1) cómo almacenar palabras/usuarios? ¿Qué estructuras de datos?

2) ¿cómo deshacerse de las palabras comunes que todo el mundo usa? Tengo que ignorarlos de alguna manera entre las palabras específicas del usuario. Tal vez podría simplemente ignorarlos porque se pierden. Me temo que van a ocultar la diferencia significativa de "palabras específicas del usuario"

3) ¿cómo reconocer a los mismos usuarios? - de alguna manera contar las mismas palabras entre cada usuario?

Estoy muy agradecido por cada consejo con antelación.

Respuesta

1

Recomiendo un enfoque de modelado de idiomas. Puede entrenar a language model (unigram, bigram, parsimonious, ...) en cada una de las palabras de sus cuentas de usuario. Eso le da un mapeo de palabras a probabilidades, es decir, números entre 0 y 1 (inclusive) que expresan la probabilidad de que un usuario use cada una de las palabras que encontró en el conjunto de entrenamiento completo. Los modelos de idiomas se pueden almacenar como matrices de pares, tablas hash o . Hay muchas bibliotecas en la web para ajustar LM.

Tal mapeo se puede considerar un vector de alta dimensión, de la misma manera que los documentos se consideran como vector en el vector space model de recuperación de información. Luego puede comparar estos vectores usando KL-divergence o cualquiera de las métricas de distancia populares: Euclidean distance, cosine distance, etc. Una gran similitud/pequeña distancia entre dos vectores de usuarios podría indicar que pertenecen a un mismo usuario.

0

cómo guardar palabras/usuarios? ¿Qué estructuras de datos?

Probablemente tenga algún tipo de representación para los usuarios y las publicaciones que hayan realizado.Creo que debería tener una lista de palabras, y una lista correspondiente a cada palabra que contiene los usuarios que lo usan. Algo así como:

<word: <user#1, user#4, user#5, ...> > 

cómo deshacerse de las palabras comunes utilizan todo el mundo?

Es de esperar que tienen un conjunto de stopwords. ¿Por qué no extenderlo para incluir palabras de uso común en su foro? Por ejemplo, para stackoverflow, algunos de los nombres de las etiquetas usadas con mayor frecuencia deberían cumplir los requisitos.

cómo reconocer mismos usuarios?

Además de utilizar las medidas basadas en la similitud o la palabra frecuencia, también puede intentar usar las interacciones entre los usuarios. Por ejemplo, user3 me gusta/votos positivos/comentarios cada publicación por user8, o un nuevo usuario que hace cosas similares para algún otro usuario (más viejo) de esta manera.

2

En general, esto es tarea de la identificación del autor, y hay varios buenos papeles como this que le puede dar una gran cantidad de información. Aquí están mis propias sugerencias sobre este tema.

1. Reconocimiento del usuario en sí

El tipo más simple de clasificación de texto de identificación/autor es la clasificación por temas, y hay que tomar las palabras significativas en primer lugar. Es decir, si desea distinguir el texto sobre Apple de la empresa y la manzana de la fruta, cuente palabras como "comer", "naranjas", "iPhone", etc., pero normalmente ignora cosas como artículos, formas de palabras, parte información de voz (POS), etc. Sin embargo, muchas personas pueden hablar mismos temas, pero el uso de estilos diferentes de discurso, es decir artículos, las formas de las palabras y todas las cosas que no hace caso cuando se clasifican por temas. Por lo tanto, lo primero y más importante que debe considerar es recopilar las características más útiles para su algoritmo. El estilo del autor se puede expresar por la frecuencia de palabras como "a" y "the", información de POS (por ejemplo, algunas personas tienden a usar el tiempo presente, otras - futuro), frases comunes ("Me gustaría" vs. "Me gustaría como "vs." Quiero ") y así sucesivamente. Tenga en cuenta que las palabras temáticas no deben descartarse por completo; aún muestran temas que le interesan al usuario. Sin embargo, debe tratarlos de alguna manera especialmente, p. puede precalificar textos por tema y luego discriminar usuarios que no están interesados ​​en él.

Cuando haya terminado con la colección de fenómenos, es posible utilizar uno de algoritmo de aprendizaje automático para encontrar mejor conjetura para un autor del texto. En cuanto a mí, 2 mejores sugerencias aquí son la probabilidad y cosine similarity entre el vector de texto y el vector común del usuario.

2. Discriminar palabras comunes

O, en último contexto, las características comunes. La mejor manera que puedo pensar para deshacerse de las palabras que son utilizados por todas las personas más o menos por igual es calcular entropía para cada uno de estas características:

entropy(x) = -sum(P(Ui|x) * log(P(Ui|x))) 

donde x es una característica, U - usuario , P(Ui|x) - probabilidad condicional de la característica i dada por el usuario x, y sum es la suma de todos los usuarios.

El alto valor de la entropía indica que la distribución de esta característica es casi uniforme y, por lo tanto, es casi inútil.

3. Representación de datos

enfoque común aquí es tener la matriz -función de usuario. Es decir, solo crea una tabla donde las filas son identificadores de usuario y las columnas son características. P.ej. La celda [3][12] muestra la cantidad de veces que el usuario # 3 utilizó la función # 12 (¡no olvide normalizar estas frecuencias por el número total de funciones que el usuario haya utilizado alguna vez!).

Según las características que vaya a utilizar y el tamaño de la matriz, es posible que desee utilizar una implementación de matriz dispersa en lugar de densa. P.ej. si usa 1000 características y para cada usuario en particular, alrededor del 90% de las celdas son 0, no tiene sentido mantener todos estos ceros en la memoria y la implementación escasa es una mejor opción.

Cuestiones relacionadas