2017-05-04 107 views
0

我有一个名为'str'的字符串,我从加载RDS文件中获得。ngram包的文本编码问题

此字符串包含法语口音,在R studio控制台中显示得很好。 但是,在此字符串上使用ngram包时,重音字符不会显示正确。

如果我直接在R中定义一个重音字符串,它工作得很好(请参阅下面的代码中的'str2')。

我该如何解决这个问题,例如,在我的原始字符串上强制使用新的编码。

str # console displays "crédit hypothécaire en juillet" 
ng <- ngram(str, n = 2,sep= " ") 
get.phrasetable(ng) 
# ngrams freq  prop 
# 1  hypothécaire en  1 0.3333333 
# 2 crédit hypothécaire  1 0.3333333 
# 3   en juillet  1 0.3333333 
str2 <- "crédit hypothécaire en juillet" 
ng2 <- ngram(str2, n = 2,sep= " ") 
get.phrasetable(ng2) 
# ngrams freq  prop 
# 1  hypothécaire en  1 0.3333333 
# 2 crédit hypothécaire  1 0.3333333 
# 3   en juillet  1 0.3333333 

编辑:

建议链接(handling special characters e.g. accents in R)未提供的验证答案解决我的问题,所以它不是一个重复的问题,但它确实提供了一些线索,请参见下面

答案
+1

首先想到,不要使用str,因为它是R中的一个内部函数。请参阅'?str'表示我的意思。 –

+1

[处理特殊字符例如在R的口音](http://stackoverflow.com/questions/9511281/handling-special-characters-eg-accents-in-r) –

+0

@ErikSchutte它用于所有的ngram包的例子,所以我保持一致: ) –

回答

0

继问题评论中@ErikSchutte的链接后,我发现我需要的东西。这不是重复的,但验证的答案不适用于我。

我会发布什么工作,但我不明白为什么它这样做,我不会验证自己的答案,如果它来了,我会验证更好的。

从 'handling special characters e.g. accents in R' 我发现下面的观点:

Encoding(str) <- "UTF-8" 
Encoding(str) <- "LATIN1" 
str <- iconv(str, from="UTF-8", to="LATIN1") 
str <- iconv(str, from="LATIN1", to="UTF-8") 
enc2utf8(as(str, "character")) 

一个(且只有一个)的这些工作对我来说,这一个:

str <- iconv(str, from="UTF-8", to="LATIN1") 

编辑:

这当你知道你的字符串没有被正确编码时,这条线很好地工作,但是如果它被正确编码,它会将它改变成NA。这是我解决问题的不可靠解决方案:

str_arr # a string or array of strings 
encode_to_latin1 <- function(str_arr){ 
    str_arr_converted <- iconv(str_arr, from="UTF-8", to="LATIN1") 
    nas <- is.na(str_arr_converted) 
    str_arr_converted[nas] <- str_arr[nas] 
    return(str_arr_converted) 
} 
str_arr <- encode_to_latin1(str_arr) 
+0

尽管当应用于已经很好编码的字符串时,它会返回NA ... –