【问题标题】:Text encoding issues in RR中的文本编码问题
【发布时间】:2017-09-21 14:24:36
【问题描述】:

我正在用 R 语言对西班牙语文档进行文本挖掘,并且我经常遇到编码问题,以及我想出的不同解决方案来解决这些问题。我一直在寻找不同的主题,但无法真正找到明确的解决方案。每次事情都不同的事实可能意味着我并不真正理解这个问题。

我使用pdf_text(包pdftools)从PDF中提取了文本数据,并且带有波浪线的字符被翻译成Unicode,例如"<U+00ED>"。但是,当我尝试使用gsub(或使用grepl 查找它们)将它们替换为普通字符时,R 什么也找不到。输出如下所示:

> txt
[1] "Comunidad Aut<U+00F3>noma: Pa<U+00ED>s Vasco"                              
[2] "Provincia: <U+00C1>lava"                                                   
[3] "Alda se extingue y su territorio se incorpora a Valle de Arana. Censo 1950"
> str(txt)
 chr [1:3] "Comunidad Aut<U+00F3>noma: Pa<U+00ED>s Vasco" ...
> grepl("<U\\+00F3>", txt)
[1] FALSE FALSE FALSE
> grepl("<U+00F3>", txt)
[1] FALSE FALSE FALSE
> gsub("<U\\+00F3>", "o", txt)
[1] "Comunidad Aut<U+00F3>noma: Pa<U+00ED>s Vasco"                              
[2] "Provincia: <U+00C1>lava"                                                   
[3] "Alda se extingue y su territorio se incorpora a Valle de Arana. Censo 1950"

但是,如果您手动引入这些字符串,R 会找到它们并且可以进行替换:

> txt = c("Comunidad Aut<U+00F3>noma: Pa<U+00ED>s Vasco", "Provincia: <U+00C1>lava")
> str(txt)
 chr [1:2] "Comunidad Aut<U+00F3>noma: Pa<U+00ED>s Vasco" ...
> grepl("<U\\+00F3>", txt)
[1]  TRUE FALSE
> gsub("<U\\+00F3>", "o", txt)
[1] "Comunidad Autonoma: Pa<U+00ED>s Vasco"
[2] "Provincia: <U+00C1>lava" 

为什么会这样?究竟是什么在阅读 R 以便它认为两者不同?

过去我用来构建一个适应功能,基本上用这些东西代替普通字符,但我发现在某些情况下它不起作用,我真的不明白为什么。另外,当这些数据来自 OCR 时,乱七八糟的情况就更大了,转成 UTF-8 的翻译也经常不一样,等等。

有谁知道解决这个问题的任何一般方法?将来我会在这方面进行广泛的工作。

非常感谢。

附:

> sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Sierra 10.12.6

Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
[1] pdftools_1.4  stringr_1.2.0

loaded via a namespace (and not attached):
[1] compiler_3.4.1 magrittr_1.5   tools_3.4.1    Rcpp_0.12.12  
[5] stringi_1.1.5 

【问题讨论】:

  • 如果使用“\u00f3”而不是“”会发生什么?另外,您能否提供dput(txt) 的结果,其中txt 是提取的结果?
  • 它确实有效:&gt; grepl("\u00f3", txt) [1] TRUE FALSE FALSE 为什么会这样?
  • dput 输出:另外,dput 输出:&gt; dput(txt) c("Comunidad Aut&lt;U+00F3&gt;noma: Pa&lt;U+00ED&gt;s Vasco", "Provincia:&lt;U+00C1&gt;lava", "Alda se extingue y su territorio se incorpora a Valle de Arana. Censo 1950" )
  • 很好用! “\u00f3”表示代码“00f3”的unicode字符,即“ó”。由于不建议在源代码中编写非 ascii 字符,因此我们经常使用这种类型的 unicode 表达式来代替。我猜:“”表达式在无法打印非 ascii 字母时出现在您的控制台上。但是键入“”并不表示那个字母,而是按原样解释。

标签: r text


【解决方案1】:

这里的问题是您的语言环境设置为C,所以R 将拒绝打印非ASCII 字符。如果您将您的语言环境更改为允许打印 Unicode 的语言环境,那么您将看到您所期望的字符。

txt <- "Comunidad Aut\u00F3noma: Pa\u00EDs Vasco"

Sys.setlocale("LC_CTYPE", "C") # switch character type locale to "C"
## "C"

print(txt)
## [1] "Comunidad Aut<U+00F3>noma: Pa<U+00ED>s Vasco"

Sys.setlocale("LC_CTYPE", "") # switch to native locale
## [1] "en_US.UTF-8"

print(txt)
## [1] "Comunidad Autónoma: País Vasco"

以下是如何替换“带重音符号的o”字符:

gsub("\u00F3", "o", txt)
## [1] "Comunidad Autonoma: País Vasco"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多