のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

友利奈緒らしさとは何か。

Sponsored Links

友利奈緒の皆さんこんにちは。
お元気ですか?私は元気です。

これは、友利奈緒アドベントカレンダー24日目の記事です。
www.adventar.org

今日は友利奈緒らしさについて追求していきます。
世の中友利奈緒を降臨させようとする方々は沢山いらっしゃると思います。

しかし、友利奈緒は既に降臨しているかもしれません。
そこで、友利奈緒らしさについて調査してみようと思った次第です。
(ええ、題材は自然言語処理ですがね。)

データセットの集め方

インターネットから収集しました。無駄に頑張りました。
テキストにぱちぱちと貼ります。

まさかの、神が出現して驚いております。伏線でしょうかこれ。
github.com

で何をするか?

発言傾向

まずは、友利奈緒の発言の傾向を見てみます。
どんな単語が多いか、純粋に見てみましょう。

全てのワードの中から発言傾向を探ります。

以下は全ての発言に対して、形態素解析を行い、Word Countを実施した結果です。
いわゆるですます調なのでしょうか。
f:id:tereka:20151221214916p:plain

また、名詞のみに絞るとこうなります。
f:id:tereka:20151221214926p:plain

一人称が「あたし」二人称が「あなた」お兄さんのネタが好きなことがわかります。

友利奈緒の発言のword2vecマップ

今回はt-SNEを使ってword2vecの出力を2次元で表現してみます。
Word Analogyがほしいので、今回はChainerのサンプルをお借りして実施します。
実施した結果は以下になります。

f:id:tereka:20151221223102p:plain

恋の周辺はこんな感じ、彼女にとって恋と荷物は同じなのでしょうか。
f:id:tereka:20151221223406p:plain

彼女が好きなアーティストであり、ZHIEND付近。因みに右上にある答案と満点が近いようです。
f:id:tereka:20151221223518p:plain

友利奈緒の中の友利奈緒を探す

ここからが本番です。なんと、Twitter Accountから友利奈緒を探しその中から友利奈緒を探さなくてはなりません。
もう面倒くさいのでこのあたりコサイン類似度でいいでしょうか。。
因みに今回は、取得したツイートの中からワードカウントし、それをコサイン類似度を使って、比較しております。

まずは、Twitter Accountから対象の友利奈緒を探します。
が、まずは、TwitterのDeveloper登録から開始する必要があります。
いくら友利奈緒をさがしても、データが必要なのです。

ということでここからはコーディング
日々差なので、まさかのTwitter APIのアクセス登録からせねばなりません。
まずは、デベロッパー登録を行い、アクセスキーの数々を取得する必要があります。

それらを行った結果が以下のコードになります。

#coding:utf-8
from requests_oauthlib import OAuth1Session
import json
import MeCab
import collections
import scipy.spatial.distance
import numpy as np

CK = '****'                             # Consumer Key
CS = '****'         # Consumer Secret
AT = '****' # Access Token
AS = '****'   

user_url = "https://api.twitter.com/1.1/users/search.json"
user_param = {"q":"友利奈緒"}
twitter = OAuth1Session(CK, CS, AT, AS)
req = twitter.get(user_url, params = user_param)
request_data = json.loads(req.text.encode("utf-8"))
twitter_accounts = [data["screen_name"].encode('utf-8') for data in request_data]

tweet_lists = []
tweet_lists_per_account = []
for twitter_account in twitter_accounts:
	params = {"screen_name": twitter_account"count":100}
	url = "https://api.twitter.com/1.1/statuses/user_timeline.json"
	twitter = OAuth1Session(CK, CS, AT, AS)
	req = twitter.get(url, params = params)

	request_data = json.loads(req.text.encode("utf-8"))

	tweet_data_list = [data["text"].encode('utf-8') for data in request_data]
	tweet_lists += tweet_data_list
	tweet_lists_per_account.append(tweet_data_list)

f = file("tomorinao.txt","r")
tomorinao_txt = [line for line in f.readlines()]
tweet_lists += tomorinao_txt

def create_dict(text_list):
	mt = MeCab.Tagger("mecabrc")
	d = collections.defaultdict(int)
	for text in text_list:
		res = mt.parseToNode(text)
		while res:
			#pos = res.feature.split(",")[0]
			length = len(d)
			if not res.surface in d:
				d[res.surface] = length
			res = res.next
	return d

def convert_to_vector(d,tweet_lists):
	vect = np.zeros((len(d)))
	for tweet_list in tweet_lists:
		mt = MeCab.Tagger("mecabrc")
		res = mt.parseToNode(tweet_list)
		while res:
			vect[d[res.surface]] += 1
			res = res.next
	return vect

tweet_dictionary = create_dict(tweet_lists)
tweets = [convert_to_vector(tweet_dictionary,tweets) for tweets in tweet_lists_per_account]
tomorinao_vec = convert_to_vector(tweet_dictionary, tomorinao_txt)

datas = [{"tweet_name":account,"similarity":1 - scipy.spatial.distance.cosine(tomorinao_vec, tweet)} for tweet,account in zip(tweets,twitter_accounts)]
for data in sorted(datas,key=lambda x:x["similarity"],reversed=True):
	print data["tweet_name"],data["similarity"]

解析ができておりませんが、なんかそれっぽい助詞を沢山使っていれば似てると判断されそうです。

kno1020 0.908406718657
palon_m 0.891978811649
shift_crops 0.891117912717
furaji 0.881959227468
idzuna_tan 0.880765518925
Soma_UoxoU 0.878342647015
hyonhina 0.8722366894
__Tomori__Nao 0.859986967808
ret156 0.854664019432
maccha_nuce 0.854563089704
nisi3_ 0.848049044259
menphim 0.839963214344
Sen_ao_ 0.839728964507
_j5kd_ 0.836228536726
nkpoid 0.813112189718
9m 0.777776783697
mzyy94 0.765061211476
Tomori_not 0.751480048378
tomori_nari 0.713887033463
takuzirra 0.704690547238

友利奈緒を自動生成した。

うん、もう沢山の人がやりすぎてあれですが、Recurrent Neural Networkを使って
最後に友利奈緒を自動生成してみた。

github.com

ほんでだけま…減点食費?問題た!これ、一必死に仕方でしょう?
その未ちゃんのように突き出消えていませけどそれが兄にしてくるのででしょ、落ちますか挙動が留まら部で能力を送りにが
帰っているからのようは親御さんのなっにいましたただ、休学届けを見て下さいそのあたしに出来るましょの、
はい!、ちゃんとございます、行きたら出ていたぞ行きて!おっですいえいえあの今も陣が乙坂していれ帰るないと、
毎日1能力を勘違い続けてほうたのも野球、日々が誰やないだけじゃすることをしれましょうあたし達は探そなです違ういふんんの駅弁同じ見せに高いよーこれは口ですかお前、パスタ前の簡単に録画ないで、やがてしれ出来ましたか?
誰ゲットー、ありい寝るとたまにいますか?信じましょの、次の無条件ですが、かあなたてまかと証拠ですん、何者の拭く!
ここだけ最強っすねー、ゆっくりございたらそれによりーね、クソの魔!こういうのお母さんはそうよりもあるんですへ?

結論

友利奈緒は友利奈緒です。

明日は@Carpe_diemF91 さんです。
よろしくお願いします。