web-dev-qa-db-ja.com

「utf8towcs」でのR tmパッケージの無効な入力

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に変換するバッチ

しかし、私はまだ同じエラーを受け取ります。

私はどんな助けにも感謝します。

27
maiaini

上記の答えのどれも私にとってはうまくいきませんでした。この問題を回避する唯一の方法は、非グラフィカル文字をすべて削除することでした( http://stat.ethz.ch/R-manual/R-patched/library/base/html/regex.html )。

コードはこれほど簡単です

usableText=str_replace_all(tweets$text,"[^[:graph:]]", " ") 
57
David

これは、tm faqからのものです。

yourCorpusの変換不可能なバイトを16進コードを示す文字列に置き換えます。

これが役立つことを願っています。

tm_map(yourCorpus, function(x) iconv(enc2utf8(x), sub = "byte"))

http://tm.r-forge.r-project.org/faq.html

24
user1374611

問題はtolowerが理解できない絵文字が原因であることが今では明らかだと思います

#to remove emojis
dataSet <- iconv(dataSet, 'UTF-8', 'ASCII')
13
Saurabh Yadav

私はこの問題についたばかりです。偶然、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エンコードを使用するようになり、再コンパイルする必要なく正常に動作します。

10
Kenton

私はこれをMacで実行していましたが、不満に思って、解決するためにファウルレコード(これらはツイートだったため)を特定する必要がありました。次回以降、同じレコードであるという保証はないため、次の関数を使用しました

tm_map(yourCorpus, function(x) iconv(x, to='UTF-8-MAC', sub='byte'))

上記のように。

それは魅力のように働いた

4
Krishna Vedula

これはtmパッケージの一般的な問題です( 12 、)。

Rを修正する方法の1つは、テキストエディターを使用して、Rに読み込む前にテキスト内のすべての派手な文字(発音区別記号付きの文字)を見つけて置換することです(またはgsubR)。たとえば、Ö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

しかし、これは幸運な偶然のようです。もっと直接的な方法が必要です。あなたに合ったものを教えてください!

2
Ben

前者の提案はうまくいきませんでした。私はさらに調査し、以下で機能するものを見つけました 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))
2
vicarizmendi

公式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)
1
pudding

次の手順を使用します。

# 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)
1

無効な入力を無視しても問題ない場合は、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/

1
Rose Perrone

チャドのソリューションは私にとってはうまくいきませんでした。私はこれを関数に埋め込みましたが、入力としてベクトルを必要とするiconvに関するエラーを与えていました。そこで、コーパスを作成する前に変換を行うことにしました。

myCleanedText <- sapply(myText, function(x) iconv(enc2utf8(x), sub = "byte"))