前提・実現したいこと
MeCabでテキストと日付のみに編集したツイッターのテキストファイルをPNTableという感情極性辞書と照らし合わせPN値という感情の数値を出して、ツイートごとの感情分析をしようとしています。
用意しているツイートファイルの種類が違うだけで基本的にはこのサイトと同じことをしようとしています。
https://blog.statsbeginner.net/entry/2017/05/07/091435
発生している問題・エラーメッセージ
PN値のリストを作成する際にtyperrorが出てしまいます。
エラーを見る限りMeCabで形態素解析する場面で何らかのミスをしている気がしますがわかりません。
TypeError Traceback (most recent call last)
<ipython-input-7-d707ddf30431> in <module>
1 means_list = []
2 for tweet in df_tweets['text']:
----> 3 dl_old = get_diclist(tweet)
4 dl_new = add_pnvalue(dl_old)
5 pnmean = get_mean(dl_new)
<ipython-input-4-e0f77d9caa8f> in get_diclist(text)
6 def get_diclist(text):
7
----> 8 parsed = m.parse(text)
9 lines = parsed.split('\n') # 解析結果を1行(1語)ごとに分けてリストにする
10 lines = lines[0:-2] # 後ろ2行は不要なので削除
TypeError: in method 'Tagger_parse', argument 2 of type 'char const *'
該当のソースコード
モジュールのインポート
import re
import csv
import time
import pandas as pd
import matplotlib.pyplot as plt
import MeCab
import random
#tweets.csvの読み込み
df_tweets = pd.read_table('mytweet.txt',
sep=':',
encoding = 'utf-8',
names=('time','text'),
)
print(df_tweets)
#PN Tableを読み込み
pn_df = pd.read_table('pn_ja.dic.txt',
sep=':',
encoding='utf-8',
names=('Word','Reading','POS', 'PN')
)
word_list = list(pn_df['Word'])
pn_list = list(pn_df['PN'])
pn_dict = dict(zip(word_list,pn_list))
pn_df
MeCabインスタンス作成
m = MeCab.Tagger('') # 指定しなければIPA辞書
-----テキストを形態素解析して辞書のリストを返す関数-----
def get_diclist(text):
parsed = m.parse(text) ←ここが原因なのでしょうか? lines = parsed.split('\n') # 解析結果を1行(1語)ごとに分けてリストにする lines = lines[0:-2] # 後ろ2行は不要なので削除 diclist = [] for word in lines: l = re.split('\t|,',word) # 各行はタブとカンマで区切られてるので d = {'Surface':l[0], 'POS1':l[1], 'POS2':l[2], 'BaseForm':l[7]} diclist.append(d) return(diclist)
形態素解析結果の単語ごとdictデータにPN値を追加する関数
def add_pnvalue(diclist_old):
diclist_new = []
for word in diclist_old:
base = word['BaseForm'] # 個々の辞書から基本形を取得
if base in pn_dict:
pn = float(pn_dict[base]) # 中身の型があれなので
else:
pn = 'notfound' # その語がPN Tableになかった場合
word['PN'] = pn
diclist_new.append(word)
return(diclist_new)
#各ツイートのPN平均値を求める
def get_mean(dictlist):
pn_list = []
for word in dictlist:
pn = word['PN']
if pn!='notfound':
pn_list.append(pn)
if len(pn_list)>0:
pnmean = np.mean(pn_list)
else:
pnmean = 0
return pnmean
means_list = []
for tweet in df_tweets['text']:
dl_old = get_diclist(tweet)
dl_new = add_pnvalue(dl_old)
pnmean = get_mean(dl_new)
means_list.append(pnmean)
この部分を実行すると先ほどのエラーが出ます
TypeError Traceback (most recent call last)
<ipython-input-7-d707ddf30431> in <module>
1 means_list = []
2 for tweet in df_tweets['text']:
----> 3 dl_old = get_diclist(tweet)
4 dl_new = add_pnvalue(dl_old)
5 pnmean = get_mean(dl_new)
<ipython-input-4-e0f77d9caa8f> in get_diclist(text)
6 def get_diclist(text):
7
----> 8 parsed = m.parse(text)
9 lines = parsed.split('\n') # 解析結果を1行(1語)ごとに分けてリストにする
10 lines = lines[0:-2] # 後ろ2行は不要なので削除
TypeError: in method 'Tagger_parse', argument 2 of type 'char const *'
試したこと
文字コードのエラーかなと思い、エンコードを書き換えたり、しましたが解決できませんでした。
補足情報(FW/ツールのバージョンなど)
python3 mecab
あなたの回答
tips
プレビュー