2016-09-20 6 views
1

Я пытаюсь реализовать анализ настроений twitter. Мне нужно получить все положительные твиты и отрицательные твиты и сохранить их в определенных текстовых файлах.PIG: Twitter Sentiment Analysis

sample.json

{"id": 252479809098223616, "created_at": "Wed Apr 12 08:23:20 +0000 2016", "text": "google is a good company", "user_id": 450990391}{"id": 252479809098223616, "created_at": "Wed Apr 12 08:23:20 +0000 2016", "text": "facebook is a bad company","user_id": 450990391} 

dictionary.text, имеющий все положительные и negetive список блокируемых слов

weaksubj 1 bad  adj  n negative 
strongsubj 1 good adj  n positive 

Pig Сценарий: -

tweets = load 'new.json' using JsonLoader('id:chararray,text:chararray,user_id:chararray,created_at:chararray'); 

dictionary = load 'dictionary.text' AS (type:chararray,length:chararray,word:chararray,pos:chararray,stemmed:chararray,polarity:chararray); 

words = foreach tweets generate FLATTEN(TOKENIZE(text)) AS word,id,text,user_id,created_at; 

sentiment = join words by word left outer, dictionary by word; 

senti2 = foreach sentiment generate words::id as id,words::created_at as created_at,words::text as text,words::user_id as user_id,dictionary::polarity as polarity; 

res = FILTER senti2 BY polarity MATCHES '.*possitive.*'; 

описывает Рез: -

res: {id: chararray,created_at: chararray,text: chararray,user_id: chararray,polarity: chararray} 

Но когда я свалку Реза я не вижу выход, но он выполняет отлично без каких-либо ошибок.

Какая ошибка, которую я здесь делаю.

Пожалуйста, предложите мне.

Mohan.V

ответ

0

Я вижу 2 ошибки здесь

  • 1: Строка 2 - Когда вы DUMP словаря, вы увидите все записи в колонке 1 с остальными столбцами показывают пустыми.

Решение: Укажите соответствующий разделитель, используя PigStorage();

dictionary = load 'dictionary.text' AS  (type:chararray,length:chararray,word:chararray,pos:chararray,stemmed:chararray,polarity:chararray); 

DUMP dictionary; 
(weaksubj 1 bad  adj  n negative,,,,,) 
(strongsubj 1 good adj  n positive,,,,,) 

Вторая ошибка: строка 6: Исправьте орфографию позитив! использовать что-то вроде

res = FILTER senti2 BY UPPER(polarity) MATCHES '.*POSITIVE.*'; 
+0

Спасибо за ваш ответ @Sandesh. – Bunny

+0

Я пробовал, что вы предложили. Но все же, его успех работает, но нет выхода. – Bunny

+0

Я редактировал файл словаря, удаляя пробелы. – Bunny

0

Я вижу орфографическую ошибку:

res = FILTER senti2 BY polarity MATCHES '.*possitive.*'; 

Разве это не '.*positive.*'?

0

В соответствии с моими рекомендациями вы должны использовать пользовательские UDF для решения вашей проблемы. Теперь вы можете использовать слон-птица-свиньи-4.1.jar, json-simple-1.1.1.jar. Также, если вы хотели посмотреть пример, вы можете использовать эти Sentiment Analysis Tutorial. Если вы хотите кода, то вы можете передать их коду и форматировать код в соответствии с обучающим и моим кодом,

REGISTER ‘/usr/local/elephant-bird-hadoop-compat-4.1.jar'; 
REGISTER '/ usr/local /elephant-bird-pig-4.1.jar'; 
REGISTER '/ usr/local /json-simple-1.1.1.jar’; 
load_tweets = LOAD '/user/new.json' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') AS myMap; 
extract_details = FOREACH load_tweets GENERATE myMap#'id' as id,myMap#'text' as text; 
tokens = foreach extract_details generate id,text, FLATTEN(TOKENIZE(text)) As word; 
dictionary = load '/user/dictionary.text' AS (type:chararray,length:chararray,word:chararray,pos:chararray,stemmed:chararray,polarity:chararray); 
word_rating = join tokens by word left outer, dictionary by word using 'replicated’; describe word_rating; 
rating = foreach word_rating generate tokens::id as id,tokens::text as text, dictionary::rating as rate; 
word_group = group rating by (id,text); 
avg_rate = foreach word_group generate group, AVG(rating.rate) as tweet_rating; 
positive_tweets = filter avg_rate by tweet_rating>=0;