使用 R 提取最频繁 ngram 的高效方法
Performant way to extract most frequent ngrams using R
我正在使用以下 tm+RWeka 代码来提取文本中最常见的 ngram:
library("RWeka")
library("tm")
text <- c('I am good person','I am bad person','You are great','You are more great','todo learn english','He is ok')
BigramTokenizer <- function(x) NGramTokenizer(x,Weka_control(min=2,max=2))
corpus <- Corpus(VectorSource(text))
tdm <- TermDocumentMatrix(corpus,control = list(tokenize = BigramTokenizer))
DF <- data.frame(inspect(tdm))
DF$sums <- DF$X1+DF$X2+DF$X3+DF$X4+DF$X5+DF$X6
MostFreqNgrams <- rownames(head(DF[with(DF,order(-sums)),]))
它工作正常,但如果数据更大怎么办?有没有计算效率更高的方法?此外,如果变量更多(例如 100),我该如何编写 DF$sums
代码行。肯定有比以下更优雅的东西:
DF$sums <- DF$X1+DF$X2+DF$X3+DF$X4+DF$X5+DF$X6+...+DF$X99+DF$X100
谢谢
编辑:我想知道是否有一种方法可以从 tdm
TermDocumentMatrix 中提取最常见的 ngram,然后使用这些值创建数据框。我正在做的是创建一个包含所有 ngram 的数据框,然后取最频繁的值,这似乎不是最佳选择。
根据您的编辑,您可以使用以下内容:
my_matrix <- as.matrix(tdm[findFreqTerms(tdm, lowfreq = 2),])
DF <- data.frame(my_matrix, sums = rowSums(my_matrix))
DF
X1 X2 X3 X4 X5 X6 sums
i am 1 1 0 0 0 0 2
you are 0 0 1 1 0 0 2
有一种更简单、更有效的方法,使用 quanteda 包进行文本分析。
> require(quanteda)
> dtm <- dfm(text, ngrams = 2)
Creating a dfm from a character vector ...
... lowercasing
... tokenizing
... indexing documents: 6 documents
... indexing features: 13 feature types
... created a 6 x 13 sparse dfm
... complete.
Elapsed time: 0.007 seconds.
> topfeatures(dtm, n = 10)
i_am you_are am_good good_person am_bad bad_person are_great are_more
2 2 1 1 1 1 1 1
more_great todo_learn
1 1
生成的矩阵是稀疏的并且非常有效。在GitHub版本中,ngrams()
函数(由dfm()
调用)是用C++实现的,以提高速度,所以速度更快。
我正在使用以下 tm+RWeka 代码来提取文本中最常见的 ngram:
library("RWeka")
library("tm")
text <- c('I am good person','I am bad person','You are great','You are more great','todo learn english','He is ok')
BigramTokenizer <- function(x) NGramTokenizer(x,Weka_control(min=2,max=2))
corpus <- Corpus(VectorSource(text))
tdm <- TermDocumentMatrix(corpus,control = list(tokenize = BigramTokenizer))
DF <- data.frame(inspect(tdm))
DF$sums <- DF$X1+DF$X2+DF$X3+DF$X4+DF$X5+DF$X6
MostFreqNgrams <- rownames(head(DF[with(DF,order(-sums)),]))
它工作正常,但如果数据更大怎么办?有没有计算效率更高的方法?此外,如果变量更多(例如 100),我该如何编写 DF$sums
代码行。肯定有比以下更优雅的东西:
DF$sums <- DF$X1+DF$X2+DF$X3+DF$X4+DF$X5+DF$X6+...+DF$X99+DF$X100
谢谢
编辑:我想知道是否有一种方法可以从 tdm
TermDocumentMatrix 中提取最常见的 ngram,然后使用这些值创建数据框。我正在做的是创建一个包含所有 ngram 的数据框,然后取最频繁的值,这似乎不是最佳选择。
根据您的编辑,您可以使用以下内容:
my_matrix <- as.matrix(tdm[findFreqTerms(tdm, lowfreq = 2),])
DF <- data.frame(my_matrix, sums = rowSums(my_matrix))
DF
X1 X2 X3 X4 X5 X6 sums
i am 1 1 0 0 0 0 2
you are 0 0 1 1 0 0 2
有一种更简单、更有效的方法,使用 quanteda 包进行文本分析。
> require(quanteda)
> dtm <- dfm(text, ngrams = 2)
Creating a dfm from a character vector ...
... lowercasing
... tokenizing
... indexing documents: 6 documents
... indexing features: 13 feature types
... created a 6 x 13 sparse dfm
... complete.
Elapsed time: 0.007 seconds.
> topfeatures(dtm, n = 10)
i_am you_are am_good good_person am_bad bad_person are_great are_more
2 2 1 1 1 1 1 1
more_great todo_learn
1 1
生成的矩阵是稀疏的并且非常有效。在GitHub版本中,ngrams()
函数(由dfm()
调用)是用C++实现的,以提高速度,所以速度更快。