リハビリ 人工知能 理学療法 Deep learning Deep Neural Network ディープラーニング AI 鍼灸

人工知能・リハビリ・日記・理学療法

タイトルはAIですが、個人的な日記なので、あまり気になさらないように。

Twitterのテキストデータを感情分析:感情スコアを出す。

どうも、解析中に時間が出来ましたので今回も雑な記事を書きます。

いきなりのカミングアウトすみません。今回はツイッターです!

 

Twitterのテキストデータを感情分析

Tweetの自動収集は前回の記事で書きましたので参考にして下さい。

takuma-ai.hatenablog.com

 

今回も、インポートからです。

import csv
import MeCab
import re
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.feature_extraction.text import CountVectorizer
%matplotlib inline 

 

次は、必要のない文字を消したいと思います。

# 前処理 タブで揃えて下さいね。

def format_text(text):
'''
MeCabに入れる前のツイートの整形
'''

text=re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-…]+', "", text)
text=re.sub('RT', "", text)
text=re.sub('お気に入り', "", text)
text=re.sub('まとめ', "", text)
# 半角記号,数字,英字
text=re.sub(r'[!-~]', "", text)
# 全角記号
text=re.sub(r'[︰-@]', "", text)
# 改行文字
text=re.sub('\n', " ", text)
# 他
text=re.sub(r'○|●|◆|◇|■|□|★|☆|◎|▲|△|▼|▽|▶|▷|◀|◁|〇', "", text)

return text


# 分かち書き
def split_to_words(sentence):
mecab = MeCab.Tagger('-Owakati')
words = mecab.parse(sentence).split()
words = ",".join(words)

return words

 

 

読み込み

tweet_list = []

# csvファイルの読み込み
with open('任意.csv', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
if row[0] == "ツイート内容":
continue
ft = format_text(row[0])
tweet_list.append([ft, split_to_words(ft)])


df_tweet = pd.DataFrame(tweet_list, columns=['text_前処理後', 'text_形態素解析後'])

 

形態解析

def Vectorization_BOW(df):
vectorizer = CountVectorizer(max_features=100000)
vecs = vectorizer.fit_transform(df)
header = vectorizer.get_feature_names()

return vecs, header

vecs, header = Vectorization_BOW(df_tweet["text_形態素解析後"])

 

 

感情辞書

df_pn = pd.read_csv('pn_ja.dic',
delimiter=":", encoding='cp932',
names=["単語","読み","品詞","感情値"])
df_pn = df_pn.groupby(["単語","読み","品詞"],as_index=False).first().reset_index(drop=True)
df_pn = df_pn.groupby(["単語"],as_index=False).first().reset_index(drop=True)
print(len(df_pn))

感情辞書は予めダウンロードしておいて下さい。

 

単語ベクトルに辞書のスコアを結合していく。辞書が突合しなかった単語は落とす。

%%time
features = np.arange(len(df_tweet))

df_tmp = pd.merge(pd.DataFrame(vecs.toarray(), columns=header).T.reset_index(),df_pn"単語","感情値", left_on="index", right_on="単語", how="left").dropna()
print(df_tmp.shape)

## テキスト毎にスコアがふれた単語数とスコアの合計値を算出し、平均を算出
df_word_count = df_tmp[features].sum()
df_tmp[features] = df_tmp[features].apply(lambda x: x*df_tmp["感情値"])
df_word_score = df_tmp[features].sum()
df_score = pd.DataFrame(zip(df_word_score,df_word_count),columns=["感情スコア_合計値","感情スコア_対象単語数"])
df_score = pd.concat([df_tweet, df_score],axis=1)
df_score["感情スコア_平均値"] = df_score["感情スコア_合計値"]/df_score["感情スコア_対象単語数"]

 

プロット

sns.set()
sns.distplot(df_score["感情スコア_平均値"].fillna(-2), kde=False)

 

f:id:Takuma_AI:20200908161743p:plain

感情スコア(一部抜粋)

 

ネガティヴー!!!