2015-09-29 20 views
5

Sto scrivendo uno script R e sto usando la libreria (ngram).Perché la funzione ngrams() fornisce distinti bigram?

Supponiamo che io sono una stringa,

"buona qualiti cibo per cani sever comprato vitale può cibo per cani Prodotto trovato buon prodotto qualiti sembrare carne processo in umido odore meglio labrador finicki appreci prodotto migliore"

e vuoi trovare i bi-grammi.

La biblioteca Ngram mi sta dando bi-grammi come segue:

"prodotto appreci" "carne processo di" "prodotto alimentare" "cibo comprato" "cane qualiti" "prodotto trovato" "aspetto del prodotto" "Guarda come "" come stufato "" buon qualiti "" labrador finicki "" comprato sever "" prodotto qualitativo "" meglio labrador " " cibo per cani "" buon odore "" lattina vitale "" odore di carne "" trovato buono "" sever vital "" stew processo "" can dog "" finicki appreci "" prodotto migliore "

Poiché la frase contiene" cibo per cani "due volte, desidero questo biogramma due volte. Ma lo sto facendo una volta!

Esiste un'opzione nella libreria di thengram o in qualsiasi altra libreria che fornisce tutti i bi-grammi della mia frase in R?

risposta

5

È possibile utilizzare il pacchetto stylo. Dà i duplicati:

library(stylo) 
a = "good qualiti dog food bought sever vital can dog food product found good qualiti product look like stew process meat smell better labrador finicki appreci product better" 
b = txt.to.words(a) 
c = make.ngrams(b, ngram.size = 2) 
print(c) 

risultati:

[1] "good qualiti"  "qualiti dog"  "dog food"   "food bought"  "bought sever"  "sever vital"  "vital can"  "can dog"   "dog food"   
[10] "food product"  "product found" "found good"  "good qualiti"  "qualiti product" "product look"  "look like"  "like stew"  "stew process"  
[19] "process meat"  "meat smell"  "smell better"  "better labrador" "labrador finicki" "finicki appreci" "appreci product" "product better" 
> 
6

La versione di sviluppo di ngram ha un metodo get.phrasetable:

devtools::install_github("wrathematics/ngram") 
library(ngram) 

text <- "good qualiti dog food bought sever vital can dog food product found good qualiti product look like stew process meat smell better labrador finicki appreci product better" 

ng <- ngram(text) 
head(get.phrasetable(ng)) 
#   ngrams freq  prop 
# 1 good qualiti 2 0.07692308 
# 2  dog food 2 0.07692308 
# 3 appreci product 1 0.03846154 
# 4 process meat 1 0.03846154 
# 5 food product 1 0.03846154 
# 6  food bought 1 0.03846154 

Inoltre, è possibile utilizzare il metodo print() e specificare output == "full". Ovvero:

print(ng, output = "full") 

# NOTE: more output not shown... 
better labrador | 1 
finicki {1} | 

dog food | 2 
product {1} | bought {1} 
# NOTE: more output not shown... 
3

È possibile utilizzare RWeka. Nel risultato si può vedere "cibo per cani" e "buono qualiti" appare due volte

txt <- "good qualiti dog food bought sever vital can dog food product found good qualiti product look like stew process meat smell better labrador finicki appreci product better" 


library(RWeka) 
RWEKABigramTokenizer <- function(x) { 
     NGramTokenizer(x, Weka_control(min = 2, max = 2)) 
} 

RWEKABigramTokenizer(txt) 

[1] "good qualiti"  "qualiti dog"  "dog food"   "food bought"  "bought sever"  "sever vital"  "vital can"  
[8] "can dog"   "dog food"   "food product"  "product found" "found good"  "good qualiti"  "qualiti product" 
[15] "product look"  "look like"  "like stew"  "stew process"  "process meat"  "meat smell"  "smell better"  
[22] "better labrador" "labrador finicki" "finicki appreci" "appreci product" "product better" 

Oppure utilizzare il pacchetto tm in combinazione con RWeka

library(tm) 
library(RWeka) 
my_corp <- Corpus(VectorSource(txt)) 
tdm_RWEKA <- TermDocumentMatrix(my_corp, control=list(tokenize = RWEKABigramTokenizer)) 

#show the 2 bigrams 
findFreqTerms(tdm_RWEKA, lowfreq = 2) 

[1] "dog food"  "good qualiti" 

#turn into matrix with frequency counts 
tdm_matrix <- as.matrix(tdm_RWEKA) 
3

Per produrre tale bi-gram, è non ho bisogno di alcun pacchetto speciale. Fondamentalmente, dividi il testo e incollalo di nuovo.

t <- "good qualiti dog food bought sever vital can dog food product found good qualiti product look like stew process meat smell better labrador finicki appreci product better" 
ug <- strsplit(t, " ")[[1]] 
bg <- paste(ug, ug[2:length(ug)]) 

Il risultato bg sarebbe:

[1] "good qualiti"  "qualiti dog"  "dog food" 
[4] "food bought"  "bought sever"  "sever vital" 
[7] "vital can"  "can dog"   "dog food" 
[10] "food product"  "product found" "found good" 
[13] "good qualiti"  "qualiti product" "product look" 
[16] "look like"  "like stew"  "stew process" 
[19] "process meat"  "meat smell"  "smell better" 
[22] "better labrador" "labrador finicki" "finicki appreci" 
[25] "appreci product" "product better" "better qualiti" 
1

provare il quanteda pacchetto:

> quanteda::tokenize(txt, ngrams = 2, concatenator = " ") 
[[1]] 
[1] "good qualiti"  "qualiti dog"  "dog food"   "food bought"  "bought sever"  "sever vital"  
[7] "vital can"  "can dog"   "dog food"   "food product"  "product found" "found good"  
[13] "good qualiti"  "qualiti product" "product look"  "look like"  "like stew"  "stew process"  
[19] "process meat"  "meat smell"  "smell better"  "better labrador" "labrador finicki" "finicki appreci" 
[25] "appreci product" "product better" 

Un sacco di argomenti aggiuntivi disponibili attraverso ngrams, compreso ottenere diverse combinazioni di n dimensioni, o skip-grammi.