非孤立词的文本挖掘
Text Mining of Non-Isolated words
我有一个数据集(来自 PostgresDB 的一个很长的列),其中数据以下列方式保存:
**Variable_1**
honey-pot
treesarecool
this-is-my-honeypot
thisismyhonepot
honey-is-sweet
treesfurniture
honeybees-production
themoonisgone
tableproduction
有时单词是孤立的,例如 "honey",有时它们是较长单词的一部分,例如 "honeypot" 或 "honeybees"。我最终想要一个频率 table 最频繁的词是这样的。:
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) 需要隔离单词 ("The honey is sweet") 才能能够汇总和分析它们。所以我认为我正在寻找的是一种使用蛮力比较字符串的工具。比如,找到所有长度超过 3 个字符的相似字符串(以频率 table 为特征 "n"。
我的假设正确吗? R 中是否有可以完成此操作的工具?还有其他想法、建议吗?
感谢!
更新 1
在试用 Adam 的解决方案一周后,我可以提出以下建议来分析上述字符串:
删除所有“-”、“_”和“.”极大地帮助减少了 irrelevant/uninteresting ngram 的数量。我有兴趣在我的数据库中找到给定单词的频率,这些符号对此类分析没有任何贡献,而只是膨胀了结果数据集。
删除数字 [0-9] 也有助于减少 ngram 的数量。除非您还想要特定号码的频率(例如 0041 预拨代码或此类......)。我会删除它们并稍后进行单独的数字分析(通过删除所有字符和符号并只留下数字)。但这在很大程度上取决于您的目标是什么!
清理你的数据!!!这是我对字符串的第一次分析,我最重要的收获是干净的数据,一如既往,对实现你的目标大有帮助!
您可以使用 quanteda
程序包将每个单词 tokenize()
转换为一组字符 ngram,然后将结果制成表格。
下面的代码遍历单词并将它们拆分为长度在以下范围内的 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
我有一个数据集(来自 PostgresDB 的一个很长的列),其中数据以下列方式保存:
**Variable_1**
honey-pot
treesarecool
this-is-my-honeypot
thisismyhonepot
honey-is-sweet
treesfurniture
honeybees-production
themoonisgone
tableproduction
有时单词是孤立的,例如 "honey",有时它们是较长单词的一部分,例如 "honeypot" 或 "honeybees"。我最终想要一个频率 table 最频繁的词是这样的。:
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) 需要隔离单词 ("The honey is sweet") 才能能够汇总和分析它们。所以我认为我正在寻找的是一种使用蛮力比较字符串的工具。比如,找到所有长度超过 3 个字符的相似字符串(以频率 table 为特征 "n"。
我的假设正确吗? R 中是否有可以完成此操作的工具?还有其他想法、建议吗?
感谢!
更新 1
在试用 Adam 的解决方案一周后,我可以提出以下建议来分析上述字符串:
删除所有“-”、“_”和“.”极大地帮助减少了 irrelevant/uninteresting ngram 的数量。我有兴趣在我的数据库中找到给定单词的频率,这些符号对此类分析没有任何贡献,而只是膨胀了结果数据集。
删除数字 [0-9] 也有助于减少 ngram 的数量。除非您还想要特定号码的频率(例如 0041 预拨代码或此类......)。我会删除它们并稍后进行单独的数字分析(通过删除所有字符和符号并只留下数字)。但这在很大程度上取决于您的目标是什么!
清理你的数据!!!这是我对字符串的第一次分析,我最重要的收获是干净的数据,一如既往,对实现你的目标大有帮助!
您可以使用 quanteda
程序包将每个单词 tokenize()
转换为一组字符 ngram,然后将结果制成表格。
下面的代码遍历单词并将它们拆分为长度在以下范围内的 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