2012-03-09 16 views
23

Tôi đang cố gắng sử dụng gói tm trong R để thực hiện một số phân tích văn bản. Tôi đã gắn các thông tin sau:Đầu vào không hợp lệ gói R tm trong 'utf8towcs'

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' 

Sự cố là một số ký tự không hợp lệ. Tôi muốn loại trừ các ký tự không hợp lệ khỏi phân tích hoặc từ bên trong R hoặc trước khi nhập các tệp để xử lý.

tôi đã cố gắng sử dụng iconv để chuyển đổi tất cả các file để utf-8 và loại trừ bất cứ điều gì mà không thể được chuyển đổi sang đó như sau:

find . -type f -exec iconv -t utf-8 "{}" -c -o tmpConverted/"{}" \; 

như đã chỉ ra ở đây Batch convert latin-1 files to utf-8 using iconv

Nhưng tôi vẫn nhận được cùng một lỗi.

Tôi đánh giá cao bất kỳ trợ giúp nào.

Trả lời

2

Đây là vấn đề phổ biến với gói tm (1, 2, 3).

Một phi R cách để sửa chữa nó là sử dụng một trình soạn thảo văn bản để tìm và thay thế tất cả các nhân vật ưa thích (ví dụ. Những người có dấu) trong văn bản của bạn trước khi tải nó vào R (hoặc sử dụng gsub trong R). Ví dụ bạn muốn tìm kiếm và thay thế tất cả các trường hợp của O-umlaut trong Öl-Teppich. Others đã thành công với điều này (tôi cũng vậy), nhưng nếu bạn có hàng ngàn tệp văn bản riêng lẻ, điều này rõ ràng là không tốt.

Đối với một giải pháp R, tôi thấy rằng việc sử dụng VectorSource thay vì DirSource dường như giải quyết vấn đề:

# 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 

Nhưng điều này có vẻ như một chút của một sự trùng hợp may mắn. Phải có một cách trực tiếp hơn về nó. Hãy cho chúng tôi biết những gì phù hợp với bạn!

+1

Cảm ơn bạn đã trả lời của bạn Ben! Vì một lý do nào đó, cùng một dòng mã không thành công cho tôi bây giờ. Tôi không biết nếu đây là một sự trùng hợp may mắn khác :) Tôi đã không thay đổi bất cứ điều gì, chỉ cần chạy lại nó và lần này nó hoạt động mà không có bất kỳ trục trặc. – maiaini

+0

Rất vui khi biết bạn đã hoạt động! – Ben

1

Nếu không sao để bỏ qua các đầu vào không hợp lệ, bạn có thể sử dụng xử lý lỗi của R. ví dụ:

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); 
    # } 
    }) 

Có một ví dụ thêm ở đây: http://gastonsanchez.wordpress.com/2012/05/29/catching-errors-when-using-tolower/

19

Đây là từ faq tm:

nó sẽ thay thế byte không mui trần trong yourCorpus với chuỗi thấy mã hex của họ .

Tôi hy vọng điều này sẽ giúp ích cho tôi.

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

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

1

Sử dụng các bước sau:

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

Tôi vừa đụng chạm tới vấn đề này. Tình cờ bạn đang sử dụng một máy chạy OSX?Tôi và dường như đã bắt nguồn từ vấn đề định nghĩa của bộ ký tự mà R được biên dịch chống lại trên hệ điều hành này (xem https://stat.ethz.ch/pipermail/r-sig-mac/2012-July/009374.html)

Những gì tôi đã nhìn thấy là sử dụng giải pháp từ FAQ

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

đã đem lại cho tôi cảnh báo này:

Warning message: 
it is not known that wchar_t is Unicode on this platform 

này tôi bắt nguồn từ các enc2utf8 chức năng. Tin xấu là rằng đây là một vấn đề với hệ điều hành cơ bản của tôi và không R.

Vì vậy, đây là những gì tôi đã làm như một công trình xung quanh:

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

lực lượng này iconv sử dụng bảng mã utf8 trên macintosh và hoạt động tốt mà không cần biên dịch lại.

1

Các câu hỏi thường gặp chính thức có vẻ là không làm việc trong hoàn cảnh của tôi:

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

Cuối cùng tôi đã làm cho nó bằng cách sử dụng cho & Encoding chức năng:

for (i in 1:length(dataSet)) 
{ 
    Encoding(corpus[[i]])="UTF-8" 
} 
corpus <- tm_map(dataSet, tolower) 
4

Tôi đã được chạy trên Mac và sự thất vọng của tôi, tôi đã phải xác định hồ sơ xấu (vì đây là những mẩu tin) để giải quyết. Kể từ lần sau, không có đảm bảo nào về hồ sơ giống nhau, tôi đã sử dụng chức năng sau đây

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

như đã đề xuất ở trên.

Nó hoạt động như một nét duyên dáng

39

Không có câu trả lời nào ở trên phù hợp với tôi. Cách duy nhất để giải quyết vấn đề này là xóa tất cả các ký tự không phải đồ họa (http://stat.ethz.ch/R-manual/R-patched/library/base/html/regex.html).

Mã này là

usableText=str_replace_all(tweets$text,"[^[:graph:]]", " ") 
+1

Điều này sẽ được đánh dấu là giải pháp. Nó hoạt động và nó đã được phổ biến trong nhiều năm, nhưng OP đã không dính xung quanh để đánh dấu nó là chính xác. –

0

giải pháp này đơn giản Chad đã không làm việc cho tôi. Tôi đã nhúng nó vào một hàm và nó đưa ra một lỗi về iconv cần một vector làm đầu vào. Vì vậy, tôi quyết định thực hiện chuyển đổi trước khi tạo kho văn bản.

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

Tôi nghĩ rằng đó là rõ ràng bởi bây giờ mà vấn đề là vì các biểu tượng cảm xúc mà ToLower không có khả năng hiểu

#to remove emojis 
dataSet <- iconv(dataSet, 'UTF-8', 'ASCII') 
2

Những đề nghị cựu đã không làm việc cho tôi.Tôi nghiên cứu nhiều hơn và thấy một trong đó làm việc trong những điều sau 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))