【自然言語処理】転職中（or 直前）のエンジニアに会いたい


# 閑話

最近弊社はエンジニア大募集時期な事もあり、TwitterやQiita経由でお声がけすることが多いです。

その多くが偶然タイムラインで発見からなので、もっと効率よく声をかけたい！

と思い、Twitter検索ボックスで　`Java 転職`（←安直）を入力すると、**ノイズ**（転職サービスや関連のブログ）が多く、なかなか欲しいTweetを見つけられない。


そんな感じでモヤモヤしながら画面スクロールをしまくっているとふと、

> **「これ、なんで Python がやってないんだっけ？」**

となり、自然言語処理で解決することを発起しました。


# 本題


スクレイピング ＆ 自然言語処理を０からやるのも面白そうですが、今回は目的達成のために APIを使用する事にしました！



## まずはTwitter API


Twitter APIには色々プランがあるのですが今回はPremiumプランを使用しました！
（写真真ん中のプラン）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266096/eddc9e20-ca8f-9466-3c67-49e680b2ab01.png", width=400, alt="Twitter API 料金表">




実際に `Java 転職` で検索APIを叩くと、

<details><summary>Twitter API を叩くソース 【Python】</summary><div>

```python
import json
import config
import requests
from requests_oauthlib import OAuth1Session

# OAuth認証部分（ご自身ので埋めてください！）
CK      = ''
CS      = ''
AT      = ''
ATS     = ''
twitter = OAuth1Session(CK, CS, AT, ATS)

# Twitter Endpoint(検索結果を取得する)
url2 = 'https://api.twitter.com/1.1/tweets/search/30day/dev.json'

# Enedpointへ渡すパラメーター
keyword = 'Java 転職'

params ={
         'maxResults' : 100,      # 取得するtweet数
         'query'     : keyword  # 検索キーワード
         }

if req.status_code == 200:
    res = json.loads(req.text)
    for line in res['results']:

        if 'RT' in line['text']:
            continue
        
        print(line['text'])
        print('*******************************************')
else:
    print("Failed: %d" % req.status_code)
```
</div></details>

（↓結果）

```
ブログ書いてますのでよかったら見てください
#ブログ #エンジニア #未経験 #Java #プログラミング #pgfrat#エンジニア転職 #未経験エンジニア
https://t.co/SYD2BRB0aX
*******************************************
【Java】Easy OAuth 2.0 Single Sign-on in Java / https://t.co/AZJqRFJFci #プロマリ #News #promari #ニュース #プログラミング #IT… https://t.co/RJ4fCg56ds
*******************************************
JAVA、PHP、.NETなどwebアプリ経験者大歓迎ですよ　https://t.co/9qoD7fPcg9  #求人　#フリーランス　#個人事業主　#SE　#フリーエンジニア　#転職　#就職　#正社員　#契約社員　#派遣社員… https://t.co/fWvZCEukey
*******************************************
フリーランスのSEと正社員のSEで、正社員のSEにこだわっている人も多かったりするけど、転職エージェントさんに聞いたら、まさかの余り差がないみたい...。←だったらフリーの方が稼げそう笑
#転職したい #java #プログラミング #相互フォロー
*******************************************
みんなからの匿名質問を募集中！
 .
 .
```



:worried:こんな感じでノイズが多い...



## お次は COTOHA API

今回は自然言語処理部分は [COTOHA API](https://api.ce-cotoha.com/)を使いました！

ざっと無料アカウントだけでも以下の言語処理を使えて、日本語圏では非常にありがたいAPIです。

- **構文解析**　←今回使った!!!　
- 固有表現抽出
- 固有名詞(企業名)補正
- 照応解析
- キーワード抽出
- 類似度算出
- 文タイプ判定
- ユーザ属性推定(β)
- 言い淀み除去(β)
- 音声認識誤り検知(β)
- 感情分析
- 要約(β)


<details><summary>:point_down_tone2:こんな感じで使えます。 【Python】</summary><div>

```python

#認証して、

BASE_URL = "xxx"
CLIENT_ID = "xxx"
CLIENT_SECRET = "xxx"
access_token = 'xxx'

# 認証
def auth(client_id, client_secret):
    token_url = "https://api.ce-cotoha.com/v1/oauth/accesstokens"
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8"
    }

    data = {
        "grantType": "client_credentials",
        "clientId": client_id,
        "clientSecret": client_secret
    }
    r = requests.post(token_url,
                      headers=headers,
                      data=json.dumps(data))
    return r.json()["access_token"]


auth(CLIENT_ID, CLIENT_SECRET)



# 構文解析API

def cotoha_parse(sentence):
    
    base_url = BASE_URL
    headers = {
        "Content-Type": "application/json",
        "charset": "UTF-8",
        "Authorization": "Bearer {}".format(access_token)
    }

    data = {
        "sentence": sentence,
    }

    r = requests.post(base_url + "nlp/v1/parse",
                      headers=headers,
                      data=json.dumps(data))
    return r.json()

```

</div></details>



## 組み合わせロジック

色々試した結果、経験則的に以下のようにしました

- ツイートを一行毎にみて、`転職`を含んでいるツイートを pick up
- その文を構文解析して、`転職`に続く言葉のラベルが **compound**の時に正とする
- また、`転職`の後に動詞接尾辞が続けば正とする （転職したい！転職する！）

>※ compund : 名詞＆名詞や、動詞＆動詞の複合語
（例 １:　`自覚症状`　症状 → **compound** 自覚）
（例 ２:　`転職先`、`転職希望`、....）



（↓ロジックイメージと例文）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266096/14f09e1f-dcb5-6eb1-350c-6c878954cc27.png)


