Twitter User 게시 시간 전환 및 감정 전환 (ML-Ask 사용)
소개
이 기사에서 하는 것은 트위터 API를 사용하여 트위터 사용자의 트윗을 얻은 트윗 데이터를 사용하여 뭔가를 할 수 없는지 가작한 것입니다.
투고 시간 천이와 감정 천이 작성 프로그램은 작성 시기가 다르기 때문에 별개라고 생각해 주면 도움이 됩니다.
ML-Ask에 대한 자세한 설명을 실시하고 있다 @yukino 씨의 기사를 볼 수 있으면 도움이 됩니다.
ML-Ask로 텍스트 감정 분석
htps : // 코 m / 유키 노이 / / ms / e f6fb48b5 3694 9659c
프로그램을 실행하기 전에 할 일
이번 프로그램은 Twitter API를 이용하여 취득한 데이터가 필요합니다.
다음과 같은 데이터가 들어있는 csv 파일이라면 가능해야합니다 ...?
created_at
full_text
2018/4/10 15:22:06
사사카마 먹고 싶다
실행 환경
Python 3.6.3::Anaconda custom (64-bit)
pandas 0.24.2
matplotlib 2.2.2
1. 시간 전환
우선은 시간에 따라 트윗의 투고가 변화하는지 보고 싶습니다.
프로그램은 다음과 같습니다.
가져올 모듈 및 준비import pandas as pd
import matplotlib.pyplot as plt
요일별 트윗 횟수FILENAME_R ='任意のパス'
twitter_df = pd.read_csv(FILENAME_R,index_col=None, header=0,encoding="utf_8_sig")
twitter_df['created_at'] = pd.to_datetime(twitter_df['created_at'])
#日付のみ抽出
df_time_date = twitter_df['created_at'].dt.date
day_list = []
for date in df_time_date:
day_list.append(date.weekday())
#カウント
df_day = pd.DataFrame(day_list,columns=["Day"])
group_day = df_day['Day'].groupby(df_day['Day'])
cd = group_day.count()
cd.plot()
plt.xticks((0, 1, 2, 3, 4, 5, 6, 7), ('月曜日','火曜日','水曜日','木曜日','金曜日','土曜日','日曜日'))
실행해 보면 다음과 같습니다.
토요일이 적다는 조금 재미있는 결과가 되었습니다.
단, 금요일, 일요일이 최고조에 이르는 것은 어쩐지 알겠네요!
※덧붙여서 이것은 내가 가지고 있는 데이터만의 결과입니다. 일괄적으로는 이대로가 된다고는 할 수 없습니다.
※다른 데이터로 갔을 경우, 일요일 토요일이 많아, 화요일이 제일 적다고 하는 결과가 되었습니다.
또한 프로그램의 추출 부분과 카운트 부분을 다음과 같이 변경하여 실행하면 ...
#時間のみ抽出
df_time = twitter_df['created_at'].dt.hour
time_group = df_time.groupby(df_time)
#カウント
twitter_user_time_count = time_group.count()
twitter_user_time_count.plot()
12시 점심 시간에 트윗이 돌기처럼 증가
23,24시 등의 잠자기 전이 되면 트윗을 하는 사람이 최고조가 된다고 하는 재미있는 결과가 나왔네요!
2. 감정 전이
감정 분석에 사용하는 MLAsk입니다만, analyze에 건네주면 사전형으로 돌아옵니다.
그 중 'emotion'과 'representative'가 있지만,
이번 프로그램에서는 'representative'를 사용합니다.
다음 프로그램입니다.
가져올 모듈 및 준비import re
from mlask import MLAsk
emotion_analyzer = MLAsk()
import pandas as pd
import matplotlib.pyplot as plt
기능#rep
def emotion_mlask_rep(sentence): #str -> dict
emotion_dict = emotion_analyzer.analyze(sentence)
if emotion_dict['emotion']:
emotion,text = emotion_dict['representative'] #tuple(str,list[str]) -> str,list
return {emotion:len(text),'full_text':sentence}
else:
return {'None':1,'full_text':sentence}
#前処理
pattern1 = re.compile(r'RT') #排除
pattern2= re.compile(r"@([A-Za-z0-9_]+)")#排除
pattern3 = re.compile(r'(https?|ftp)(:\/\/[-_\.!~*\'()a-zA-Z0-9;\/?:\@&=\+\$,%#]+)')#排除
pattern4 = re.compile(r'#(\w+)')#削除
def re_def(sentence_list): #list -> list
subsentence_list = []
for sentence in sentence_list:
sub4 = re.sub(pattern4,"",sentence)
if (re.search(pattern1,sentence) or re.search(pattern2,sentence) or re.search(pattern3,sentence)) == None:
subsentence_list.append(sub4)
return subsentence_list
전처리로서 이하의 것을 실시하고 있습니다.
1. 리트윗, 멘션, URL을 포함한 데이터 제거
2. 해시태그가 포함된 트윗은 해시태그부만 삭제
#csv読み込み
FILENAME_R="読み込むデータのある場所への任意のパス"
twitter_df = pd.read_csv(FILENAME_R,index_col=None,usecols=["created_at","full_text"], header=0,encoding="utf_8_sig")
#テキストリスト化
twitter_df_text_list = twitter_df['full_text'].values.tolist()
twitter_df['created_at'] = pd.to_datetime(twitter_df['created_at'])
emotion_df = pd.DataFrame(index=None,columns=['full_text','yorokobi','ikari','aware','kowa',
'haji','suki','iya','takaburi',
'yasu','odoroki','None'])
tmp_list = []
for sentence in twitter_df_text_list:
emotion_dict = emotion_mlask_rep(sentence) #str → dict
tmp_list.append(emotion_dict)
emotion_df = pd.concat([emotion_df, pd.DataFrame.from_dict(tmp_list)])
twitter_df = pd.merge(twitter_df,emotion_df)
tmp_list는 list형이지만, 안에 복수의 사전을 포함하고 있습니다.emotion_df = pd.concat([emotion_df, pd.DataFrame.from_dict(tmp_list)])
이 부분에서 emotion_df에 tmp_list에 넣은 사전 데이터를 연결시키고 있습니다.
(처음에 emotion_df를 빈 데이터 프레임으로 선언한 이유입니다.)
twitter_df_nan2zero = twitter_df.fillna(0)
twitter_df_nan2zero = twitter_df_nan2zero.drop(['full_text'],axis=1)
#Noneが1である行を除外
twitter_df_subNone = twitter_df_nan2zero[twitter_df_nan2zero['None'] != 1]
twitter_df_subNone = twitter_df_subNone.drop(['None'],axis=1)
twitter_df_subNone.set_index('created_at')
나중에 pandas의 groupeby.sum()을 사용하기 위해 Nan을 0으로 바꿉니다.
또, ML-Ask와 Twitter의 문장의 특성상 판정으로부터 누설(None라고 판정된다) 것은 배제하고 있습니다.
##time emotion transition on twitter
df_time = twitter_df_subNone['created_at'].dt.hour
twitter_df_subNone['created_at'] = df_time.values
time_group=twitter_df_subNone.groupby('created_at').sum()
twitter_user_time_count = time_group.count()
#各感情の各合計値とその時間での感情値を割る
time_group_per_sum = time_group/time_group.sum()
time_group_per_sum.plot()
plt.savefig('任意の名前')
싫다는 감정이 21시경부터 줄어드는 것은 조금 재미있네요!
끝에
이번에 사용한 데이터의 각각의 판정된 감정의 합계치는 이하와 같습니다.
None에 판정된 것이 많아, 시점에서 싫어, 기쁨이라고 하는 감정이 되고 있습니다.
감정 분류에서 유출된 데이터가 많이 아깝기 때문에, 기계 학습에 의한 감정 분석으로 이행하는 편이 좋은 것은 아닌가? 라고 생각했습니다.
또 좌축 감정, 우축 트윗의 횟수, 가로축 요일 etc... 하면 알기 쉬웠다고 조금 생각합니다.
※후속의 개선점으로서 표기
Reference
이 문제에 관하여(Twitter User 게시 시간 전환 및 감정 전환 (ML-Ask 사용)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sasakama_1984/items/eb1f82e2a78b929c44d5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이번 프로그램은 Twitter API를 이용하여 취득한 데이터가 필요합니다.
다음과 같은 데이터가 들어있는 csv 파일이라면 가능해야합니다 ...?
created_at
full_text
2018/4/10 15:22:06
사사카마 먹고 싶다
실행 환경
Python 3.6.3::Anaconda custom (64-bit)
pandas 0.24.2
matplotlib 2.2.2
1. 시간 전환
우선은 시간에 따라 트윗의 투고가 변화하는지 보고 싶습니다.
프로그램은 다음과 같습니다.
가져올 모듈 및 준비import pandas as pd
import matplotlib.pyplot as plt
요일별 트윗 횟수FILENAME_R ='任意のパス'
twitter_df = pd.read_csv(FILENAME_R,index_col=None, header=0,encoding="utf_8_sig")
twitter_df['created_at'] = pd.to_datetime(twitter_df['created_at'])
#日付のみ抽出
df_time_date = twitter_df['created_at'].dt.date
day_list = []
for date in df_time_date:
day_list.append(date.weekday())
#カウント
df_day = pd.DataFrame(day_list,columns=["Day"])
group_day = df_day['Day'].groupby(df_day['Day'])
cd = group_day.count()
cd.plot()
plt.xticks((0, 1, 2, 3, 4, 5, 6, 7), ('月曜日','火曜日','水曜日','木曜日','金曜日','土曜日','日曜日'))
실행해 보면 다음과 같습니다.
토요일이 적다는 조금 재미있는 결과가 되었습니다.
단, 금요일, 일요일이 최고조에 이르는 것은 어쩐지 알겠네요!
※덧붙여서 이것은 내가 가지고 있는 데이터만의 결과입니다. 일괄적으로는 이대로가 된다고는 할 수 없습니다.
※다른 데이터로 갔을 경우, 일요일 토요일이 많아, 화요일이 제일 적다고 하는 결과가 되었습니다.
또한 프로그램의 추출 부분과 카운트 부분을 다음과 같이 변경하여 실행하면 ...
#時間のみ抽出
df_time = twitter_df['created_at'].dt.hour
time_group = df_time.groupby(df_time)
#カウント
twitter_user_time_count = time_group.count()
twitter_user_time_count.plot()
12시 점심 시간에 트윗이 돌기처럼 증가
23,24시 등의 잠자기 전이 되면 트윗을 하는 사람이 최고조가 된다고 하는 재미있는 결과가 나왔네요!
2. 감정 전이
감정 분석에 사용하는 MLAsk입니다만, analyze에 건네주면 사전형으로 돌아옵니다.
그 중 'emotion'과 'representative'가 있지만,
이번 프로그램에서는 'representative'를 사용합니다.
다음 프로그램입니다.
가져올 모듈 및 준비import re
from mlask import MLAsk
emotion_analyzer = MLAsk()
import pandas as pd
import matplotlib.pyplot as plt
기능#rep
def emotion_mlask_rep(sentence): #str -> dict
emotion_dict = emotion_analyzer.analyze(sentence)
if emotion_dict['emotion']:
emotion,text = emotion_dict['representative'] #tuple(str,list[str]) -> str,list
return {emotion:len(text),'full_text':sentence}
else:
return {'None':1,'full_text':sentence}
#前処理
pattern1 = re.compile(r'RT') #排除
pattern2= re.compile(r"@([A-Za-z0-9_]+)")#排除
pattern3 = re.compile(r'(https?|ftp)(:\/\/[-_\.!~*\'()a-zA-Z0-9;\/?:\@&=\+\$,%#]+)')#排除
pattern4 = re.compile(r'#(\w+)')#削除
def re_def(sentence_list): #list -> list
subsentence_list = []
for sentence in sentence_list:
sub4 = re.sub(pattern4,"",sentence)
if (re.search(pattern1,sentence) or re.search(pattern2,sentence) or re.search(pattern3,sentence)) == None:
subsentence_list.append(sub4)
return subsentence_list
전처리로서 이하의 것을 실시하고 있습니다.
1. 리트윗, 멘션, URL을 포함한 데이터 제거
2. 해시태그가 포함된 트윗은 해시태그부만 삭제
#csv読み込み
FILENAME_R="読み込むデータのある場所への任意のパス"
twitter_df = pd.read_csv(FILENAME_R,index_col=None,usecols=["created_at","full_text"], header=0,encoding="utf_8_sig")
#テキストリスト化
twitter_df_text_list = twitter_df['full_text'].values.tolist()
twitter_df['created_at'] = pd.to_datetime(twitter_df['created_at'])
emotion_df = pd.DataFrame(index=None,columns=['full_text','yorokobi','ikari','aware','kowa',
'haji','suki','iya','takaburi',
'yasu','odoroki','None'])
tmp_list = []
for sentence in twitter_df_text_list:
emotion_dict = emotion_mlask_rep(sentence) #str → dict
tmp_list.append(emotion_dict)
emotion_df = pd.concat([emotion_df, pd.DataFrame.from_dict(tmp_list)])
twitter_df = pd.merge(twitter_df,emotion_df)
tmp_list는 list형이지만, 안에 복수의 사전을 포함하고 있습니다.emotion_df = pd.concat([emotion_df, pd.DataFrame.from_dict(tmp_list)])
이 부분에서 emotion_df에 tmp_list에 넣은 사전 데이터를 연결시키고 있습니다.
(처음에 emotion_df를 빈 데이터 프레임으로 선언한 이유입니다.)
twitter_df_nan2zero = twitter_df.fillna(0)
twitter_df_nan2zero = twitter_df_nan2zero.drop(['full_text'],axis=1)
#Noneが1である行を除外
twitter_df_subNone = twitter_df_nan2zero[twitter_df_nan2zero['None'] != 1]
twitter_df_subNone = twitter_df_subNone.drop(['None'],axis=1)
twitter_df_subNone.set_index('created_at')
나중에 pandas의 groupeby.sum()을 사용하기 위해 Nan을 0으로 바꿉니다.
또, ML-Ask와 Twitter의 문장의 특성상 판정으로부터 누설(None라고 판정된다) 것은 배제하고 있습니다.
##time emotion transition on twitter
df_time = twitter_df_subNone['created_at'].dt.hour
twitter_df_subNone['created_at'] = df_time.values
time_group=twitter_df_subNone.groupby('created_at').sum()
twitter_user_time_count = time_group.count()
#各感情の各合計値とその時間での感情値を割る
time_group_per_sum = time_group/time_group.sum()
time_group_per_sum.plot()
plt.savefig('任意の名前')
싫다는 감정이 21시경부터 줄어드는 것은 조금 재미있네요!
끝에
이번에 사용한 데이터의 각각의 판정된 감정의 합계치는 이하와 같습니다.
None에 판정된 것이 많아, 시점에서 싫어, 기쁨이라고 하는 감정이 되고 있습니다.
감정 분류에서 유출된 데이터가 많이 아깝기 때문에, 기계 학습에 의한 감정 분석으로 이행하는 편이 좋은 것은 아닌가? 라고 생각했습니다.
또 좌축 감정, 우축 트윗의 횟수, 가로축 요일 etc... 하면 알기 쉬웠다고 조금 생각합니다.
※후속의 개선점으로서 표기
Reference
이 문제에 관하여(Twitter User 게시 시간 전환 및 감정 전환 (ML-Ask 사용)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sasakama_1984/items/eb1f82e2a78b929c44d5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import pandas as pd
import matplotlib.pyplot as plt
FILENAME_R ='任意のパス'
twitter_df = pd.read_csv(FILENAME_R,index_col=None, header=0,encoding="utf_8_sig")
twitter_df['created_at'] = pd.to_datetime(twitter_df['created_at'])
#日付のみ抽出
df_time_date = twitter_df['created_at'].dt.date
day_list = []
for date in df_time_date:
day_list.append(date.weekday())
#カウント
df_day = pd.DataFrame(day_list,columns=["Day"])
group_day = df_day['Day'].groupby(df_day['Day'])
cd = group_day.count()
cd.plot()
plt.xticks((0, 1, 2, 3, 4, 5, 6, 7), ('月曜日','火曜日','水曜日','木曜日','金曜日','土曜日','日曜日'))
#時間のみ抽出
df_time = twitter_df['created_at'].dt.hour
time_group = df_time.groupby(df_time)
#カウント
twitter_user_time_count = time_group.count()
twitter_user_time_count.plot()
import re
from mlask import MLAsk
emotion_analyzer = MLAsk()
import pandas as pd
import matplotlib.pyplot as plt
#rep
def emotion_mlask_rep(sentence): #str -> dict
emotion_dict = emotion_analyzer.analyze(sentence)
if emotion_dict['emotion']:
emotion,text = emotion_dict['representative'] #tuple(str,list[str]) -> str,list
return {emotion:len(text),'full_text':sentence}
else:
return {'None':1,'full_text':sentence}
#前処理
pattern1 = re.compile(r'RT') #排除
pattern2= re.compile(r"@([A-Za-z0-9_]+)")#排除
pattern3 = re.compile(r'(https?|ftp)(:\/\/[-_\.!~*\'()a-zA-Z0-9;\/?:\@&=\+\$,%#]+)')#排除
pattern4 = re.compile(r'#(\w+)')#削除
def re_def(sentence_list): #list -> list
subsentence_list = []
for sentence in sentence_list:
sub4 = re.sub(pattern4,"",sentence)
if (re.search(pattern1,sentence) or re.search(pattern2,sentence) or re.search(pattern3,sentence)) == None:
subsentence_list.append(sub4)
return subsentence_list
#csv読み込み
FILENAME_R="読み込むデータのある場所への任意のパス"
twitter_df = pd.read_csv(FILENAME_R,index_col=None,usecols=["created_at","full_text"], header=0,encoding="utf_8_sig")
#テキストリスト化
twitter_df_text_list = twitter_df['full_text'].values.tolist()
twitter_df['created_at'] = pd.to_datetime(twitter_df['created_at'])
emotion_df = pd.DataFrame(index=None,columns=['full_text','yorokobi','ikari','aware','kowa',
'haji','suki','iya','takaburi',
'yasu','odoroki','None'])
tmp_list = []
for sentence in twitter_df_text_list:
emotion_dict = emotion_mlask_rep(sentence) #str → dict
tmp_list.append(emotion_dict)
emotion_df = pd.concat([emotion_df, pd.DataFrame.from_dict(tmp_list)])
twitter_df = pd.merge(twitter_df,emotion_df)
twitter_df_nan2zero = twitter_df.fillna(0)
twitter_df_nan2zero = twitter_df_nan2zero.drop(['full_text'],axis=1)
#Noneが1である行を除外
twitter_df_subNone = twitter_df_nan2zero[twitter_df_nan2zero['None'] != 1]
twitter_df_subNone = twitter_df_subNone.drop(['None'],axis=1)
twitter_df_subNone.set_index('created_at')
##time emotion transition on twitter
df_time = twitter_df_subNone['created_at'].dt.hour
twitter_df_subNone['created_at'] = df_time.values
time_group=twitter_df_subNone.groupby('created_at').sum()
twitter_user_time_count = time_group.count()
#各感情の各合計値とその時間での感情値を割る
time_group_per_sum = time_group/time_group.sum()
time_group_per_sum.plot()
plt.savefig('任意の名前')
이번에 사용한 데이터의 각각의 판정된 감정의 합계치는 이하와 같습니다.
None에 판정된 것이 많아, 시점에서 싫어, 기쁨이라고 하는 감정이 되고 있습니다.
감정 분류에서 유출된 데이터가 많이 아깝기 때문에, 기계 학습에 의한 감정 분석으로 이행하는 편이 좋은 것은 아닌가? 라고 생각했습니다.
또 좌축 감정, 우축 트윗의 횟수, 가로축 요일 etc... 하면 알기 쉬웠다고 조금 생각합니다.
※후속의 개선점으로서 표기
Reference
이 문제에 관하여(Twitter User 게시 시간 전환 및 감정 전환 (ML-Ask 사용)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sasakama_1984/items/eb1f82e2a78b929c44d5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)