2017-07-27 126 views
1

我正在做一些涉及葡萄牙語文本的文本挖掘。我的一些自定義文本挖掘功能中還有其他特殊字符。這些不同的編碼爲什麼不能讓我正確顯示葡萄牙語?

我不是這方面的專家。當我的很多字符開始顯示不正確時,我認爲我需要更改文件編碼。我試圖

  • ISO-8858-1
  • ISO-8858-7
  • UTF-8
  • WINDOWS-1252

無它們提高了字符的顯示。我是否需要一種不同的編碼方式,或者我是否會全力以赴?

例如,當我嘗試從GitHub讀取停用詞名單:

stop_words <- read.table("https://gist.githubusercontent.com/alopes/5358189/raw/2107d809cca6b83ce3d8e04dbd9463283025284f/stopwords.txt") 

他們出來是這樣的:

tail(stop_words, 17) 
206 tivéramos 
207   tenha 
208  tenhamos 
209  tenham 
210  tivesse 
211 tivéssemos 
212  tivessem 
213   tiver 
214  tivermos 
215  tiverem 
216   terei 
217   terá 
218  teremos 
219  terão 
220   teria 
221  teríamos 
222  teriam 

我也試用stringsAsFactors = F

我不會說葡萄牙語,但我的直覺告訴我,歐元和版權符號不在他們的字母表中。另外,它似乎正在將一些重音小寫的e改爲大寫的不同重音的A。

在情況下,它是有幫助:

Sys.getlocale() 

[1]「LC_COLLATE = English_United States.1252; LC_CTYPE = English_United States.1252; LC_MONETARY = English_United States.1252; LC_NUMERIC = C; LC_TIME = English_United States.1252「

我也嘗試更改區域設置,stri_encode(stop_words$V1, "", "UTF-8")tail(enc2native(as.vector(stop_words[,1])),17)

+0

我不認爲問題是與葡萄牙字母表。當我從上面的代碼中得到GitHub的stop_words時,我可以看到正確格式化的字符。你如何改變文件編碼? –

+0

@OriolMirosa我改變了編碼從我的系統默認,這是ISO-8859-1之前有問題。我嘗試使用RStudio(重新打開編碼)更改它,然後重新排列數據。我也試着用'stringi'軟件包改變它。我認爲下面的答案是正確的,它是雙編碼莫名其妙,但我不知道爲什麼或如何解決它。 –

+0

您是否試過'enc2utf8(as.vector(stop_words [,1]))'或'enc2native(as.vector(stop_words [,1]))' –

回答

1

你似乎是utf-8的雙重編碼。

以下是utf-8中的字符表:http://www.i18nqa.com/debug/utf8-debug.html
現在看一下「Actual」列。如您所見,打印的字符似乎代表實際值而不是編碼值。

臨時解決方法是解碼一層utf-8。

更新:

安裝R後,我試圖重現該問題。
這裏是我的控制檯日誌,一個簡單的解釋:

首先,我複製粘貼代碼:

> stop_words <- read.table("https://gist.githubusercontent.com/alopes/5358189/raw/2107d809cca6b83ce3d8e04dbd9463283025284f/stopwords.txt") 
> tail(stop_words, 17) 
      V1 
206 tivéramos 
207  tenha 
208 tenhamos 
209  tenham 
210  tivesse 
211 tivéssemos 
212 tivessem 
213  tiver 
214 tivermos 
215  tiverem 
216  terei 
217  terá 
218  teremos 
219  terão 
220  teria 
221 teríamos 
222  teriam 

好了,所以也沒爲是工作,所以我增加了編碼參數的read.table函數的結尾。 有去,結果當我試圖小寫UTF-8:

> stop_words <- read.table("https://gist.githubusercontent.com/alopes/5358189/raw/2107d809cca6b83ce3d8e04dbd9463283025284f/stopwords.txt",encoding="utf-8") 
> tail(stop_words, 17) 
      V1 
206 tivéramos 
207  tenha 
208 tenhamos 
209  tenham 
210  tivesse 
211 tivéssemos 
212 tivessem 
213  tiver 
214 tivermos 
215  tiverem 
216  terei 
217  terá 
218  teremos 
219  terão 
220  teria 
221 teríamos 
222  teriam 

最後,我用UTF-8以大寫字母,現在它工作正常:

> stop_words <- read.table("https://gist.githubusercontent.com/alopes/5358189/raw/2107d809cca6b83ce3d8e04dbd9463283025284f/stopwords.txt", encoding = "UTF-8") 
> tail(stop_words, 17) 
      V1 
206 tivéramos 
207  tenha 
208 tenhamos 
209  tenham 
210 tivesse 
211 tivéssemos 
212 tivessem 
213  tiver 
214 tivermos 
215 tiverem 
216  terei 
217  terá 
218 teremos 
219  terão 
220  teria 
221 teríamos 
222  teriam 

你可能有忘記把編碼參數放在read.table的末尾,或者用小寫而不是上限來嘗試。我的理解是,如果你沒有指定它已經被編碼,R會試圖將這些字符轉換爲UTF-8。

+0

我可以從圖表中看到你是正確的。我試圖弄清楚如何遵循你的建議。如果你知道如何做到這一點,你可能會使用鏈接的GitHub文本顯示我?我看到一些如何在Python中修復雙重編碼的例子,但不是R. –

+1

如果沒有找到答案,我可能會在稍後查看它。 –

1

我葡萄牙語和我有同樣的問題,但我的編碼是

Sys.getlocale() 
[1] "LC_COLLATE=Portuguese_Portugal.1252;LC_CTYPE=Portuguese_Portugal.1252;LC_MONETARY=Portuguese_Portugal.1252;LC_NUMERIC=C;LC_TIME=Portuguese_Portugal.1252" 

所以我看着它在網上發現這個技巧在SO

stop_words2 <- sapply(stop_words, as.character) 

它工作。但是我使用read.table(..., stringsAsfactors = FALSE)來讀取數據。

+0

非常感謝。這對我不起作用,但我們可以爲將來可能有與您的情況相同的問題/解決方案的讀者保留答案。 –

+0

@ Hack-R:可能因爲您的語言環境而無法使用。你不能改變它嗎? –

+0

沒有運氣,但好主意 –