r中的分词

时间:2014-03-17 13:51:05

标签: r

我有一个包含普通句子的大量文本文件(50,000+)。这些句子中的一些具有合并在一起的单词,因为一些终结线已经放在一起。我如何在R中取消部分这些单词?

我能得到的唯一建议是herekind of attempted something from here,但这两个建议都需要我无法使用的大矩阵,因为我的内存耗尽或RStudio崩溃:(可以有人帮忙吗?请问?这是我正在使用的文本文件的示例(还有超过50,000个来自此文件):

Mad cow disease, BSE, or bovine spongiform encephalopathy, has cost the country dear.
More than 170,000 cattle in England, Scotland and Wales have contracted BSE since 1988.

More than a million unwanted calves have been slaughtered, and more than two and a quarter million older cattle killed, their remains dumped in case they might be harbouring         the infection.

In May, one of the biggest cattle markets, at Banbury in Oxfordshire, closed down. Avictim at least in part, of this bizarre crisis.

The total cost of BSE to the taxpayer is set to top £4 billion.

编辑:例如:     "它受到补贴的缓冲,生活在一个虚幻的世界里。许多农民没有想到农场门外发生的事情,因为总有人愿意购买他们生产的东西。"

请参阅' aboutwhat'部分。那么每100篇文章约有1篇文章发生这种情况。不是这篇实际的文章,我只是将上面的内容作为一个例子。单词已经以某种方式结合在一起(我想当我在一些文章中读到它们中的一些已经错过了空格或者我的记事本读者加入了一行与另一行的结尾)。

编辑2:这是我使用他们所拥有的变体here替换创建的列表和读入列表时得到的错误:

Error: assertion 'tree->num_tags == num_tags' failed in executing regexp: file 'tre-compile.c', line 627 

我之前从未见过这个错误,但确实出现herehere,但两者都无法解决:(

1 个答案:

答案 0 :(得分:0)

根据您的评论,我使用的environment基本上是R中的哈希表。首先构建所有已知单词的哈希值:

words <- new.env(hash=TRUE)
for (w in c("hello","world","this","is","a","test")) words[[tolower(w)]] <- T

(您实际上想要使用/usr/share/dict/words或类似的内容),然后我们定义一个执行您所描述内容的函数:

dosplit <- function (w) {
  if(is.null(words[[tolower(w)]])) {
    n <- nchar(w)
    for (i in 1:(n-1)) {
      a <- substr(w,1,i)
      b <- substr(w,i+1,n)
      if(!is.null(words[[tolower(a)]]) && !is.null(words[[tolower(b)]]))
        return (c(a,b))
    }
  }
  w
}

然后我们可以测试它:

test <- 'hello world, this isa test'
ll <- lapply(strsplit(test,'[ \t]')[[1]], dosplit)

如果你想把它放回一个以空格分隔的列表:

do.call(paste, as.list(unlist(ll,use.names=FALSE)))

请注意,对于大量文本,这将是,R并不是真正为这类事物构建的。我个人使用Python来完成这类任务,如果它变得更大,我会使用编译语言。