【问题标题】:How to implement a backup tokenizer switch in RWeka?如何在 RWeka 中实现备份标记器开关?
【发布时间】:2016-10-11 13:57:38
【问题描述】:

我正在使用 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 具有备份标记器选项?

抽象策略-&gt;this is incorrect>
抽象策略板-&gt;incorrect
抽象策略桌游-&gt; this should be the correct output

埃森哲高管
口音行政简单
口音执行简单评论

非常感谢。

【问题讨论】:

  • 所以,总而言之,你想做 2-gram 和 3-gram,对吧?
  • 说:先尝试 4-gram,然后尝试 3-word 窗口,然后尝试 2-word 窗口,失败一个单词。但只报告最大的相关项目(不要重复 4、3、2 字词组)

标签: r text-mining tm rweka


【解决方案1】:

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

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

我认为值得在 n-gram wordclouds 上查看 great tutorial

n-gram 文本挖掘的可靠代码 sn-p 是:

# 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 克。

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

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

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

如果您仍有问题,请提供reproducible 示例,我会跟进。

【讨论】:

  • 感谢 Hack-R。我运行了这个 sn-p。问题已经转移到其他地方,而不是让术语文档矩阵反映 4-、-3、-2 克短语,我仍然得到单个单词。示例:“deutsche”有效,但“deutche bank”(我希望将其识别为有效的二元组)未被识别。我理解的问题在哪里?
  • @Pradeep 我明白了。为了让我能够提供帮助,我需要一个可重现的示例,以便我可以在我的计算机上看到问题并尝试一些方法来解决它。能否使用内置或公共数据集,然后粘贴完整代码来重现此问题?
  • 我将发布一个可重现的数据集。同时,我查看了@Ben。我想我可以更准确地定义我的问题:我只想要识别/指定的词频(4-、3-、2-words),而不是 NGram 路线;向量被存储为术语文档矩阵中的列。像 Deloitte Haskin Sells Price Waterhouse Lexis Nexis 等等。
  • tmWeka:: NGramTokenizer 都很糟糕(内存消耗和实现)。检查text2vec 作为更有效的选择。
  • @Hack-R :回到主要问题:如上所述,我创建了一个(二元组、三元组和四元组)列表。问题是对这个列表进行超集,以便 (a) 如果二元组存在于三元组中,则丢弃它,并且 (b) 将二元组计数添加到三元组计数。在上面的 4-gram 示例中,以下是计数:抽象策略 8 抽象策略棋盘 3 抽象策略棋盘游戏 2。我应该能够将上述链接为“抽象策略棋盘游戏”(最大的 n-gram,因为项目 1 和2 已包含),计数为 8+3+2=13。任何帮助都会很有用。
猜你喜欢
  • 2011-10-19
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多