テキストのポジネガ判定2 - 辞書の極性値を標準化 Judge Positive vs Negative of a Text - Normalization of Positive vs Negative Points -

テキストのポジネガ判定2 - 辞書の極性値を標準化 Judge Positive vs Negative of a Text - Normalization of Positive vs Negative Points - 

前回記事の反省を踏まえて、今回は辞書の極性値を標準化したもので計算した。

標準化とは、
正規分布に従うデータ$x$が平均値$\mu$、標準偏差$\sigma$のとき、$x$に

$\frac{x-\mu}{\sigma}$

という変換を施すことである。データが正規分布に従わないとき、標準化後のデータの平均、標準偏差は0, 1だが、正規分布はしない。




単語極性判定辞書のデータは

最大値 1
最小値 -1
平均値 -0.31976352681849074
標準偏差 0.38273457653492121
中央値 -0.33996399999999999

標準化した後は、

最大値  3.4482474480537917
最小値 -1.7773060363137678
平均値 6.5995080400756696e-17
標準偏差 0.99999999999999989
中央値 0.99999999999999989

SOURCE CODE


import MeCab
import pandas as pd
import numpy as np

class Text_pn():
    def __init__(self):
        self.m = MeCab.Tagger()
    # set pn dictionary
        self.pndic = {}
        
    def set_pndic(self):
        pnlist = []
        with open('pn_ja.dic','r') as f:
            parts = [line.split(':')[2] for line in f]
            parts = set(parts) # 名詞、動詞、形容詞、副詞、助動詞
            for part in parts:
                self.pndic[part]=[]
        with open('pn_ja.dic', 'r') as f:
            # make pnlist from pn_ja.dic
            for line in f:
                line = line.strip('\n')
                line = line.split(':')
                line[3] = float(line[3])
                pnlist.append(line)
        # normalize points = (points - mu)/sigma
        points = [line[3] for line in pnlist]
        points = np.array(points)
        mean = np.mean(points)
        std = np.std(points)
        for line in pnlist:
            line[3] = (line[3]-mean)/std
        # make pndic
        for line in pnlist:
            self.pndic[line[2]].append({'kanji':line[0],'yomi':line[1],'point':line[3]})       
                
    def mecab_list(self, s):
        s = self.m.parse(s)
        return [word.split(',') for word in s.replace('\t', ',').split('\n')[:-2]]
    
    def pn(self, s):
        '''return average positive vs negative points of text'''
        points_of_s = []
        for line in self.mecab_list(s):
            try:
                word = line[11]
                word_part = line[1]
            except IndexError as e:
                #skip symbols like (, ), $, %, 
                continue
            if word_part in self.pndic.keys():
                '''if word part is noun, verb, adjective and auxiliary.'''
                for i in self.pndic[word_part]: # for each word i = dict in pndict=list
                    if word == i['kanji'] or word == i['yomi']:
                        points_of_s.append(i['point'])
                        print(word, i['point'])
                        break
                else:
                    print('{0} is not in the pn-dictionary.'.format(word))
            else:
                continue
        points_of_s = np.array(points_of_s)
        avg_point = np.mean(points_of_s)
        avg_point = round(avg_point, 2)
        print('{0}\npoint = {1}'.format(s, avg_point))
        return avg_point
    
if __name__=='__main__':
    s = u'トンネルを抜けると雪国であった。夜の底が白くなった。'
#    s = u'道がつづら折りになって、いよいよ天城峠に近づいたと思うころ、雨足が杉の密林を白く染めながら、すさまじい早さで麓から私を追って来た。'
#    s = u'''
#( ´-`).。oO(きょうはバレンタインだし、ふんどしの日だし、煮干しの日だし、ハピバツイートも忙しい)
#'''
    text_pn = Text_pn()
    text_pn.set_pndic()
    text_pn.pn(s)

RESULTS 結果

SHARPのtwitter公式アカウントから


( ´-`).。oO(きょうはバレンタインだし、ふんどしの日だし、煮干しの日だし、ハピバツイートも忙しい)
point = -0.34 (前回-0.45)

小説「雪国」から



トンネルを抜けると雪国であった。夜の底が白くなった。
point = -0.85 (前回-0.64)

小説「伊豆の踊子」から

道がつづら折りになって、いよいよ天城峠に近づいたと思うころ、雨足が杉の密林を白く染めながら、すさまじい早さで麓から私を追って来た。
point = -0.4 (前回-0.47)

美輪明宏の名言から

野に咲く花にも役目があります。

この世に必要でない人はいません。

それに気付くかどうか。

それが大事なのです

point = -0.94 (前回-0.68)


松岡修造の名言から1

本気になれば自分が変わる! 
本気になれば全てが変わる!!

point = -0.12 (前回-0.36)

松岡修造の名言から2

一番になるっていったよな?
日本一なるっつったよな!

ぬるま湯なんか
つかってんじゃねぇよお前!!

point = -0.59 (前回-0.54)

松岡修造の名言から3

もっと熱くなれよ…!!
熱い血燃やしてけよ…!!

人間熱くなったときが
ホントの自分に出会えるんだ!

point = -0.27 (前回-0.42)

松岡修造の名言から4

言い訳してるんじゃないですか? 
できないこと、無理だって、
諦めてるんじゃないですか?

駄目だ駄目だ!
あきらめちゃだめだ!

できる!できる!
絶対にできるんだから!
point = -0.88 (前回-0.66)

DISCUSSION 考察

標準偏差が大きくなった分、単語の極性は平均値より大きければより大きく、平均値より低ければより低くなった。それはテキストの極性の値にも影響している。テキストの極性値は、標準化後は実験前は、半分がポジティブ、半分がネガティブになるかと思ったが、結果は前回に全体で比べてて少し上がるのみで、ポジティブになったものはなかった。
標準化後、極性辞書55125語中、ポジティブワードは26079 (47%)、ネガティブワードは29046 (53%)であった。ネガティブワードよりポジティブワードの方が少ないが、それぞれの極性値は大きいということになる。

BIBLIOGRAPHY 参考文献

コメント

人気の投稿