お得tweetは見て終わりなのか。

# はじめに
初めまして。Python初心者ですがよろしくお願いします。twitterのツイートからユーザーがどのような用途で使用しているかを分析したいと今回の分析をしました。
またpython-twitterライブラリを使用している記事等がなかなか見当たらないことから少しでも参考になればと思いデータ収集を行いました。
# 目次

1.概要
2.全体設計
3.実行環境
4.類似度分析
5.実装
6.結果
7.考察
8.今後について
9.参考文献

# 1.概要
## テーマ
 コンビニ業界のtweetに反応したユーザを解析する。今回のコンビニ業界はローソン(@akiko_lawson),セブンイレブン(@711SEJ),ファミリーマート(@famima_now)の３業態のデータを取得した。
## データ取得
・TwitterApiをもともと取得していることや、日常的にTwitterを使用していることから、何か活かせない方と思い、Twitterからtweetを取得する。
・一つの業態の1ツイートを選択しtweetをretweetしたユーザを取得する。
ツイートに対しretweetした人の特性を追っていく。retweet者のtweetと類似性の高いtweetを選別しどのような特徴がみられるか考察する。
retweet者が行ったretweetを取得し全体retweetのどの程度を占めるかも同時に見ていく。
・これらの結果からコンビニ業界のツイートに対しどういう意図を持って反応しているか考察していく。
# 2.全体設計
手順1：tweet(A)を一つ選択
手順2：tweetを名詞で形態素解析(B)
手順3：Aをretweetしているユーザ(C)を取得
手順4：Bのtweetを取得
手順5：Cのtweetの中からBが含まれているtweetを抽出(D)
手順6：Dと類似性が高いものを抽出
手順7：Cがretweetしているtweetを取得(E)
手順8：Eの中にコンビニ差3業態のtweetがどの程度含まれているか(F)

流れを図でまとめてみました。
![流れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921112/c92d2eb3-02ad-39d7-cf5e-fb8aba741fab.png)

# 3.実行環境
環境：conda
python_ver：3.9.12
使用モジュール
```python
import twitter 
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from janome.tokenizer import Tokenizer
```

