chinda_fall_desu’s diary

竹内豊の日記

ヒューマンコンピューターインターフェースをもっと知りたいなー

pythonと辞書で文章を分類する

まずは既存の辞書を使って、文章の分類を行い、その後自前の辞書を使って分類を行う。
辞書を使う前に文章を単語ごとに分割する必要がある。そのやり方は以下の記事にまとめた。


①極性判定を行う
Open Resources/Japanese Sentiment Polarity Dictionary - 東北大学 乾・鈴木研究室 / Communication Science Lab, Tohoku University
日本語評価極性辞書を用いて、極性判定を行う。
ソースコード

import MeCab
import pickle
import pandas

file=open("title.pickle", "rb")
sentences=pickle.load(file)
file.close()

t=MeCab.Tagger('-Ochasen')
words_list=[]

for sentence in sentences:
    words=[]
    parsed=t.parse(sentence)
    for line in parsed.splitlines()[:-1]:
        words.append(line.split('\t')[2])
    # print(words)
    words_list.append(words)
# print(words_list)

wago=pandas.read_csv('wago.121808.pn', header=None, sep='\t')
word2score={}
values={'ポジ(経験)':1,'ポジ(評価)':1, 'ネガ(経験)':-1, 'ネガ(評価)':-1}

for word, label in zip(wago.loc[:, 1], wago.loc[:, 0]):
    word2score[word]=values[label]

scores=[]
for words in words_list:
    score=0
    for word in words:
        if word in word2score:
            score+=word2score[word]
    scores.append(score)

scores_df=pandas.DataFrame({'sentence': sentences, 'score': scores}, columns=['sentence', 'score'])

scores_df_sorted=scores_df.sort_values('score', ascending=False)
print(scores_df_sorted.head(5))

scores_df_sorted=scores_df.sort_values('score', ascending=True)
print(scores_df_sorted.head(5))

(実行結果)

> python .\words4.py
                                  sentence  score
36   【1位は商品化】売れなくてもいい…!珍しい東海オンエアグッズプレゼン大会!      2
188                  【衝撃】現実に存在する信じられない超人5選      1
164           ◯◯屋さんで◯◯せずにどれだけ楽しむことができるのか!?      1
214          【超楽しい】お安く済ませて!チーム対抗揃えてAtoZ!!!      1
72    【事件発生】「なんで落ちてるの?」っていう珍しいものを拾ってこい選手権!      1
                           sentence  score
218    【りうょり】逆にむずい!高級食材を全力で不味くせよ!!!     -1
85   【10月】海!BBQ!キャンプ!時間内に失った夏を取り戻せ!     -1
205     材料そろえたのに何作るか忘れちゃった!代わりに作って!     -1
45      【検証】一週間ガチで呪い続けたらメンバーは死ぬのか?     -1
141     【泥棒】しばゆーがすぐ物を盗むので現行犯で逮捕します。     -1


②自前の辞書を使って分類
お酒に関する動画を見つけるために下記のリストを作り、分類を行う。

word2score={'酒':1,'飲':1,'酔':1,'飲む':1,'酔う':1, '酔い':1, '泥酔':1 }

ソースコード

import MeCab
import pickle
import pandas

file=open("title.pickle", "rb")
sentences=pickle.load(file)
file.close()

t=MeCab.Tagger('-Ochasen')
words_list=[]

for sentence in sentences:
    words=[]
    parsed=t.parse(sentence)
    for line in parsed.splitlines()[:-1]:
        words.append(line.split('\t')[2])
    words_list.append(words)

wago=pandas.read_csv('wago.121808.pn', header=None, sep='\t')

word2score={'酒':1,'飲':1,'酔':1,'飲む':1,'酔う':1, '酔い':1, '泥酔':1 }

scores=[]
for words in words_list:
    score=0
    for word in words:
        if word in word2score:
            score+=word2score[word]
    scores.append(score)

scores_df=pandas.DataFrame({'sentence': sentences, 'score': scores}, columns=['sentence', 'score'])

scores_df_sorted=scores_df.sort_values('score', ascending=False)
print(scores_df_sorted.head(5))

(実行結果)

> python .\words5.py
                                      sentence  score
93                        【酔酔酔】当てるまで終われない利き日本酒      4
246  【ゆる動画】たまには6人でお酒でも飲んで話そうよ!でも平均台から落ちたら負け!!!      2
68        ドラマ撮影中、ワンカット毎にお酒一杯飲んだらどうなっちゃうの!?【後編】      2
69        ドラマ撮影中、ワンカット毎にお酒一杯飲んだらどうなっちゃうの!?【前編】      2
114                    【半分飲み会】大人が全力でおねしょに挑戦します      1

参考
寺田学 『Pythonによるあたらしいデータ分析の教科書 (AI&TECHNOLOGY)』 翔泳社 (2018/9/19)


(間違い等あればコメントよろしくお願いいたします。)