非孤立词的文本挖掘

时间:2017-10-24 14:53:30

标签: r text text-mining

我有一个数据集(PostgresDB中的一个非常长的列),其中数据以下列方式保存:

**Variable_1** 
honey-pot 
treesarecool 
this-is-my-honeypot 
thisismyhonepot 
honey-is-sweet 
treesfurniture 
honeybees-production 
themoonisgone 
tableproduction

有时单词是孤立的,例如“honey”,有时候它们是“honeypot”“honeybees”等较长词的一部分。我最终想要一个频率表,其中包含最频繁的单词。:

Frequency Table: 
Honey     4 
trees     2 
Table     1 
pot       1 
namek     1
gone      1 
furniture 1 
his       n 
are       n 
pro       n 
duc       n 
tio       n 
...     ...

我没有要查找的特定单词列表(在这种情况下我会使用grep())。我没有文本挖掘方面的经验,但经过一些研究后我发现大多数文本挖掘工具(如(tm)都需要单词(“亲爱的是”)以便能够汇总并分析它们。所以我认为我正在寻找的是一种使用蛮力来比较字符串的工具。比如,查找超过3个字符的所有类似字符串(在频率表中用“n”表示。

我的假设是否正确? R中是否有可以实现此目的的工具?还有其他想法,建议吗?

鉴赏!

更新1

现在已经尝试了Adam一周的解决方案,我可以进行以下推荐,以分析上面提到的字符串:

  1. 删除所有“ - ”,“_”和“。”极大地帮助减少不相关/无趣的ngrams的数量。我有兴趣在我的数据库中查找给定单词的频率,这些符号对这样的分析没有任何贡献,而只是夸大了结果数据集。

  2. 删除数字[0-9]也可以减少ngrams的数量。除非您还想要特定数字的频率(例如0041预测码等)。我会删除它们并稍后进行单独的数字分析(删除所有字符和符号,只留下数字)。但这很大程度上取决于你的目标!

  3. 清理您的数据!!!这是我对字符串的第一次分析,我最重要的一点是,干净的数据一如既往地在实现目标方面有很长的路要走。

1 个答案:

答案 0 :(得分:2)

您可以将quanteda个包用tokenize()个字组合成一组字符ngrams&然后将结果制成表格。

下面的代码遍历单词并将它们分成以下范围内的ngram:[3, nchar(word)]

随着输入词数量的增加,char_ngrams对象的大小会快速增长。所以不确定这会有多好。

library(quanteda)

#create exapmle data
words = c("honey-pot",
          "treesarecool",
          "this-is-my-honeypot",
          "thisismyhonepot",
          "honey-is-sweet",
          "treesfurniture",
          "honeybees-production",
          "themoonisgone",
          "tableproduction")

#perform char ngram tokenization
char_ngrams = unlist(
  lapply(words, function(w) {
    unlist(
      tokenize(w,
               "character",
               ngrams=3L:nchar(w),
               conc="")
      )
    })
)

#show most popular character ngrams
head(sort(table(char_ngrams), decreasing = TRUE))
#char_ngrams
# one   hon  hone honey   ney  oney 
# 6     5     5     4     4     4