2015-09-29 3 views
5

Я пишу сценарий R и использую библиотеку (ngram).Почему функция ngrams() дает отдельные биграммы?

Пусть я строка,

«хорошо qualiti корм для собак купил Sever Витал может корм для собак продукт найден хороший qualiti продукт выглядеть процесс тушеное мясо пахнет лучше лабрадор finicki appreci продукт лучше»

и хотите найти bi-grams.

Библиотека Ngram дает мне би-граммы следующим образом:

«appreci продукт» «процесс мясо» «пищевой продукт» «еда купил» «qualiti собака» «продукт найден» «продукт взгляд» «смотреть как «тушеная» «хорошая квалификация» «лабрадор финики» «купил рацион» «качественный продукт» «лучший лабрадор» «корм для собак» «пахнет лучше» «витал может» «запах мяса» «нашел хорошо» " разорвать жизненно важный «процесс тушения» «может собака» «finicki appreci» «продукт лучше»

Как предложение содержит «корм для собак» два раза, я хочу эту двуграмму два раза. Но я получаю это один раз!

Есть ли опция в библиотеке thengram или в любой другой библиотеке, которая дает все биграммы моего предложения в R?

ответ

5

Вы можете использовать пакет stylo. Дает дубликаты:

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) 

Результат:

[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

Разрабатываемая версия ngram имеет метод 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 

Кроме того, вы можете использовать метод print() и указать output == "full". То есть:

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

Вы можете использовать RWeka. В результате вы можете увидеть «корм для собак» и «хороший qualiti» появляется дважды

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" 

Или использовать пакет тм в сочетании с 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

Для того, чтобы произвести такое би-грамм, вам не требуется никакой специальной упаковки. В принципе, разделите текст и вставьте его снова.

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)]) 

Приведенное bg будет:

[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

Попробуйте quanteda пакет:

> 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" 

Множество дополнительных аргументов, доступные через ngrams, в том числе получение различных комбинаций п размеров, или пропусков.

Смежные вопросы