Rのtmパッケージを使用してテキスト分析を実行しようとしています。私は次を結びました:
require(tm)
dataSet <- Corpus(DirSource('tmp/'))
dataSet <- tm_map(dataSet, tolower)
Error in FUN(X[[6L]], ...) : invalid input 'RT @noXforU Erneut riesiger (Alt-)�lteppich im Golf von Mexiko (#pics vom Freitag) http://bit.ly/bw1hvU http://bit.ly/9R7JCf #oilspill #bp' in 'utf8towcs'
問題は、一部の文字が無効であることです。 R内から、または処理のためにファイルをインポートする前に、無効な文字を分析から除外したいと思います。
次のように、iconvを使用してすべてのファイルをutf-8に変換し、変換できないものはすべて除外しようとしました。
find . -type f -exec iconv -t utf-8 "{}" -c -o tmpConverted/"{}" \;
ここで指摘されているように iconvを使用してlatin-1ファイルをutf-8に変換するバッチ
しかし、私はまだ同じエラーを受け取ります。
私はどんな助けにも感謝します。
上記の答えのどれも私にとってはうまくいきませんでした。この問題を回避する唯一の方法は、非グラフィカル文字をすべて削除することでした( http://stat.ethz.ch/R-manual/R-patched/library/base/html/regex.html )。
コードはこれほど簡単です
usableText=str_replace_all(tweets$text,"[^[:graph:]]", " ")
これは、tm faqからのものです。
yourCorpusの変換不可能なバイトを16進コードを示す文字列に置き換えます。
これが役立つことを願っています。
tm_map(yourCorpus, function(x) iconv(enc2utf8(x), sub = "byte"))
問題はtolowerが理解できない絵文字が原因であることが今では明らかだと思います
#to remove emojis
dataSet <- iconv(dataSet, 'UTF-8', 'ASCII')
私はこの問題についたばかりです。偶然、OSXを実行しているマシンを使用していますか?私は、このオペレーティングシステム上でRがコンパイルされる文字セットの定義の問題を追跡しているようです( https://stat.ethz.ch/pipermail/r-sig-mac/2012を参照してください-July/009374.html )
私が見ていたことは、FAQのソリューションを使用することです
tm_map(yourCorpus, function(x) iconv(enc2utf8(x), sub = "byte"))
この警告を私に与えていました:
Warning message:
it is not known that wchar_t is Unicode on this platform
これはenc2utf8
関数にトレースしました。悪いニュースは、これが私の基礎となるOSの問題であり、Rではないということです。
だからここに私が回避策としてやったことです:
tm_map(yourCorpus, function(x) iconv(x, to='UTF-8-MAC', sub='byte'))
これにより、iconvはMacintoshでutf8エンコードを使用するようになり、再コンパイルする必要なく正常に動作します。
私はこれをMacで実行していましたが、不満に思って、解決するためにファウルレコード(これらはツイートだったため)を特定する必要がありました。次回以降、同じレコードであるという保証はないため、次の関数を使用しました
tm_map(yourCorpus, function(x) iconv(x, to='UTF-8-MAC', sub='byte'))
上記のように。
それは魅力のように働いた
これはtm
パッケージの一般的な問題です( 1 、 2 、)。
R
を修正する方法の1つは、テキストエディターを使用して、R
に読み込む前にテキスト内のすべての派手な文字(発音区別記号付きの文字)を見つけて置換することです(またはgsub
のR
)。たとえば、Öl-TeppichのO-umlautのすべてのインスタンスを検索および置換します。 その他 これで成功しました(私もそうです)が、何千もの個別のテキストファイルがある場合、明らかにこれは良くありません。
R
解決策の場合、VectorSource
の代わりにDirSource
を使用すると問題が解決するように思えます。
# I put your example text in a file and tested it with both ANSI and
# UTF-8 encodings, both enabled me to reproduce your problem
#
tmp <- Corpus(DirSource('C:\\...\\tmp/'))
tmp <- tm_map(dataSet, tolower)
Error in FUN(X[[1L]], ...) :
invalid input 'RT @noXforU Erneut riesiger (Alt-)Öl–teppich im Golf von Mexiko (#pics vom Freitag) http://bit.ly/bw1hvU http://bit.ly/9R7JCf #oilspill #bp' in 'utf8towcs'
# quite similar error to what you got, both from ANSI and UTF-8 encodings
#
# Now try VectorSource instead of DirSource
tmp <- readLines('C:\\...\\tmp.txt')
tmp
[1] "RT @noXforU Erneut riesiger (Alt-)Öl–teppich im Golf von Mexiko (#pics vom Freitag) http://bit.ly/bw1hvU http://bit.ly/9R7JCf #oilspill #bp"
# looks ok so far
tmp <- Corpus(VectorSource(tmp))
tmp <- tm_map(tmp, tolower)
tmp[[1]]
rt @noxforu erneut riesiger (alt-)öl–teppich im golf von mexiko (#pics vom freitag) http://bit.ly/bw1hvu http://bit.ly/9r7jcf #oilspill #bp
# seems like it's worked just fine. It worked for best for ANSI encoding.
# There was no error with UTF-8 encoding, but the Ö was returned
# as ã– which is not good
しかし、これは幸運な偶然のようです。もっと直接的な方法が必要です。あなたに合ったものを教えてください!
前者の提案はうまくいきませんでした。私はさらに調査し、以下で機能するものを見つけました https://eight2late.wordpress.com/2015/05/27/a-gentle-introduction-to-text-mining-using-r/ =
#Create the toSpace content transformer
toSpace <- content_transformer(function(x, pattern) {return (gsub(pattern," ",
x))})
# Apply it for substituting the regular expression given in one of the former answers by " "
your_corpus<- tm_map(your_corpus,toSpace,"[^[:graph:]]")
# the tolower transformation worked!
your_corpus <- tm_map(your_corpus, content_transformer(tolower))
公式FAQは私の状況では機能していないようです:
tm_map(yourCorpus, function(x) iconv(x, to='UTF-8-MAC', sub='byte'))
最後に、for&Encoding関数を使用して作成しました。
for (i in 1:length(dataSet))
{
Encoding(corpus[[i]])="UTF-8"
}
corpus <- tm_map(dataSet, tolower)
次の手順を使用します。
# First you change your document in .txt format with encoding UFT-8
library(tm)
# Set Your directoryExample ("F:/tmp").
dataSet <- Corpus(DirSource ("/tmp"), readerControl=list(language="english)) # "/tmp" is your directory. You can use any language in place of English whichever allowed by R.
dataSet <- tm_map(dataSet, tolower)
Inspect(dataSet)
無効な入力を無視しても問題ない場合は、Rのエラー処理を使用できます。例えば:
dataSet <- Corpus(DirSource('tmp/'))
dataSet <- tm_map(dataSet, function(data) {
#ERROR HANDLING
possibleError <- tryCatch(
tolower(data),
error=function(e) e
)
# if(!inherits(possibleError, "error")){
# REAL WORK. Could do more work on your data here,
# because you know the input is valid.
# useful(data); fun(data); good(data);
# }
})
ここに追加の例があります: http://gastonsanchez.wordpress.com/2012/05/29/catching-errors-when-using-tolower/
チャドのソリューションは私にとってはうまくいきませんでした。私はこれを関数に埋め込みましたが、入力としてベクトルを必要とするiconv
に関するエラーを与えていました。そこで、コーパスを作成する前に変換を行うことにしました。
myCleanedText <- sapply(myText, function(x) iconv(enc2utf8(x), sub = "byte"))