R语料库正在弄乱我的UTF-8编码文本

时间:2014-07-23 20:32:07

标签: r encoding utf-8 tm corpus

我只是想用俄语,UTF-8编码的文本创建一个语料库。问题是,tm包中的Corpus方法没有正确编码字符串。

以下是我的问题的可重复示例:

加载俄文:

> data <- c("Renault Logan, 2005","Складское помещение, 345 м²",
          "Су-шеф","3-к квартира, 64 м², 3/5 эт.","Samsung galaxy S4 mini GT-I9190 (чёрный)")

创建一个VectorSource:

> vs <- VectorSource(data)
> vs # outputs correctly

然后,创建语料库:

> corp <- Corpus(vs)
> inspect(corp) # output is not encoded properly

我得到的输出是:

> inspect(corp)
<<VCorpus (documents: 5, metadata (corpus/indexed): 0/0)>>

[[1]]
<<PlainTextDocument (metadata: 7)>>
Renault Logan, 2005

[[2]]
<<PlainTextDocument (metadata: 7)>>
Ñêëàäñêîå ïîìåùåíèå, 345 ì<U+00B2>

[[3]]
<<PlainTextDocument (metadata: 7)>>
Ñó-øåô

[[4]]
<<PlainTextDocument (metadata: 7)>>
3-ê êâàðòèðà, 64 ì<U+00B2>, 3/5 ýò.

[[5]]
<<PlainTextDocument (metadata: 7)>>
Samsung galaxy S4 mini GT-I9190 (÷¸ðíûé)

为什么输出不正确?似乎没有任何选项可以在Corpus方法上设置编码。事后是否有办法设置它?我试过这个:

> title_corpus <- tm_map(title_corpus, enc2utf8)
Error in FUN(X[[1L]], ...) : argumemt is not a character vector

但是,它显示错误。

3 个答案:

答案 0 :(得分:6)

好吧,似乎有好消息和坏消息。

好消息是即使数据无法与inspect()正确显示,数据似乎仍然正常。试着看

content(corp[[2]])
# [1] "Складское помещение, 345 м²"

inspect()中看起来很有趣的原因是作者改变了print.PlainTextDocument功能的工作方式。它以前会cat要筛选的值。但是,现在他们通过writeLines()提供数据。此函数使用系统的语言环境来格式化文档中的字符/字节。 (可以使用Sys.getlocale()查看)。事实证明,Linux和OS X具有适当的“UTF-8”编码,但Windows使用特定于语言的代码页。因此,如果字符不在代码页中,则它们会被转义或转换为有趣的字符。这意味着这应该可以在Mac上正常工作,但不能在PC上工作。

尝试更进一步,构建DocumentTermMatrix

dtm <- DocumentTermMatrix(corp)
Terms(dtm)

希望你能看到(正如我所说)正确显示的字样。

如果您愿意,this article about writing UTF-8 files on Windows可以获得有关此操作系统特定问题的更多信息。我认为没有简单的方法让writeLines在Windows上将UTF-8输出到stdout()。我不确定为什么包维护者改变了打印方法,但有人可能会要求或提交功能请求来更改它。

答案 1 :(得分:3)

我很惊讶答案还没有发布。不要打扰搞乱语言环境。我正在使用tm软件包版本0.6.0并且它可以正常工作,只要你添加以下一点魔法:

Encoding(data)  <- "UTF-8"

嗯,这是可重现的代码:

data <- c("Renault Logan, 2005","Складское помещение, 345 м²","Су-шеф","3-к квартира, 64 м², 3/5 эт.","Samsung galaxy S4 mini GT-I9190 (чёрный)")

Encoding(data)
# [1] "unknown" "unknown" "unknown" "unknown" "unknown"

Encoding(data)  <- "UTF-8"
# [1] "unknown" "UTF-8"   "UTF-8"   "UTF-8"   "UTF-8"

只需将其放入使用UTF-8编码保存的文本文件中,然后在R中正常获取。但是使用source.with.encoding(..., encoding = "UTF-8");它会引发错误。

我忘记了我在哪里学到了这个技巧,但是在过去的一周里,我在网上浏览时试图学习如何处理R中的UTF8文本。事情在Python中很简单(只需将所有内容转换为Unicode的!)。 R的方法对我来说简直不那么直接,而且文档的稀疏性和混乱也无济于事。

答案 2 :(得分:1)

导入文本时,我遇到了德语UTF-8编码问题。对我来说,下一个oneliner帮助:

  

Sys.setlocale(“LC_ALL”,“de_DE.UTF-8”)

尝试与俄语一样运行吗?

  

Sys.setlocale(“LC_ALL”,“ru_RU.UTF-8”)

当然,这是在库(tm)之后和创建语料库之前。