【问题标题】:UTF-8 Character Encoding with TermDocumentMatrix使用 TermDocumentMatrix 的 UTF-8 字符编码
【发布时间】:2017-09-13 08:21:51
【问题描述】:

我正在努力学习 R。 我已经尝试解决这个问题好几个小时了。我已经搜索并尝试了很多方法来解决这个问题,但到目前为止还没有运气。所以我们开始了; 我正在从 twitter(通过 twitteR)下载一些随机推文。当我检查我的数据框时,我可以看到所有特殊字符(例如;üğıİşçÇöÖ)。我正在删除一些东西(如空格等)毕竟删除和操作我的语料库一切看起来都很好。 当我尝试创建 TermDocumentMatrix 时,字符编码问题就开始了。 之后“tdm”和“df”有一些奇怪的符号,可能丢失了一些字符?? 这是代码;

tweetsg.df <- twListToDF(tweets)
#looks good. no encoding problems.
wordCorpus <- Corpus(VectorSource(tweetsg.df$text))
wordCorpus <- tm_map(wordCorpus, removePunctuation)
wordCorpus <- tm_map(wordCorpus, content_transformer(tolower))
#wordCorpus looks fine at this point.
tdm <- TermDocumentMatrix(wordCorpus, control = list(tokenize="scan", 
wordLengths = c(3, Inf),language="Turkish"))
term.freq <- rowSums(as.matrix(tdm))
term.freq <- subset(term.freq, term.freq >= 1)
df <- data.frame(term = names(term.freq), freq = term.freq)

此时 tdm 和 df 都有奇怪的符号和缺失的字符。

到目前为止我已经尝试过什么;

  • 尝试使用不同的标记器。也是定制的。
  • 已将 Sys.setLocale 更改为我自己的语言。
  • 使用 enc2utf8
  • 将我的系统 (windows 10) 显示语言更改为我自己的语言

仍然没有运气!接受任何类型的帮助或指示:) PS:这里是非英语演讲者和 R 新手。另外,如果我们能解决这个问题,我想我也有表情符号的问题。我想删除甚至更好地使用它们:)

【问题讨论】:

  • 你有一些示例推文吗?即使是几行也可能有用。
  • 当然!但是由于编码问题从 TermDocumentMatrix 开始,我可以给你一个错误的单词; 100yÄ = 应该是 100 yıl 或 100yıl deÄŸiÅŸtirdik = 应该是“değiştirdik” hayÄ = 我猜应该是“hayır”。我怀疑这也是在这种情况下失去最后一个字符“r”的单词之一。
  • 是的,我已经尝试过我自己的标记器(这是建议并接受的答案),遗憾的是它并没有改变任何东西。
  • stackoverflow.com/a/51847835 stackoverflow.com/questions/51269083/… 试试这个:Sys.setlocale('LC_ALL','C')

标签: r utf-8 tm


【解决方案1】:

我设法复制了您的问题,并进行了更改以获取土耳其语输出。换行试试

wordCorpus <- Corpus(VectorSource(tweetsg.df$text))

wordCorpus <- Corpus(DataframeSource(data.frame(tweetsg.df$text)))

并添加与此类似的行。

Encoding(tweetsg.df$text)  <- "UTF-8"

我开始工作的代码是

library(tm)
sampleTurkish <- "değiştirdik değiştirdik değiştirdik"
Encoding(sampleTurkish)  <- "UTF-8"
#looks good. no encoding problems.
wordCorpus <- Corpus(DataframeSource(data.frame(sampleTurkish)))
wordCorpus <- tm_map(wordCorpus, removePunctuation)
wordCorpus <- tm_map(wordCorpus, content_transformer(tolower))
#wordCorpus looks fine at this point.
tdm <- TermDocumentMatrix(wordCorpus)
term.freq <- rowSums(as.matrix(tdm))
term.freq <- subset(term.freq, term.freq >= 1)
df <- data.frame(term = names(term.freq), freq = term.freq)

print(findFreqTerms(tdm, lowfreq=2))

这仅适用于控制台中的 source 命令。即单击 RStudio 中的运行或源按钮不起作用。我还确保我选择了“使用编码保存”“UTF-8”(尽管这可能只是因为我有土耳其语文本才需要)

> source("Turkish.R")
[1] "değiştirdik"

最后有用的是第二个答案R tm package: utf-8 text

【讨论】:

  • 谢谢!我也尝试了第二个答案,但无法让它与语料库或数据帧一起使用。这解决了我的问题!再次感谢!
【解决方案2】:

我有一个来自 postgreSQL 数据库的带有 UTF-8 编码的字符串向量,它抛出了相同的错误,但建议的解决方案都没有奏效(详见下文)。所以我的解决方案是使用 iconv 函数简单地将UTF-8 转换为latin1。然后我可以使用普通的VectorSource 函数创建语料库。

# text: loaded from PostgreSQL in UTF-8
# convert to latin1
text <- iconv(text, "UTF-8", "latin1")

wordCorpus <- Corpus(VectorSource(text))

也许这对其他人有帮助。


对我不起作用的解决方案:首先我按照 Jeremy 的回答,从 VectorSource 更改为 DataframeSource 并将编码更改为 UTF-8,但随后出现新错误:

Error: all(!is.na(match(c("doc_id", "text"), names(x)))) is not TRUE

我找到了这个线程 (Error faced while using TM package's VCorpus in R),但是提供的为新版本的 tm 包手动创建 data.frame 的答案也不起作用。

【讨论】:

    猜你喜欢
    • 2020-09-20
    • 2014-06-09
    • 2017-07-27
    • 2011-06-17
    • 2018-07-02
    • 2017-04-27
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多