R tm包:utf-8文本

时间:2014-01-21 07:23:47

标签: r utf-8 tm

我想在utf-8中为非英语文本创建一个wordcloud(实际上,它是用哈萨克语)。

文本显示在tm包的检查功能中。 但是,当我搜索单词频率时,所有内容都显示不正确:

问题是文本显示的是编码字符而不是单词。西里尔字符正确显示。通常,wordcloud变得一团糟。

是否有可能以某种方式为tm函数分配编码?我试过this,但文本本身很好,问题在于使用tm包。

让示例文本为:

  

Оларман - әлемелдеріментерезесітеңңатынасқұрып,әлемкартасынанойыптұрыпорыналатынТәуелсізМемлекетатануеді。   Оларман - тұрмысыбақуатты,түтінітүзуұшқан,ұрпағыертеңінесенімменқарайтынбақыттыЕлболуеді。   Бізармандардыақиқатқаайналдырдық。 МәңгілікЕлдіңіргетасынқаладық。   Менқоғамда«Қазақелініңңлттықидеясықандайболуыкерек?»дегенсауалжиіталқығатүсетінінкөріпжүрмін。 Бізүшінболашағымызғабағдарететін,ұлттыұйыстырып,ұлымақсаттарғажетелейтінидеябар。 Ол - МәңгілікЕлидеясы。   ТәуелсіздікпенбіргехалқымызМәңгілікМұраттарынақолжеткізді。

我的简单代码是这样的: (基于onertipaday.blogspot.com教程:)

require(tm)
require(wordcloud)
text<-readLines("text.txt", encoding="UTF-8")
ap.corpus <- Corpus(DataframeSource(data.frame(text)))
ap.corpus <- tm_map(ap.corpus, removePunctuation)
ap.corpus <- tm_map(ap.corpus, tolower)
ap.tdm <- TermDocumentMatrix(ap.corpus)
ap.m <- as.matrix(ap.tdm)
ap.v <- sort(rowSums(ap.m),decreasing=TRUE)
ap.d <- data.frame(word = names(ap.v),freq=ap.v)
table(ap.d$freq)

1  2 
44  4 

findFreqTerms(ap.tdm, lowfreq=2)

[1] "<U+04D9>лем"            "арман"                  "еді"                   
[4] "м<U+04D9><U+04A3>гілік"

这些词应该是:“Әлем”,арман“,”еді“,”мәңгілік“。它们在inspect(ap.corpus)输出中正确显示。

非常感谢任何帮助! :)

2 个答案:

答案 0 :(得分:7)

问题来自默认的tokenizer。 tm默认情况下使用scan_tokenizer它会丢失编码(也许您应该联系维护者以添加编码参数)。

  

scan_tokenizer function(x){       scan(text = x,what =“character”,quote =“”,quiet = TRUE)}

一种解决方案是提供自己的标记生成器来创建矩阵术语。我正在使用strsplit

scanner <- function(x) strsplit(x," ")
ap.tdm <- TermDocumentMatrix(ap.corpus,control=list(tokenize=scanner))

然后你得到了很好的编码结果:

findFreqTerms(ap.tdm, lowfreq=2)
[1] "арман"    "біз"      "еді"      "әлем"     "идеясы"   "мәңгілік"

答案 1 :(得分:5)

实际上,我不同意agstudy的回答。它似乎不是一个令牌化问题。我正在使用tm包的版本0.6.0 ,您的代码对我来说很合适,除了我必须明确设置您的编码使用以下内容将文本数据转换为UTF-8:

Encoding(text)  <- "UTF-8"

以下是完整的可重复代码。只需确保将其保存在UTF-8编码的文件中,然后使用source()运行它; 使用source.with.encoding(),它会抛出错误。

text  <- "Ол арман – әлем елдерімен терезесі тең қатынас құрып, әлем картасынан ойып тұрып орын алатын Тәуелсіз Мемлекет атану еді. Ол арман – тұрмысы бақуатты, түтіні түзу ұшқан, ұрпағы ертеңіне сеніммен қарайтын бақытты Ел болу еді. Біз армандарды ақиқатқа айналдырдық. Мәңгілік Елдің іргетасын қаладық. Мен қоғамда «Қазақ елінің ұлттық идеясы қандай болуы керек?» деген сауал жиі талқыға түсетінін көріп жүрмін. Біз үшін болашағымызға бағдар ететін, ұлтты ұйыстырып, ұлы мақсаттарға жетелейтін идея бар. Ол – Мәңгілік Ел идеясы. Тәуелсіздікпен бірге халқымыз Мәңгілік Мұраттарына қол жеткізді."

Encoding(text)
# [1] "unknown"

Encoding(text)  <- "UTF-8"
# [1] "UTF-8"

ap.corpus <- Corpus(DataframeSource(data.frame(text)))
ap.corpus <- tm_map(ap.corpus, removePunctuation)
ap.corpus <- tm_map(ap.corpus, content_transformer(tolower))

content(ap.corpus[[1]])

ap.tdm <- TermDocumentMatrix(ap.corpus)

ap.m <- as.matrix(ap.tdm)
ap.v <- sort(rowSums(ap.m),decreasing=TRUE)
ap.d <- data.frame(word = names(ap.v),freq=ap.v)

print(table(ap.d$freq))
# 1  2  3 
# 62  5  1 

print(findFreqTerms(ap.tdm, lowfreq=2))
# [1] "арман"    "біз"      "еді"      "әлем"     "идеясы"   "мәңгілік"

它对我有用,希望它也适合你。