use*_*388 3 encoding r utf-8 corpus tm
我只是试图用俄语,UTF-8编码的文本创建一个语料库.问题是,tm包中的Corpus方法没有正确编码字符串.
这是我的问题的可重现的例子:
加载俄文文本:
> data <- c("Renault Logan, 2005","????????? ?????????, 345 ?²",
"??-???","3-? ????????, 64 ?², 3/5 ??.","Samsung galaxy S4 mini GT-I9190 (??????)")
Run Code Online (Sandbox Code Playgroud)
创建一个VectorSource:
> vs <- VectorSource(data)
> vs # outputs correctly
Run Code Online (Sandbox Code Playgroud)
然后,创建语料库:
> corp <- Corpus(vs)
> inspect(corp) # output is not encoded properly
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
> 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 (÷¸ðíûé)
Run Code Online (Sandbox Code Playgroud)
为什么输出不正确? 似乎没有任何选项可以在Corpus方法上设置编码.事后是否有办法设置它?我试过这个:
> title_corpus <- tm_map(title_corpus, enc2utf8)
Error in FUN(X[[1L]], ...) : argumemt is not a character vector
Run Code Online (Sandbox Code Playgroud)
但是,它显示错误.
好吧,似乎有好消息和坏消息.
好消息是数据看起来很好,即使它没有正确显示inspect().试着看
content(corp[[2]])
# [1] "????????? ?????????, 345 ?²"
Run Code Online (Sandbox Code Playgroud)
它看起来很有趣的inspect()原因是作者改变了print.PlainTextDocument函数的工作方式.它以前cat是筛选的价值.然而,现在,他们提供数据writeLines().此函数使用系统的语言环境来格式化文档中的字符/字节.(可以查看Sys.getlocale()).事实证明,Linux和OS X具有适当的"UTF-8"编码,但Windows使用特定于语言的代码页.因此,如果字符不在代码页中,则它们会被转义或转换为有趣的字符.这意味着这应该可以在Mac上正常工作,但不能在PC上工作.
尝试更进一步,构建DocumentTermMatrix
dtm <- DocumentTermMatrix(corp)
Terms(dtm)
Run Code Online (Sandbox Code Playgroud)
希望你会看到(正如我所说)正确显示的单词.
如果您愿意,这篇关于在Windows上编写UTF-8文件的文章提供了有关此操作系统特定问题的更多信息.我认为没有简单的方法可以让writeLines stdout()在Windows上输出UTF-8 .我不确定为什么包维护者改变了打印方法,但有人可能会要求或提交功能请求来更改它.