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的新手。
答案 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协同可能是最好的选择