使用R语料库保留文档ID

时间:2014-07-01 02:07:57

标签: r text text-mining tm corpus

我搜索了stackoverflow和网络,只能找到部分解决方案,或者由于TM或qdap的变化而无效的部分解决方案。问题如下:

我有一个数据框: ID 文字(简单文档 id / name ,然后是一些文本

我有两个问题:

第1部分:如何创建tdm或dtm并维护文档名称/ ID?它只在inspect(tdm)上显示“character(0)” 第2部分:我只想保留一个特定的术语列表,即删除自定义停用词的相反列表。我希望这发生在语料库中,而不是tdm / dtm。

对于第2部分,我使用了我在这里得到的解决方案:How to implement proximity rules in tm dictionary for counting words?

这个发生在tdm部分!对于使用类似“tm_map(my.corpus, keepOnlyWords ,自定义列表)”的第2部分,是否有更好的解决方案?

任何帮助将不胜感激。 非常感谢!

2 个答案:

答案 0 :(得分:14)

首先,这是一个示例data.frame

dd<-data.frame(
    id=10:13,
    text=c("No wonder, then, that ever gathering volume from the mere transit ",
      "So that in many cases such a panic did he finally strike, that few ",
      "But there were still other and more vital practical influences at work",
      "Not even at the present day has the original prestige of the Sperm Whale")
    ,stringsAsFactors=F
 )

现在,为了从data.frame中读取特殊属性,我们将使用readTabular函数来创建我们自己的自定义data.frame阅读器。这就是我们需要做的所有事情

library(tm)
myReader <- readTabular(mapping=list(content="text", id="id"))

我们只需指定要用于内容的列和data.frame中的id。现在我们使用DataframeSource阅读它,但使用我们的自定义阅读器。

tm <- VCorpus(DataframeSource(dd), readerControl=list(reader=myReader))

现在,如果我们只想保留一组单词,我们就可以创建自己的content_transformer函数。一种方法是

keepOnlyWords<-content_transformer(function(x,words) {
    regmatches(x, 
        gregexpr(paste0("\\b(",  paste(words,collapse="|"),"\\b)"), x)
    , invert=T)<-" "
    x
})

这将用空格替换单词列表中没有的所有内容。请注意,您可能希望在此之后运行stripWhitespace。因此,我们的转换看起来像

keep<-c("wonder","then","that","the")

tm<-tm_map(tm, content_transformer(tolower))
tm<-tm_map(tm, keepOnlyWords, keep)
tm<-tm_map(tm, stripWhitespace)

然后我们可以将其转换为文档术语矩阵

dtm<-DocumentTermMatrix(tm)
inspect(dtm)

# <<DocumentTermMatrix (documents: 4, terms: 4)>>
# Non-/sparse entries: 7/9
# Sparsity           : 56%
# Maximal term length: 6
# Weighting          : term frequency (tf)

#     Terms
# Docs that the then wonder
#   10    1   1    1      1
#   11    2   0    0      0
#   12    0   1    0      0
#   13    0   3    0      0

你可以使用我们的单词列表和data.frame

中的正确文档ID

答案 1 :(得分:3)

在新版本的tm中,使用DataframeSource()函数要容易得多。

“数据框源将数据框x的每一行解释为一个文档。第一列必须命名为” doc_id“,并且每个文档均包含唯一的字符串标识符。第二列必须命名为” text“并包含一个表示文档内容的“ UTF-8”编码字符串。可选的附加列用作文档级元数据。”

所以在这种情况下:

dd <-data.frame(
    doc_id=10:13,
    text=c("No wonder, then, that ever gathering volume from the mere transit ",
      "So that in many cases such a panic did he finally strike, that few ",
      "But there were still other and more vital practical influences at work",
      "Not even at the present day has the original prestige of the Sperm Whale")
    ,stringsAsFactors=F
 )

Corpus = VCorpus(DataframeSource(dd))