# 4.類似度分析
### テキストのベクトル化
類似度分析を行う準備として
TfidfVectorizerを使用してベクトル化している。
tf-idf値＝（ある文書における、ある単語の出現頻度）
　　　　　　　×（ある単語の文書間でのレア度）
によって表すことができる。
```python
#形態素解析関数
def wakachi(self,text):
    t = Tokenizer()
    tokens = t.tokenize(text)
    docs=[]
    for token in tokens:
        docs.append(token.surface)
    return docs
    
#文書ベクトル化関数
def vecs_array(self,documents):
    docs = np.array(documents)
    vectorizer = TfidfVectorizer(analyzer=self.wakachi,use_idf=False)
    vecs = vectorizer.fit_transform(docs)
    return vecs.toarray()
```
上記のコードはwakatiメソッドによって形態素解析を行った単語の配列を
TfidfVectorizerにデータを格納しテキストをベクトル化している
### コサイン類似度
ベクトル化されたデータをコサイン類似度を使い二つの文章の類似度を導出している。
二つのベクトル間のベクトル方向のcosΘを導出することで二つのベクトルの方向性がどの近いものか分析できる手法である。
以下はコサイン類似度を一般化したものである。
![di-capture02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921112/72450da4-7c9e-1531-2fc3-8e74c17d7b72.png)
![di-capture03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921112/e4bca855-9f5f-12ee-6506-e048288b9662.png)
```python
cosine_similarity(ベクトル化したAtweet, Aをretweetしたユーザが行ったtweet,2)
```
上記のコードを使用して2tweetの類似度を分析していく
# 5.実装
手順0：Api定義
```python
def __init__(self):
        self.api = twitter.Api('key','key','key','key')
```
手順1：tweet(A)を一つ選択
　ローソン(@akiko_lawson)のtweetを取得
手順4：Bのtweetを取得
```python
acount=取得アカウント,counter=取得数,normal = 通常ツイートをとるか,rt = RTをとるか
def get_tweet(self,acount="",counter=0,normal = True,rt = None,over_one=False):
        def http_rt_delete(text):
            text = [i for i in text.split(" ") if "http" not in i and "RT" not in i]
            return ' ' . join(text)
        api = self.api
        searchs = api.GetUserTimeline(screen_name = acount,count = counter)
        id_data = []
        text_data = []
        for search in searchs:
            insert = False
            if "RT" not in search.text and normal:
                insert = True
            elif "RT" in search.text and rt:
                insert = True
            if insert:
                text = http_rt_delete(search.text)
                id_data.append(search.id)
                text_data.append(text)
                if over_one:
                    break
        return id_data,text_data
```
手順2：tweetを名詞で形態素解析(B)
```python
exclusion=除外するワード
def extract_words_remove_word(self,text,exclusion=[]):
    token = Tokenizer().tokenize(text)
    words = []

    for line in token:
        tkn = re.split('\t|,', str(line))
        # 名詞のみ対象
        if tkn[0] not in exclusion and tkn[1] in ['名詞'] and tkn[2] in ['一般', '固有名詞'] :
            words.append(tkn[0])

    return ' ' . join(words)    
```
手順3：Aをretweetしているユーザ(C)を取得
```python
 def get_retweet(self,tweet_id,counter=1):
    api = self.api
    searchs_retweet = api.GetRetweeters(tweet_id,count=counter)
    users = []
    for user in searchs_retweet:
        searchs_acount = api.GetUser(user)
#             print("@"+searchs_acount.screen_name)
        users.append("@"+searchs_acount.screen_name)
    return users
```
手順5：Cのtweetの中からBが含まれているtweetを抽出(D)
手順6：Dと類似性が高いものを抽出
```python
tweets = [手順1データ,手順4データ]
cs_array = np.round(cosine_similarity(t.vecs_array(tweets), t.vecs_array(tweets)),2)
```
手順7：Cがretweetしているtweetを取得(E)
```python
acount = retweetを探したユーザ,search_acount = 探したユーザの中に含まれてほしいアカウント
def follower_search(self,acount,search_acount):
    api = self.api
    search = api.GetFollowers(acount)
    result = np.zeros(len(search_acount))
    print(search)
    for follower in search:
        for acount,i in zip(search_acount,range(len(search_acount))):
            if follower.screen_name == "@"+acount:
                result[i] = 1
    return result
```
手順8：Eの中にコンビニ差3業態のtweetがどの程度含まれているか(F)
　取得したretweetから他にセブンイレブン(@711SEJ),ファミリーマート(@famima_now)の二社もreweetしているかもチェック。全体retweetからどの程度占めているかを確かめる。
# 6.結果
|ユーザ|類似度|E(@akiko_lawson)|E(@711SEJ)|E(@famima_now)|
|-|---|-|-|-|
|Aさん|0.43|0.0222|0.0222|0.0166|
|Bさん|0.08|0.0517|0.0|0.0|


・RtweetしたAさんは
    全体的に満遍なくretweetしていることや類似率が高かったが内容は他の業態の企画系のtweetであったためこのユーザは様々なお得tweetを漁っていく傾向にあると考えられる。

・RtweetしたBさんは
tweetの類似度が低いことからあまり興味がないと考えられる。また他のライバル業　態は全くretweetしていないことなどからたまたま見つけただけの可能性が高く思い付きでrewteetしているだけであると考えられる。


# 7.考察
上記の結果の通りの2パターンのユーザが多くを占めており商品名などを積極的に取り上げるユーザが少なかった。
想定ではもう少しretweetし商品などについてコメントや宣伝しているユーザがいると考えていた。だが実際はretweetなどで情報をストックしておく主旨のものがほとんどであった。類似度に関して全体的に低いtweetが占めており、tweet内容に感銘を受け同調するユーザはあまりいない、それどころか似た内容の宣伝tweetをretweetしているケースが多く様々な宣伝tweetを漁っているユーザが多い。

# 8.今後について
・tweet文の解析の仕方に悔いが残る結果なった。技術的にtweetを辞書を用いたり、特定のワードなどが顕著になりやすい業種、ユーザなどを選別する工夫を用いてジャンル分けなどを行い解析していく手法を試していきたい。
また企業の宣伝tweetが類似性や使用単語として似ているケースがよく見られたことから様々な企業宣伝tweetを集めて特徴的なtweetとその効果など思いつく考えが出てきているので引き続き見ていきたい。
# 9.参考文献
https://atmarkit.itmedia.co.jp/ait/articles/2112/23/news028.html
https://atmarkit.itmedia.co.jp/ait/articles/2112/08/news020.html
https://python-twitter.readthedocs.io/en/stable/twitter.html