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