我想在utf-8中为非英语文本创建一个单词云(实际上,它是哈萨克语)。
文本在tm包的检查功能中完全正确地显示。但是,当我搜索单词频率时,所有内容都显示得不正确:
问题是文本是用编码字符而不是文字来显示的。正确显示西里尔字符。这句话一下子就成了一片混乱。
是否可以以某种方式将编码分配给tm函数?我尝试了这,但是文本本身很好,问题是如何使用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)输出中正确显示。
(非常感谢任何帮助!)
发布于 2014-01-21 07:52:56
问题来自默认的令牌程序。默认情况下,tm使用scan_tokenizer,它会放松编码(也许您应该联系维护人员来添加编码参数)。
scan_tokenizer函数(x) {扫描(文本= x,什么=“字符”,引号= "",静音=真)}
一种解决方案是提供您自己的令牌程序来创建矩阵项。我正在使用strsplit
scanner <- function(x) strsplit(x," ")
ap.tdm <- TermDocumentMatrix(ap.corpus,control=list(tokenize=scanner))然后得到编码良好的结果:
findFreqTerms(ap.tdm, lowfreq=2)
[1] "арман" "біз" "еді" "әлем" "идеясы" "мәңгілік"发布于 2015-02-05 09:34:11
实际上,我不同意农学的回答。这似乎不是令牌器问题。我使用的是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] "арман" "біз" "еді" "әлем" "идеясы" "мәңгілік"它对我有效,希望对你也有用。
https://stackoverflow.com/questions/21251736
复制相似问题