在查找字符串中的单词时计算术语文档矩阵

时间:2015-10-13 12:51:47

标签: r text-mining tm term-document-matrix

这个问题与我之前的问题有关。 Treat words separated by space in the same manner

将其作为单独的一个发布,因为它可以帮助其他用户轻松找到它。

问题是当前term document matrix包计算tm的方式。我想稍微调整一下,如下所述。

目前,通过在文档中查找单词“milky”作为单独的单词(而不是字符串)来创建任何术语文档矩阵。例如,让我们假设2个文档

 document 1: "this is a milky way galaxy"
 document 2: "this is a milkyway galaxy"

按照当前算法的工作方式(tm包),在第一个文档中找到'milky',但在第二个文档中找不到,因为算法会将术语milky作为单独的单词查找。但是,如果算法查找了术语milky这样的函数grepl之类的字符串,那么它也会在第二个文档中找到“milky”这个术语。

grepl('milky', 'this is a milkyway galaxy')
TRUE

有人可以帮我创建符合我要求的术语文档矩阵(可以在两个文档中找到术语milky。请注意,我不想要特定于单词或milky,我想要一个通用的解决方案,我将在更大范围内应用以处理所有这些情况)?即使解决方案不使用tm包,也没关系。我必须得到一个符合我要求的术语文档矩阵。 最终我希望能够获得一个术语文档矩阵,使得其中的每个术语都应该在所讨论的文档的所有字符串中以字符串(而不仅仅是单词)的形式查找(grepl就像功能一样在计算期限文件矩阵时)。

我用来获取术语文档矩阵的当前代码是

doc1 <-  "this is a document about milkyway"
doc2 <-  "milky way is huge"

library(tm)
tmp.text<-data.frame(rbind(doc1,doc2))
tmp.corpus<-Corpus(DataframeSource(tmp.text))
tmpDTM<-TermDocumentMatrix(tmp.corpus, control= list(tolower = T, removeNumbers = T, removePunctuation = TRUE,stopwords = TRUE,wordLengths = c(2, Inf)))
tmp.df<-as.data.frame(as.matrix(tmpDTM))
tmp.df

         1 2
document 1 0
huge     0 1
milky    0 1
milkyway 1 0
way      0 1

1 个答案:

答案 0 :(得分:0)

我不确定 tm 是否可以根据正则表达式轻松(或可能)选择或分组功能。但是文本包quanteda通过thesaurus参数在构造其文档特征矩阵时根据字典对术语进行分组。

quanteda 使用通用术语“功能”,因为此处,您的类别是包含短语 milky 而非原始“词条”的词语。)

valuetype参数可以是“glob”格式(默认),正则表达式("regex")或as-is fixed("fixed")。下面我展示了带有glob和正则表达式的版本。

require(quanteda)
myDictGlob <- dictionary(list(containsMilky = c("milky*")))
myDictRegex <- dictionary(list(containsMilky = c("^milky")))

(plainDfm <- dfm(c(doc1, doc2)))
## Creating a dfm from a character vector ...
## ... lowercasing
## ... tokenizing
## ... indexing documents: 2 documents
## ... indexing features: 9 feature types
## ... created a 2 x 9 sparse dfm
## ... complete. 
## Elapsed time: 0.008 seconds.
## Document-feature matrix of: 2 documents, 9 features.
## 2 x 9 sparse Matrix of class "dfmSparse"
## features
## docs    this is a document about milkyway milky way huge
## text1    1  1 1        1     1        1     0   0    0
## text2    0  1 0        0     0        0     1   1    1

dfm(c(doc1, doc2), thesaurus = myDictGlob, valuetype = "glob", verbose = FALSE)
## Document-feature matrix of: 2 documents, 8 features.
## 2 x 8 sparse Matrix of class "dfmSparse"
##       this is a document about way huge CONTAINSMILKY
## text1    1  1 1        1     1   0    0             1
## text2    0  1 0        0     0   1    1             1
dfm(c(doc1, doc2), thesaurus = myDictRegex, valuetype = "regex")
## Document-feature matrix of: 2 documents, 8 features.
## 2 x 8 sparse Matrix of class "dfmSparse"
##       this is a document about way huge CONTAINSMILKY
## text1    1  1 1        1     1   0    0             1
## text2    0  1 0        0     0   1    1             1