rtm软件包:utf-8文字 [英] R tm package: utf-8 text

查看:253
本文介绍了rtm软件包:utf-8文字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想为utf-8(实际上是哈萨克语)中的非英语文本创建一个wordcloud.

I would like to create a wordcloud for non-english text in utf-8 (actually, it's in kazakh language).

在tm软件包的inspect功能中,文本绝对正确地显示. 但是,当我搜索词频时,所有内容均显示不正确:

The text is displayed absolutely right in inspect function of the tm package. However, when I search for word frequency everything is displayed incorrectly:

问题是文本显示为带编码字符而不是单词.西里尔字母正确显示.结果,wordcloud变得一团糟.

The problem is that the text is displayed with coded characters instead of words. Cyrillic characters are displayed correctly. Consquently the wordcloud becomes a complete mess.

是否可以通过某种方式将编码分配给tm函数?我尝试了,但是单独的文本很好,问题是使用tm软件包.

Is it possible to assign encoding to the tm function somehow? I tried this, but the text on its own is fine, the problem is with using tm package.

让示例文本为:

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

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

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

My simple code is this: (Based on onertipaday.blogspot.com tutorials:)

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)输出中正确显示.

Those words should be: "Әлем", арман", "еді", "мәңгілік". They are displayed correctly in inspect(ap.corpus) output.

非常感谢您的帮助! :)

Highly appreciate any help! :)

推荐答案

问题来自默认的令牌生成器. tm默认使用scan_tokenizer,它会松散编码(也许您应该联系维护者以添加编码参数).

The problem comes from the default tokenizer. tm by default uses scan_tokenizer which it looses encoding(maybe you should contact the maintainer to add an encoding argument).

scan_tokenizer函数(x){ scan(text = x,what ="character",quote =",quiet = TRUE)}

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

一种解决方案是提供您自己的令牌生成器来创建矩阵项.我正在使用strsplit:

One solution is to provide your own tokenizer to create the matrix terms. I am using strsplit:

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

然后您得到的结果编码正确:

Then you get the result well encoded:

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

这篇关于rtm软件包:utf-8文字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