使用TermDocumentMatrix进行UTF-8字符编码

时间:2017-04-17 17:20:20

标签: r utf-8 tm

我正在努力学习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新手在这里。此外,如果我们能解决这个问题,我认为我也有表情符号的问题。我想删除甚至更好地使用它们:)

2 个答案:

答案 0 :(得分: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中的运行或源按钮并不起作用。我还确保选择&#34; Save with Encoding&#34; &#34; UTF-8&#34; (虽然这可能是必要的,因为我有土耳其文本)

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

这是第二个答案R tm package: utf-8 text最终有用。

答案 1 :(得分:0)

我有一个来自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所提供的答案都不起作用。