Оценка Sentiwordnet с помощью Python

Я работал над исследованием, связанным с анализом настроений в Твиттере. У меня есть немного знаний о том, как кодировать на Python. Поскольку мое исследование связано с кодированием, я провел некоторые исследования о том, как анализировать настроения с помощью Python, и вот как далеко я продвинулся ниже: 1.Токенизация твитов 2. POS-теги токенов, а оставшиеся вычисляют позитив и Отрицание чувств, с которыми я сталкиваюсь сейчас и нуждаюсь в вашей помощи.

Ниже мой пример кода:

import nltk
sentence = "Iphone6 camera is awesome for low light "
token = nltk.word_tokenize(sentence)
tagged = nltk.pos_tag(token)

Поэтому я хочу спросить, может ли кто-нибудь помочь мне показать / направить пример использования python для написания кода о sentiwordnet для вычисления положительного и отрицательного балла твитов, которые уже были помечены POS. заранее спасибо

4 ответа

Немного неясно, что именно ваш вопрос. Вам нужно руководство по использованию Sentiwordnet? Если это так, проверьте эту ссылку,

http://www.nltk.org/howto/sentiwordnet.html

Поскольку вы уже проставили токены и пометили слова POS, все, что вам нужно сделать сейчас, это использовать этот синтаксис,

swn.senti_synset('breakdown.n.03')

Разбивая спор,

  • 'разбивка' = слово, за которое нужно набрать очки.
  • 'n' = часть речи
  • '03' = использование (01 для наиболее распространенного использования и большее число будет означать меньшее использование)

Поэтому для каждого кортежа в вашем теговом массиве создайте строку, как указано выше, и передайте ее функции senti_synset, чтобы получить положительный, отрицательный и объективный баллы для этого слова.

Предостережение: тег POS дает вам другой тег, нежели тот, который принимает senti_synset. Используйте следующее для преобразования в нотацию synset.

n - NOUN 
v - VERB 
a - ADJECTIVE 
s - ADJECTIVE SATELLITE 
r - ADVERB 

(Кредиты на использование Sentiwordnet 3.0 для вышеуказанной записи)

При этом, как правило, не очень хорошая идея использовать Sentiwordnet для анализа настроений в Твиттере, и вот почему,

Твиты заполнены опечатками и не-словарными словами, которые Sentiwordnet часто не распознает. Чтобы противостоять этой проблеме, либо лемматизируйте / ставьте свои твиты перед тем, как ставить им теги, либо используйте классификатор машинного обучения, такой как Наивный Байес, для которого NLTK имеет встроенные функции. Что касается обучающего набора данных для классификатора, либо аннотируйте набор данных вручную, либо используйте предварительно помеченный набор, такой как, например, корпус Sentiment140.

Если вы не заинтересованы в том, чтобы фактически выполнить анализ настроений, но вам нужен тег настроения для данного твита, вы всегда можете использовать для этого API Sentiment140.

@Saravana Kumar имеет прекрасный ответ.

Чтобы добавить подробный код, я пишу это. Я сослался на ссылку https://nlpforhackers.io/sentiment-analysis-intro/

from nltk.corpus import wordnet as wn
from nltk.corpus import sentiwordnet as swn
from nltk.stem import PorterStemmer

def penn_to_wn(tag):
"""
Convert between the PennTreebank tags to simple Wordnet tags
"""
if tag.startswith('J'):
    return wn.ADJ
elif tag.startswith('N'):
    return wn.NOUN
elif tag.startswith('R'):
    return wn.ADV
elif tag.startswith('V'):
    return wn.VERB
return None

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()

def get_sentiment(word,tag):
""" returns list of pos neg and objective score. But returns empty list if not present in senti wordnet. """


wn_tag = penn_to_wn(tag)
if wn_tag not in (wn.NOUN, wn.ADJ, wn.ADV):
    return []

lemma = lemmatizer.lemmatize(word, pos=wn_tag)
if not lemma:
    return []

synsets = wn.synsets(word, pos=wn_tag)
if not synsets:
    return []

# Take the first sense, the most common
synset = synsets[0]
swn_synset = swn.senti_synset(synset.name())

return [swn_synset.pos_score(),swn_synset.neg_score(),swn_synset.obj_score()]


ps = PorterStemmer()
words_data = ['this','movie','is','wonderful']
words_data = [ps.stem(x) for x in words_data]

pos_val = nltk.pos_tag(words_data)
senti_val=[ get_sentiment(x,y) for (x,y) in pos_val]

Вот мое решение:

      from nltk.corpus import sentiwordnet as swn
from nltk.corpus import wordnet
from nltk.tag import pos_tag
from nltk.stem import WordNetLemmatizer

def get_wordnet_pos(word):
    tag = nltk.pos_tag([word])[0][1][0].upper()
    tag_dict = {"J": wordnet.ADJ,
                "N": wordnet.NOUN,
                "V": wordnet.VERB,
                "R": wordnet.ADV}
    return tag_dict.get(tag, wordnet.NOUN)

def get_sentiment_score_of_review(sentence):
    # 1. Tokenize
    tokens = nltk.word_tokenize(sentence)

    lemmatizer = WordNetLemmatizer()

    sentiment_score = 0.0
    for word in tokens:
        tag = get_wordnet_pos(word)
        item_res = lemmatizer.lemmatize(word, tag)
        if not item_res:
            continue
        
        synsets = wn.synsets(item_res, pos=tag)
        if len(synsets) == 0:
            print("Nope!", word)
            continue
        
        # Take the first, the most common
        synset = synsets[0]
        swn_synset = swn.senti_synset(synset.name())
        sentiment_score += swn_synset.pos_score() - swn_synset.neg_score()
        
    return sentiment_score

Для позитивных и негативных настроений, сначала вы должны пройти обучение и тренировать модель. для модели обучения вы можете использовать SVM, а открытую библиотеку под названием LibSVM вы можете использовать.

Другие вопросы по тегам