首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R包: utf-8文本

R包: utf-8文本
EN

Stack Overflow用户
提问于 2014-01-21 07:23:47
回答 2查看 5.3K关注 0票数 5

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

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

问题是文本是用编码字符而不是文字来显示的。正确显示西里尔字符。这句话一下子就成了一片混乱。

是否可以以某种方式将编码分配给tm函数?我尝试了,但是文本本身很好,问题是如何使用tm包。

让一个样本文本是:

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

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

代码语言:javascript
复制
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)输出中正确显示。

(非常感谢任何帮助!)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-21 07:52:56

问题来自默认的令牌程序。默认情况下,tm使用scan_tokenizer,它会放松编码(也许您应该联系维护人员来添加编码参数)。

scan_tokenizer函数(x) {扫描(文本= x,什么=“字符”,引号= "",静音=真)}

一种解决方案是提供您自己的令牌程序来创建矩阵项。我正在使用strsplit

代码语言:javascript
复制
scanner <- function(x) strsplit(x," ")
ap.tdm <- TermDocumentMatrix(ap.corpus,control=list(tokenize=scanner))

然后得到编码良好的结果:

代码语言:javascript
复制
findFreqTerms(ap.tdm, lowfreq=2)
[1] "арман"    "біз"      "еді"      "әлем"     "идеясы"   "мәңгілік"
票数 7
EN

Stack Overflow用户

发布于 2015-02-05 09:34:11

实际上,我不同意农学的回答。这似乎不是令牌器问题。我使用的是tm包的版本0.6.0,您的代码对我来说很好,只是我必须使用显式将文本数据的编码设置为UTF-8,使用:

代码语言:javascript
复制
Encoding(text)  <- "UTF-8"

下面是完整的可复制代码。只需确保使用UTF-8编码将其保存在文件中,并使用source()运行它;不使用使用source.with.encoding(),它会引发错误。

代码语言:javascript
复制
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] "арман"    "біз"      "еді"      "әлем"     "идеясы"   "мәңгілік"

它对我有效,希望对你也有用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21251736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档