在数据帧中保存ngram对象

时间:2015-06-16 04:42:02

标签: r n-gram

require(ngram)
require(stringr)
res<-readLines("text1.txt")
wordlength=0

for(j in 1:length(res) ){
temp<-sapply(strsplit(res[j]," "), length)
 if (temp>=wordlength) {
    wordlength=temp
 }
}

rm("temp")
data<-data.frame

for(i in 1:length(res) ){
x<-res[i]
ng<-ngram(x,n=2)
temp<-babble(ng,genlen=500,seed=123)
data[i]<-ngram(temp,n=2)
}

get.ngrams(ngram(bab[1,],n=2))
babng<-matrix(nrow=length(res),wordlength)

我正在尝试将此ngram数据保存在此循环的数据框中,我还尝试将其保存在矩阵中,但此错误显示:

"object of type 'closure' is not subsettable"

我想得到来自babbler的每2gram元素的频率分布。对不起我乱码。我是R的新手。

3 个答案:

答案 0 :(得分:0)

在您的代码中,您致电:

data<-data.frame

将函数data.frame分配给变量data。稍后,您调用导致错误的data[i]<-ngram(temp,n=2),因为无法使用子集运算符data对分配给变量[的函数进行子设置。您可能希望创建一个data.frame对象,并通过通过以下方式调用函数data将其分配给变量data.frame

data<-data.frame()

答案 1 :(得分:0)

这也很容易做到:

require(quanteda)
Bigrams <- tokenize(toLower(res), ngrams = 2)
as.data.frame(table(Bigrams))

如果res是文档的字符向量,则可以使用

对多个文档执行此操作
BigramDfm <- dfm(res, ngrams = 2)
as.data.frame(BigramDfm)

答案 2 :(得分:0)

2年后,但....
忽略代码的细节,可能是由于您对R声明(以及我想知道的Quanteda)不太熟悉

d1 <- dfm("simple sample text", ngrams = 2)
d2 <- textstat_frequency(d1)
class(d2)
# [1] "frequency"  "textstat"   "data.frame"
d2
#         feature frequency rank docfreq group
# 1 simple_sample         1    1       1   all
# 2   sample_text         1    2       1   all

除非有特殊原因不能一次性读取文本, 如果没有特殊原因,readtext与Quanteda协同可能是最好的选择