web-dev-qa-db-ja.com

python)を使用したセンチワードネットスコアリング

私はTwitterの感情分析に関連する研究に取り組んでいます。 Pythonでコーディングする方法について少し知識があります。私の研究はコーディングに関連しているので、Pythonを使用して感情を分析する方法についていくつかの研究を行いました。以下は、私がどこまで到達したかです。1。ツイートのトークン化2.トークンのPOSタグ付けと残りはPositiveと私が今直面している問題であり、あなたの助けを必要としている感情の否定。

以下は私のコード例です:

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

したがって、pythonを使用してsentiwordnetについてコーディングし、すでにPOSタグが付けられているツイートの正と負のスコアを計算する例を示したりガイドしたりできる人がいるかどうかを尋ねたいと思います。少し早いですがお礼を

4
pechdara

あなたの質問が正確に何であるかについては少し不明確です。 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を使用 上記の表記)

そうは言っても、Twitterの感情分析にSentiwordnetを使用することは一般的には良い考えではありません。その理由は、

ツイートは、Sentiwordnetがしばしば認識しないタイプミスや辞書にない単語でいっぱいです。この問題に対処するには、ツイートにタグを付ける前にツイートをレンマ化/ステム化するか、NLTKに関数が組み込まれているNaiveBayesなどの機械学習分類器を使用します。分類器のトレーニングデータセットについては、データセットに手動で注釈を付けるか、Sentiment140コーパスなどの事前にラベル付けされたセットを使用します。

感情分析を実際に実行することに興味がなくても、特定のツイートに感情タグが必要な場合は、いつでもこの目的でSentiment140APIを使用できます。

16
Saravana Kumar

@SaravanaKumarには素晴らしい答えがあります。

詳細なコードを追加するために、私はこれを書いています。リンクを参照しました 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] # if you want to further stem the Word

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

print(f"pos_val is {pos_val}")
print(f"senti_val is {senti_val}")

出力

pos_val is [('this', 'DT'), ('movie', 'NN'), ('is', 'VBZ'), ('wonderful', 'JJ')]
senti_val is [[], [0.0, 0.0, 1.0], [], [0.75, 0.0, 0.25]]
4
shantanu pathak