Closed ManuelSIlvaCav closed 8 years ago
Así se calcula. Para hacer los cálculos más fáciles pueden usar numpy
(está dentro de las librerías permitidas)
No entiendo como sacar la norma entre dos vectores:
Si es el vector para el cual estoy buscando issues parecidas es ["hola", 'como', 'estas']... El vector IDF podria ser [1.233, 1.1, 1.224].
Si comparando me aparece el vector ['todo', 'bien', 'estas', 'ahi'], mi vector IDF seria algo como [0, 0, 1.224]... el IDF es el mismo ya que poseen las mismas variables para calcularlo?? (creo que es asi).
Entonces cuando saco la norma seria raiz((1.233-0)^2 + (1.1-0)^2 + (1.224-1.224)^2) ??
Esto esta bien... Perdón pero no me queda claro con el enunciado y no quiero tenerlo incorrecto por error de comprensión.
Gracias!
@vbarros2 para poder comparar los vectores necesitas que los índices de ambas listas correspondan a las mismas palabras. En #610 se habló algo relacionado.
En wikipedia sale, como dijo @ManuelSIlvaCav , dicen como calcular:
TF -> (frecuencia de termino) IDF -> log[ (numero de issues)/{1 + (issues en las que aparece la palabra) }]
Pero me dicen que debo calcular el vector IDF de cada uno de los vectores TF. Como sale ahí el vector IDF debiera de ser uno. De longitud la cantidad de palabras que solicito. Además en varias partes sale algo de multiplicar ambos vectores. Porfavor si me pueden explicar como se calcula el IDF
Gracias!
Digamos tienes las siguientes issues [['clase', 'funcion', 'método'], ['clase', 'método'], ['funcion', 'método']]
que generan el siguiente diccionario [clase', 'funcion', 'método']
.
La nueva issue ['clase', 'método']
tendrá el siguiente vector TF [1, 0, 1]
. El vector idf es [log (3/2), log (log (3/2), log (3/3)]
. El vector TF-IDF de la issue es la multiplicación de estos vectores que da como resultado [log (3/2), 0, 0]
Muchas gracias!
@indonoso por que dices "la nueva issue"? en el enunciado sale "seleccionar una issue dentro de las que existan en el repositorio". Se supone que esa no se cuenta para hacer el diccionario? Es la misma segunda issue que listaste o es otra issue con mismas palabras?
e IDF sería entonces : log[ (numero de issues)/{1 + (issues en las que aparece la palabra) }] ? o log[ (numero de issues)/{issues en las que aparece la palabra}] ? que seria lo que pusiste tu(segun entiendo)
edit: y en el enunciado sale "IDF de cada uno de ellos." pero según entiendo en tu explicación sería el IDF de todas las issues o no?
A cada issue i le vas a buscar las dos issues más parecidas que fueron creadas antes que i. El uno en el denominador se pone cuando issues en que aparece la palabra es cero (esto puede ocurrir si usas un diccionario externo, y no generado por el set datos). Es para evitar divisiones por cero.
y seria el idf común para todas las issues o no?
Sí :smile:
aa ok muchas gracias!
así y todo no me quedó claro...
@indonoso en tu explicación arriba, tu vector IDF tiene un elemento log(log(3/2), log(3/3))... eso está bien? :S
Se supone que debemos agarrar todas las palabras de todas las issues, meterlas en una lista (obviamente ya habiendo filtrado las stopwords), formar los vectores TF de todas las issues y luego qué?
El vector IDF es propio de cada issue/vector TF? o hay un solo vector IDF para todas las issues?
Hay una forma de sacar las 2 issues más parecidas a la issue en cuestión sin usar el vector IDF? (para qué sirve ese vector de todas formas :S)
es log[ (numero de issues)/{(issues en las que aparece la palabra) }] pero si lo de abajo es cero, en vez haces log[ (numero de issues)/{1 + (issues en las que aparece la palabra) }]
yo entiendo que se saca el TF y TF-IDF de cada uno. ( el idf es comun. ) y se saca la distancia entre los TF-IDF
pero para el idf se hace el calculo para cada palabra y se hace un vector [único?] donde los elementos del vector son los resultados obtenidos en cada calculo?
segun entiendo el idf es vector unico y el TF-IDF se saca para cada uno.
donde los elementos del vector son los resultados obtenidos en cada calculo?
si
buena, gracias!
@fnquinteros la verdad es que mi algoritmo solo me esta devolviendo los issues mas cortos. quizas tengo un error en alguna parte o no entendi bien, no se
@caackermann nunca jaja
@jpdattas acabo de cachar que lo dijeron mas arriba jaja. A que se refieren con la multiplicacion de los vectores TF-IDF? Producto punto, producto cruz, multiplicar cada elemento?
existe una issue que tiene como titulo "el", y no tiene body, por lo que es 0
cierto. en esa seria 0.
Yo hice producto punto, asumi que se habia equivocado arriba pero mi algoritmo me da siempre los issues mas chicos (siempre devuelve lo mismo independiente del issue al que le busque similares) asique no se realmente si es error de codigo o de haber entendido
Pero el producto punto entre 2 vectores no es un escalar?
osea nada que ver, hice producto de cada elemento
Deben multiplicar vectores de tamaño (1, n) x (n, 1)
(donde (filas, columnas)
). Así obtendrán el vector TF-IDF de la issue. Después buscar la issue más parecida a la issue i deben tener el vector TF-IDF de cada una de las issues creadas antes de i y obtener el valor min([|issue_i - issue_k|^2 for k in N])
donde N es el número de issues, |issue_i - issue_k|^2
es un escalar.
Ahh perfecto. Gracias!
Para las issues repetidas, el vector IDF como se calcula exactamente? Estuve averiguando y en wikipedia aparece que se calcula como log[ (numero de issues)/{1 + (issues en las que aparece la palabra) }] para cada palabra del vector TF.... es asi o alguna forma mas facil?
Gracias!