[Corpusreader-svn] SF.net SVN: corpusreader:[214] trunk/corpusreader/src/main/R/specificites.R
Status: Alpha
Brought to you by:
sylvainloiseau
|
From: <syl...@us...> - 2009-02-16 14:28:37
|
Revision: 214
http://corpusreader.svn.sourceforge.net/corpusreader/?rev=214&view=rev
Author: sylvainloiseau
Date: 2009-02-16 14:28:33 +0000 (Mon, 16 Feb 2009)
Log Message:
-----------
File moved into the textometrie project
Removed Paths:
-------------
trunk/corpusreader/src/main/R/specificites.R
Deleted: trunk/corpusreader/src/main/R/specificites.R
===================================================================
--- trunk/corpusreader/src/main/R/specificites.R 2009-02-16 14:27:57 UTC (rev 213)
+++ trunk/corpusreader/src/main/R/specificites.R 2009-02-16 14:28:33 UTC (rev 214)
@@ -1,114 +0,0 @@
-specificites <- function(corpus, souscorpus) {
- ## Sylvain Loiseau
- ## 2006-2008
- ## Dernière édition samedi 13 décembre 2008, 19:38:22 (UTC+0100)
- ##
- ## Indice de spécificité des formes d'un sous corpus par rapport à un corpus.
- ## Mesurée par la formule hypergéométrique,
- ## retourne un tableau :
- ## une ligne par forme du sous corpus
- ## en colonne : indice de spécificité, sous fréquence, fréquence.
- ##
-
- ## Les fréquences dans le corpus
- if (class(corpus) == "data.frame") {
- frequencesCorpus <- colSums(corpus);
- print("Le corpus est un data frame");
- } else {
- frequencesCorpus = corpus;
- }
-
- print(paste("Nombre de variables dans le corpus : ", length(frequencesCorpus)));
-
- ## Un peu de nettoyage dans le sous corpus : on supprime
- ## d'éventuelles forme ou partie sans aucune valeur
- souscorpus <- souscorpus[,colSums(souscorpus) > 0];
- souscorpus <- souscorpus[rowSums(souscorpus) > 0,];
-
- ## Les fréquences dans le sous-corpus
- sousFrequences <- colSums(souscorpus);
-
- specificitesFrequencyLists(frequencesCorpus, sousFrequences);
-}
-
-specificitesFrequencyLists <- function(frequencesCorpus, sousFrequences) {
- if (any(is.na(frequencesCorpus))) {
- stop("Valeurs non numériques dans la liste des frequences du corpus.");
- }
- if (any(is.na(sousFrequences))) {
- stop("Valeurs non numériques dans la liste des fréquences du sous corpus.");
- }
-
- ## Nombre de formes à traiter
- nbrFormes <- length(sousFrequences);
- print(paste("Nombre de formes dans le sous corpus :", nbrFormes));
-
- ## On ne garde des frequences du corpus principal
- ## que les variables qui sont dans le sous corpus
- frequencesTotales <- frequencesCorpus[names(sousFrequences)]
- if (length(frequencesTotales) < nbrFormes) {
- warning("Attention : toutes les variables du sous corpus n'ont pas été trouvées dans le corpus.")
- }
- if (any(is.na(frequencesTotales))) {
- na_index <- is.na(frequencesTotales);
- print("NA :");
- print(names(sousFrequences)[na_index]);
- stop("NA in FrequencesTotales");
- }
-
- #frequencesTotales <- frequencesTotales[ !is.na(frequencesTotales) ];
- #if (any(is.na(frequencesTotales))) {
- # stop("NA in frequencesTotales");
- #}
-
- ## Nombre d'occurrences dans le corpus et son sous-corpus
- longueurCorpus <- sum(frequencesCorpus)
- longueurSousCorpus <- sum(sousFrequences)
- print(paste("Longueur du corpus :", longueurCorpus));
- print(paste("Longueur du sous corpus :", longueurSousCorpus));
-
- ## Pour chaque fréquence totale, on calcule la différence entre la taille du corpus et cette fréquence
- ## (nécessaire pour les fonctions phyper et dhyper)
- longueurCorpusMoinsFrequencesTotales <- (longueurCorpus - frequencesTotales);
- if (any(is.na(longueurCorpusMoinsFrequencesTotales))) {
- stop("Valeurs non numériques dans la liste des fréquences complémentaires de chaque forme.");
- }
- # print(paste("Taille de corpus moins fréquence", length(longueurCorpusMoinsFrequencesTotales)));
- # if (any(is.na(longueurCorpusMoinsFrequencesTotales))) {
- # stop("NA in longueurCorpusMoinsFrequencesTotales");
- # }
-
- ## on met dans un tableau "cumulative", pour chaque forme, la propabilité cumulée
- ## (phyper) correspondant à sa sous-fréquence dans le sous corpus compte tenu de sa
- ## fréquence absolue dans le corpus principal et des tailles des deux corpus.
- ##
- cumulative <- double(nbrFormes);
- cumulative <- phyper(sousFrequences, frequencesTotales, longueurCorpusMoinsFrequencesTotales, longueurSousCorpus);
- if (any(is.na(cumulative))) {
- stop("NA in cumulative");
- }
- # cumulative[is.na(cumulative)] <- 0;
-
- ## Si la fréquence cumulée est inférieure à 0.5, c'est qu'il y a *moins* d'occurrences
- ## que ne le laisserait prévoir le hasard, si la fréquence cumulée est supérieure à 0.5
- ## c'est qu'il y a plus d'occurrences qu'il n'y aurait dû en avoir. On inverse donc les signes
- ## pour prendre en compte cette différence.
- specificiteIndex <- double(nbrFormes);
-
- # if (any(is.na(specificiteIndex))) {
- # stop("NA in specificiteIndex");
- # }
-
- # specificiteIndex[cumulative < 0.5] <- specificiteIndex[cumulative < 0.5];
- specificiteIndex[cumulative >= 0.5] <- (1 - cumulative[cumulative >= 0.5]);
-
- m <- matrix(
- c(cumulative, sousFrequences, frequencesTotales),
- nrow = nbrFormes,
- ncol=3,
- dimnames = list(names(sousFrequences), c("Indice de spécificité", "Sous fréquence", "Fréquence totale"))
- );
-
- sorted <- m[order(m[,1], decreasing=TRUE),];
- return(sorted);
-}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|