Проблемы с неанглийскими буквами при использовании wordcloud по тексту, добытому в твиттере

Я новичок в Stackoverflow и стараюсь следовать рекомендациям. Однако, если есть что-то, что я пропустил, пожалуйста, дайте мне знать.

В последнее время я играю с анализом текста в R; что-то я новичок в этом. Для этого я использовал пакеты, которые вы можете найти в приведенном ниже коде. Однако проблема возникает, когда облако слов отображает шведские буквы å, ä и ö. Как вы можете видеть на прикрепленном изображении, точки расположены немного странно.

Изображение Wordcloud

Я изо всех сил пытался решить эту проблему самостоятельно, но что бы я ни пытался, я не могу заставить это работать.

Что я пытался сделать:

  1. Используйте Encoding(tweets) <- "UTF-8" в попытке установить tweets в UTF-8
  2. Используйте iconv(tweets, from = "UTF-8", to = "UTF-8", sub = "")

Кроме того, последняя часть кода после определения corpus vecotr была скопирована у автора tm-пакета. Он указал это как решение после того, как другие люди упомянули проблемы с функцией wordcloud с вектором корпуса в качестве входных данных. Без него я получаю сообщение об ошибке при попытке создать облако слов.

    #Get and load necessary packages:
    install.packages("twitteR")
    install.packages("ROAuth")
    install.packages("wordcloud")
    install.packages("tm")
    library("tm")
    library("wordcloud")
    library("twitteR")
    library("ROAuth") 

    #Authentication:
    api_key <- "XXX"
    api_secret <- "XXX"
    access_token <- "XXX"
    access_token_secret <- "XXX"
    cred <- setup_twitter_oauth(api_key,api_secret,access_token,
                access_token_secret)

    #Extract tweets:
    search.string <- "#svpol"
    no.of.tweets <- 3200
    tweets <- searchTwitter(search.string, n=no.of.tweets, since = "2017-01-01")
    tweets.text <- sapply(tweets, function(x){x$getText()})

    #Remove tweets that starts with "RT" (retweets):
    tweets.text <- gsub("^\bRT", "", tweets.text)
    #Remove tabs:
    tweets.text <- gsub("[ |\t]{2,}", "", tweets.text)
    #Remove usernames:
    tweets.text <- gsub("@\\w+", "", tweets.text)
    tweets.text <- (tweets.text[!is.na(tweets.text)])
    tweets.text <- gsub("\n", " ", tweets.text)
    #Remove links:
    tweets.text <- gsub("http[^[:space:]]*", "", tweets.text)
    #Remove stopwords:
    stopwords_swe <- c("är", "från", "än")
    #Just a short example above, the real one is very large
    tweets.text <- removeWords(tweets.text,stopwords_swe)

    #Create corpus:
    tweets.text.corpus <- Corpus(VectorSource(tweets.text))
    #See notes in the longer text about the corpus vector
    tweets.text.corpus <- tm_map(tweets.text.corpus,
                          content_transformer(function(x) iconv(x, to='UTF-8-MAC', sub='byte')), mc.cores=1)
    tweets.text.corpus <- tm_map(tweets.text.corpus, content_transformer(tolower), mc.cores=1)
    tweets.text.corpus <- tm_map(tweets.text.corpus, removePunctuation, mc.cores=1)
    tweets.text.corpus <- tm_map(tweets.text.corpus, function(x)removeWords(x,stopwords(kind = "en")), mc.cores=1)

    wordcloud <- wordcloud(tweets.text.corpus, min.freq = 10,
                   max.words=300, random.order=FALSE, rot.per=0.35, 
                   colors=brewer.pal(8, "Set2"))
    wordcloud

Был бы очень рад получить помощь в этом!


person charlesos    schedule 25.01.2017    source источник
comment
Возможно, эта статья поможет.   -  person Paulo MiraMor    schedule 26.01.2017
comment
Моя проблема не в языке самой консоли R, а в символах на выходе. Насколько я понимаю, Sys.setlocale() касается только изменения языка консоли, и я не понимаю, почему это решит проблему...? (Это уже на английском языке, если это как-то имеет значение). Все равно спасибо.   -  person charlesos    schedule 26.01.2017


Ответы (1)


Удалось решить эту проблему, сначала закодировав вектор в UTF-8-MAC (так как я на OSX), затем используя функцию gsub(), чтобы вручную изменить шестнадцатеричные коды для å, ä, ö (буквы, с которыми у меня были проблемы) на фактические письма. Например, gsub("0xc3 0x85", "å", x), gsub("0xc3 0xa5", "å", x) (с учетом регистра).

Наконец, меняем аргумент функции tm_map() с UTF-8-MAC на latin1. Это помогло мне, надеюсь, кто-то еще найдет это полезным в будущем.

person charlesos    schedule 30.01.2017