J'ai un ensemble de données qui représente 1000 documents et tous les mots qui y apparaissent. Les lignes représentent donc les documents et les colonnes les mots. Ainsi, par exemple, la valeur dans la cellule représente la fois où le mot apparaît dans le document . Maintenant, je dois trouver des «poids» des mots, en utilisant la méthode tf / idf, mais je ne sais pas comment faire. Quelqu'un peut-il m'aider?
12
Réponses:
Wikipedia a un bon article sur le sujet, complet avec des formules. Les valeurs dans votre matrice sont les termes fréquences. Il vous suffit de trouver l'idf:
(log((total documents)/(number of docs with the term))
et de multiplier les 2 valeurs.Dans R, vous pouvez le faire comme suit:
Voici les jeux de données:
Vous pouvez également consulter l'idf de chaque terme:
la source
log((number of docs)/(number of docs containing the term))
. Vous pouvez également simplement filtrer les termes peu fréquents.il y a le paquet tm (text mining) http://cran.r-project.org/web/packages/tm/index.html qui devrait faire exactement ce dont vous avez besoin:
R est un langage fonctionnel, donc la lecture du code peut être délicate (par exemple x en termes)
la source
Votre code contient une erreur: colSums calcule le nombre d'occurrences dans le corpus, pas le nombre de textes avec le mot.
Une version informatique telle serait:
la source
Il existe un nouveau package R qui peut le faire: textir: régression inverse pour l'analyse de texte
La commande appropriée est
tfidf
, l'exemple du manuel:la source
Je suis en retard à cette fête, mais je jouais avec les concepts de tc-idf (je veux souligner le mot `` concept '' parce que je n'ai suivi aucun livre pour les calculs réels; ils peuvent donc être quelque peu décalés, et certainement plus facile à réaliser avec des packages tels que
{tm: Text Mining Package}
, comme mentionné), et je pense que ce que j'ai obtenu peut être lié à cette question, ou, en tout cas, cela peut être un bon endroit pour le poster.SET-UP: J'ai un corpus de
5
longs paragraphes tirés de la presse écrite, àtext 1
travers5
tels que le New York Times . Apparemment, c'est un très petit "corps", une petite bibliothèque, pour ainsi dire, mais les entrées de cette bibliothèque "numérique" ne sont pas aléatoires: les première et cinquième entrées traitent du football (ou "soccer" pour "club social" (?) ici), et plus précisément sur la plus grande équipe d'aujourd'hui. Ainsi, par exemple,text 1
commence comme ...Très agréable! D'un autre côté, vous voudrez certainement ignorer le contenu des trois entrées intermédiaires. Voici un exemple (
text 2
):Alors, que faire pour éviter à tout prix de "surfer" du
text 1
autext 2
, tout en continuant à se réjouir de la littérature sur le tout puissant FC Barcelone entext 5
?TC-IDF: J'ai isolé les mots dans chacun
text
en longs vecteurs. Puis compté la fréquence de chaque mot, créant cinq vecteurs (un pour chacuntext
) dans lesquels seuls les mots rencontrés dans le correspondanttext
ont été comptés - tous les autres mots, appartenant à d'autrestext
s, ont été évalués à zéro. Dans le premier extrait detext 1
, par exemple, son vecteur aurait un compte de 1 pour le mot "Messi", tandis que "Trump" aurait 0. C'était la partie tc .La partie idf a également été calculée séparément pour chacun
text
, et a abouti à 5 "vecteurs" (je pense que je les ai traités comme des trames de données), contenant les transformations logarithmiques des décomptes de documents (malheureusement, juste de zéro à cinq, étant donné notre petite bibliothèque ) contenant un mot donné comme dans:text
sous-considéré a été exclu du décompte . Mais si un mot apparaît dans tous les documents, son idf est toujours égal à grâce au du dénominateur - par exemple, le mot «le» a une importance de 0, car il est présent dans tous les al.text
La multiplication en entrée de pour chaque était l'importance de chaque mot pour chacun des éléments de la bibliothèque - des mots répandus localement et rares à l'échelle mondiale .tc × idf
text
COMPARAISONS: Maintenant, il s'agissait simplement de réaliser des produits scalaires parmi ces "vecteurs d'importance des mots".
On pouvait s'y attendre, le produit scalaire de
text 1
withtext 5
était13.42645
, alors quetext 1
v.text2
Était seulement2.511799
.Le code R maladroit (rien à imiter) est ici .
Encore une fois, c'est une simulation très rudimentaire, mais je pense que c'est très graphique.
la source