2015-09-04 1 views
1

Я занимаюсь анализом настроений по набору твитов, которые у меня есть, и теперь я хочу знать, как добавлять фразы в словари с положительным и отрицательным значением.Анализ настроений с фразами в словарях

Я читал в файлах фраз, которые хочу проверить, но при запуске анализа настроений это не дает мне результата.

Когда вы читаете алгоритм настроения, я вижу, что он соответствует словам словарям, но есть ли способ сканирования слов и фраз?

Вот код:

score.sentiment = function(sentences, pos.words, neg.words, .progress='none') 
{ 
    require(plyr) 
    require(stringr) 
    # we got a vector of sentences. plyr will handle a list 
    # or a vector as an "l" for us 
    # we want a simple array ("a") of scores back, so we use 
    # "l" + "a" + "ply" = "laply": 
    scores = laply(sentences, function(sentence, pos.words, neg.words) { 
    # clean up sentences with R's regex-driven global substitute, gsub(): 
    sentence = gsub('[[:punct:]]', '', sentence) 
    sentence = gsub('[[:cntrl:]]', '', sentence) 
    sentence = gsub('\\d+', '', sentence)  
    # and convert to lower case:  
    sentence = tolower(sentence)  
    # split into words. str_split is in the stringr package  
    word.list = str_split(sentence, '\\s+')  
    # sometimes a list() is one level of hierarchy too much  
    words = unlist(word.list)  
    # compare our words to the dictionaries of positive & negative terms 
    pos.matches = match(words, pos) 
    neg.matches = match(words, neg) 
    # match() returns the position of the matched term or NA  
    # we just want a TRUE/FALSE:  
    pos.matches = !is.na(pos.matches) 
    neg.matches = !is.na(neg.matches) 
    # and conveniently enough, TRUE/FALSE will be treated as 1/0 by sum(): 
    score = sum(pos.matches) - sum(neg.matches)  
    return(score)  
    }, pos.words, neg.words, .progress=.progress) 
    scores.df = data.frame(score=scores, text=sentences) 
    return(scores.df) 
} 
analysis=score.sentiment(Tweets, pos, neg) 
table(analysis$score) 

Это результат я получаю:

0 
20 

тогда я после стандартной таблицы, что эта функция обеспечивает например

-2 -1 0 1 2 
1 2 3 4 5 

например.

Есть ли у кого-нибудь идеи о том, как запустить это на фразах? Примечание. Файл TWEETS является файлом предложений.

+0

Не знаю, но я думаю, что вы, возможно, имели в виду лаппи вместо лапши? – dd3

+1

@ dd3 Это laply из пакета plyr, а не из-под основания. – WhiteViking

+0

Я новичок в R здесь. что ваш «.progress» делает здесь? похоже, что вы не использовали его в своей функции? – alwaysaskingquestions

ответ

1

Функция score.sentiment, похоже, сработала. Если я пытаюсь очень простую установку,

Tweets = c("this is good", "how bad it is") 
neg = c("bad") 
pos = c("good") 
analysis=score.sentiment(Tweets, pos, neg) 
table(analysis$score) 

Я получаю ожидаемый результат,

> table(analysis$score) 

-1 1 
1 1 

Как вы кормил 20 твитов методу? Из результатов, которые вы публикуете, это 0 20, я бы сказал, что ваша проблема в том, что ваши 20 твитов не имеют никакого положительного или отрицательного слова, хотя, конечно, это было так, как вы бы это заметили. Возможно, если вы разместите более подробную информацию о своем списке твитов, ваших положительных и отрицательных словах, вам будет легче помочь вам.

Во всяком случае, ваша функция работает нормально.

Надеюсь, это поможет.

EDIT после уточнений через комментарии:

На самом деле, чтобы решить вашу проблему вам нужно разметить ваши предложения в n-grams, где n будет соответствовать максимальному количеству слов, которые вы используете для вашего списка положительных и отрицательный n-grams. Вы можете увидеть, как это сделать, например. в this SO question. Для полноты, и поскольку я сам ее протестировал, вот пример того, что вы могли бы сделать.Я упростить ее bigrams (п = 2) и использовать следующие входы:

Tweets = c("rewarding hard work with raising taxes and VAT. #LabourManifesto", 
       "Ed Miliband is offering 'wrong choice' of 'more cuts' in #LabourManifesto") 
pos = c("rewarding hard work") 
neg = c("wrong choice") 

Вы можете создать Биграммные Tokenizer, как это,

library(tm) 
library(RWeka) 
BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min=2,max=2)) 

и проверить его,

> BigramTokenizer("rewarding hard work with raising taxes and VAT. #LabourManifesto") 
[1] "rewarding hard"  "hard work"   "work with"   
[4] "with raising"   "raising taxes"  "taxes and"   
[7] "and VAT"    "VAT #LabourManifesto" 

Затем в вашем методе вы просто замените эту строку,

word.list = str_split(sentence, '\\s+') 

этим

word.list = BigramTokenizer(sentence) 

Хотя, конечно, было бы лучше, если бы вы изменили word.list к ngram.list или что-то в этом роде.

В результате, как и ожидалось,

> table(analysis$score) 

-1 0 
1 1 

Просто решить вашу n-gram размер и добавить его в Weka_control и вы должны быть хорошо.

Надеюсь, это поможет.

+0

@Irnczig. Мне удается получить score.sentiment для работы с моими положительными и отрицательными словарями, но если я хочу добавить к вашему примеру «хорошо» и «как плохо» для словарей, а не просто «плохо» и «хорошо», «Вы знаете, как это работает? –

+0

Например, с помощью следующих твитов: [[[«вознаграждение тяжелой работы с повышением налогов и НДС. #LabourManifesto», «Эд Милибэнд предлагает« неправильный выбор »« большего количества сокращений »в #LabourManifesto».]]]. словари, я бы хотел «вознаградить тяжелую работу» за позитив, и «повышение налогов», «больше сокращений» за негатив. Я управляю настроением, и он разделяет эти фразы. –

+0

Хорошо, понял. Дай взглянуть. – lrnzcig