1

我正在使用 R-tm-Rweka 包进行一些文本挖掘。我必须提取 ngram,而不是在单个单词上构建 tf-tdm,这对我的目的来说还不够。我使用@Ben函数TrigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 3)) tdm <- TermDocumentMatrix(a, control = list(tokenize = TrigramTokenizer))
来提取三元组。输出有一个明显的错误,见下文。它会选择 4 个、3 个和 2 个单词的短语。理想情况下,它应该只拾取 4 个词的名词短语并删除(3 个和 2 个词)其余部分。如何强制执行此解决方案,例如 Python NLTK 具有备份标记器选项?

抽象策略 ->this is incorrect>
抽象策略板 ->incorrect
抽象策略棋盘游戏 -> this should be the correct output

口音行政
口音行政简单
口音行政简单评论

非常感谢。

4

1 回答 1

0

我认为你与你所做的尝试非常接近。除了你必须明白你Weka要做什么是捕获 2-gram 和 3-gram 标记;这Weka_control就是指定的方式。

相反,我建议在不同的标记器中使用不同的标记大小,并根据您的偏好或决策规则选择或合并结果。

我认为值得查看这个关于 n-gram wordclouds 的精彩教程。

用于 n-gram 文本挖掘的可靠代码片段是:

# QuadgramTokenizer ####
QuadgramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 4, max = 4)

对于 4 克,

# TrigramTokenizer ####
TrigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 3)

对于 3 克,当然

# BigramTokenizer ####
BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2)

2克。

您可以通过像这样单独运行不同的克大小而不是设置Weka_control为范围来避免之前的问题。

您可以像这样应用标记器:

tdm.ng <- TermDocumentMatrix(ds5.1g, control = list(tokenize = BigramTokenizer))
dtm.ng <- DocumentTermMatrix(ds5.1g, control = list(tokenize = BigramTokenizer))

如果您仍然有问题,请提供一个可重现的示例,我会跟进。

于 2016-06-10T15:08:48.837 回答