我只是想从俄语、UTF-8 编码的文本创建一个语料库。问题是,来自 tm
的语料库方法包未正确编码字符串。
这是我的问题的可重现示例:
载入俄文:
> data <- c("Renault Logan, 2005","Складское помещение, 345 м²",
"Су-шеф","3-к квартира, 64 м², 3/5 эт.","Samsung galaxy S4 mini GT-I9190 (чёрный)")
创建一个矢量源:
> 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
但是,如图所示出错。
最佳答案
好吧,似乎有好消息和坏消息。
好消息是,即使 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 将 UTF-8 输出到
stdout()
在 Windows 上。我不知道为什么包维护者改变了打印方法,但人们可能会要求或提交一个功能请求来改变它。
关于R 语料库弄乱了我的 UTF-8 编码文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24920396/