【问题标题】:R Corpus Is Messing Up My UTF-8 Encoded TextR 语料库弄乱了我的 UTF-8 编码文本
【发布时间】:2014-09-15 05:20:27
【问题描述】:

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

这是我的问题的可重现示例:

加载俄语文本:

> 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 (÷¸ðíûé)

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

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

但是,它的错误如图所示。

【问题讨论】:

  • 我无法复制。当我运行inspect 时,它看起来和data 中的一样。你使用的是什么版本的tm 和 R(sessionInfo() 应该告诉你)。
  • @MrFlick 我正在使用R version 3.1.0 (2014-04-10) Platform: x86_64-w64-mingw32/x64 (64-bit)tm_0.6。我在 Windows 上。
  • 好的。我在使用 3.0.2 的计算机,所以我无法获得最新版本的 tm。但是语料库没有编码参数,但 VectorSource 应该。 VectorSource(data, encoding="UTF-8") 会发生什么。有什么不同吗?
  • 上面写着,Error in VectorSource(raw_test$title, encoding = "UTF-8") : unused argument (encoding = "UTF-8")
  • 呃。由于某种原因,它似乎确实从最新版本的tm 中删除了。最后一枪,VectorSource(enc2utf8(data))。如果这不起作用,也许我可以在我的另一台计算机上尝试。

标签: r encoding utf-8 tm corpus


【解决方案1】:

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

好消息是,即使使用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
  • 你是对的,如果我创建了一个 DTM,它似乎没问题。感谢您的指导。
  • 我有一个 smilar 问题,我使用 docs&lt;- VCorpus(DirSource(directory = inputdir, encoding ="UTF-8")),我的 txt 文件以 UTF-8 编码保存,但我仍然得到 scal而不是 fiscalbenet 而不是在我导出最常见的单词和主题分布中的单词时受益。我做错了什么吗?我非常感谢任何建议
  • @Michael 我不确定那里会发生什么。也许包装又变了。如果您使用最小的reproducible example 创建自己的问题以进一步帮助您,那就更好了。
  • @MrFlick 谢谢你的建议。我继续创建了一个新线程。如果您可以提供帮助,请点击此处的链接。谢谢! stackoverflow.com/questions/61463661/…
【解决方案2】:

我很惊讶答案还没有发布。不要费心弄乱语言环境。我正在使用 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 中的东西更简洁(只需将所有内容转换为统一码!)。 R 的方法对我来说没有那么直接,而且文档稀疏和混乱也无济于事。

【讨论】:

  • Encoding() 在 Corpus 类上不起作用;它仅适用于字符向量。您确定您的解决方案按照 OP 的要求适用于 Corpus 吗?
  • 它可以在将文本转换为语料库之前使用,效果很好。
  • @KenjiKina 你能提供一个示例代码吗?
【解决方案3】:

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

Sys.setlocale("LC_ALL", "de_DE.UTF-8")

尝试用俄语运行同样的方法?

Sys.setlocale("LC_ALL", "ru_RU.UTF-8")

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    相关资源
    最近更新 更多