<details><summary>最終スクリプトはこんな感じに</summary><div>

```python
# ここに、もとTweetを格納。
precious_tweets = []


# twitter APIの結果
res = json.loads(req.text)
for tweet in res['results']:

    # RTされた物は除く→オリジナリのtweetのみを使用。
    if 'RT' in tweet['text']:
        continue

    for sentence in tweet['text'].split('。'):
        
        for line in sentence.split('\n'):
            if '転職' in line:
                
                # COTOHAで構文解析
                results_parsed = cotoha_parse(line)['result']
                
                for result in results_parsed:    
                    tokens = result['tokens']
                    
                    for index, token in enumerate(tokens):
                        if '転職' in token['form']:
                            try:
                                next_token = tokens[index + 1]
                                next_label = next_token['dependency_labels'][0]['label']
                            except:
                                print('try失敗! 　index:', index)
                                break 

                            if next_label == 'compound':
                                precious_tweets.append(tweet['text'])
                            elif next_token['pos'] == '動詞接尾辞':
                                precious_tweets.append(tweet['text'])
```

</div></details>

（↓結果は...）

```
*******************************************
転職になると、今の年齢くらいがベストなのかな〜〜やっぱり、３０後半になっちゃうと転職採用と極端に減りそうだし・・・本当、転職って年齢も考えたりしないといけないから時期を見極めるのも大変....。
#転職したい #java #プログラミング #相互フォロー
*******************************************
3/4 学習時間1h
3/5 学習時間1h

転職コンサルの方とweb面接に向けての面接対策の実施
webでの面接はオフラインでの面接と違い熱量が伝わりにくい
人に想いを伝えるためには感情を動かすしかない、感情を動かせる人になる！
*******************************************
転職活動をすると、今の流行り/求められている技術が何かが見えて来る。
Javaは正直あんまお呼びじゃないんだよね
*******************************************
転職先探してます。
エンジニア、コンサル希望
博多区在住。
Java(2年半)
```
:relaxed:満足いく結果になりました



# 終わりに


実際に出力結果をカウントしてみると **100件中7件に絞られ（7%）**、多少のノイズも入っているもののほとんどが貴重なツイート（転職者の方）で自分でも割とびっくりしました。

今回は断念したのですが、本当はJSON Driver的な物を使ってDB化して、さらに他の言語処理APIも使用して、Twitterのプロフィールや位置情報も...等々、さらなる強化が可能だと思います。

また、クラスタリングなども入れると結構ガチな分析が出来そうです。

今回はプログラムの力が身に染みて良くわかりました。
Twitter社とNTT社に感謝です。

また、自分もTwitter & Qiitaのおかげで就職先が見つかった人間なので（[この記事に書いてあるように](https://qiita.com/Yoji0806/items/d895d1fbd2d8c1736449)）、自ら発信しているような方がどんどん増えると良いな〜と思います。
（弊社も積極的に声をかけていきたいです。）


# 参考

とても参考になってありがたかったです!!!

Twitter APIに関して

- [公式Developprtページ](https://developer.twitter.com/)
- [twitter APIで遊んでみる #3(検索結果の取得)](https://qiita.com/tomozo6/items/d7fac0f942f3c4c66daf)


COTOHA APIに関して

 - [公式APIドキュメントページ](https://api.ce-cotoha.com/contents/reference/apireference.html)
 
 - [「たけのこの里」を「きのこの山」に『正しく』自動で修正して差し上げるプログラム](https://qiita.com/honehoney/items/a8c7ba2c53a70c88502e)