【テスト】COTOHA言語解析でなろうで流行ってるキーワードの抽出

# 応募のための所定の手続き
[COTOHA API Portal][1]

iPad欲しい。（欲しかった！）（結局、自分で買った）

# コード
[github:analysis_narou][4]

# 仮説を立てる
- [小説家になろう][2]のタイトルとあらすじの言語解析
    - [小説家になろう][2]は如何にポイントを稼ぐかのメタゲーム
        - 流行りの作品のカウンターのカウンターのカウンター・・・
        - twitterに近い大喜利文化
    - メタゲームを言語解析でハック
        - [COTOHA API Portal][1]の「キーワード抽出」「類似度算出」
            1. タイトルとあらすじから流行っているキーワードを抽出できるか？
            2. 長文のタイトル＝あらすじの作品とタイトル≠あらすじの作品はどちらが上がりやすい？

# 実装
## なろう小説API
### 参考資料
[なろう小説APIドキュメント][3]

### コード
```
https://api.syosetu.com/novelapi/api/?out=json&lim=50&order=dailypoint
```

「日刊ランキング昇順」「上位50件」「json形式」の取得クエリ。

``` python
url = 'https://api.syosetu.com/novelapi/api/'
param = {
    'out': 'json',
    'lim': '50',
    'order': 'dailypoint',
}
url_format = '{}?{}'.format(url, urllib.parse.urlencode(param))
res = requests.get(url=url_format)

narou_datas = res.json()
for data in narou_datas:
    if 'title' in data:
        title = data['title']
        story = data['story']
        daily_point = data['daily_point'],
```

- for使用する際は"title"確認必須
    - 小説の出力数"allcount"も入っているため、回避処理が必要なため

## COTOHA API
### 参考資料
[COTOHA API Portal][1]

### 認証情報を投げてアクセストークンをもらう
``` python
url = 'https://api.ce-cotoha.com/v1/oauth/accesstokens'
header = {
    'Content-Type':'application/json'
}
param = {
    'grantType': 'client_credentials',
    'clientId': conf['clientId'],
    'clientSecret': conf['clientSecret'],
}
res = requests.post(url=url, headers=header, data=json.dumps(param))
access_token = res['access_token']
```

### ヘッダにアクセストークンをつけてAPIを使う
#### キーワード抽出
``` python
url = 'https://api.ce-cotoha.com/api/dev/nlp/v1/keyword'
header = {
    'Content-Type' : 'application/json;charset=UTF-8',
    'Authorization' :  f"Bearer {access_token}",
}
param = {
    'document': [title],
    'type' : 'kuzure',
    'max_keyword_num' : 10,
}
res = requests.post(url=url, headers=header, data=json.dumps(param))
result = res['result']
```

#### 類似度算出
``` python
url = 'https://api.ce-cotoha.com/api/dev/nlp/v1/similarity'
header = {
    'Content-Type' : 'application/json;charset=UTF-8',
    'Authorization' :  f"Bearer {access_token}",
}
param = {
    's1': title,
    's2': story,
    'type' : 'kuzure',
}
res = requests.post(url=url, headers=header, data=json.dumps(param))
result = res['result']
```

# 結果
## 1. タイトルとあらすじから流行っているキーワードを抽出できるか？
- おおむね成功
    - プラス
        - （主観的に）納得すべきキーワードが挙がっている
            - 「スキル」「幼馴染」「追放」「異世界」「無双」「最強」「絶縁」「悪役令嬢」
    - グレー
        - 想像以上に偏りがない
            - 50件だけだから？
            - キーワードではなくニュアンスに傾向がある？
            - 定期的に集計を取り、統計を取れれば、増減の傾向で流行が判断できる？
    - マイナス
        - 一般名詞が入る
            - 「男」「彼」「彼女」など
            - ノイズを除去するブラックリストが必要？
        - 複合的な名詞の扱い
            - 「最強スローライフ」が一単語扱い
                - 「最強」「スローライフ」として欲しい
                - 名詞+名詞だから？
            - 「異世界転生」は一単語でOK
            - 既存のキーワードをフィードバックする？
                - 「異世界転生」のような複合単語はホワイトリストにする？
        - 暗黙の了解
            - 「異世界」「悪役令嬢」などの単語がない
            - タグやカテゴリがあるため、タイトルやあらすじに記載されない
                - これらの要素も集約する必要あり
            - どこにも記載されていないが、暗黙の了解になっている場合もある
                - どうしようもない
        - キーワード化されていないメタゲームに追従できない
            - ジャンルが単語化されてからでないと補足できない

## 2. 長文のタイトル＝あらすじの作品とタイトル≠あらすじの作品はどちらが上がりやすい？
### 傾向①：文章形式は類似度が高く、名詞形式は類似度が低い
```
"title": "剣聖の幼馴染がパワハラで俺につらく当たるので、絶縁して辺境で出直すことにした。",
"daily_point": 5468,
"score": 0.9695894
```
```
"title": "異世界料理道",
"daily_point": 574,
"score": 0.44519746
```

### 傾向②：ランキングは類似度の高い文章が多い
傾向①から言って、文章形式の作品が多いと思われる

### 結論：よくわからない
- よくわからない
    - 判断がつかない
        - 文章形式だから人気が上がりやすいのか
        - 単純に投稿小説の母数が文章形式の方が多いのか
    - 補正係数の可能性
        - 全小説の類似度算出を行うことで投稿小説における文章形式の割合を算出
        - 投稿日時から文章形式の増減傾向も算出
        - 母数の傾向から係数を取れば、判断は可能
    - そこまでしても「人気が出やすいタイトル」はわからない
        - とりあえずランキングは文章形式が多いので、文章形式が無難

# COTOHAについての感想
## 簡単に使える
- curlならコマンドプロンプトで秒で使える
- テストコードもコピペで動く

## エラーがわかりづらい
- 粒度が荒い
    - レスポンスステータス
    - エラーメッセージ
        - 幅広い範囲を同じエラーでカバーしている
            - アクセストークンが悪いの？
            - 文字数が多いの？

## 他のAPIとの組み合わせ
- レビューコメントに対するユーザ属性推定
- キーワード抽出からの自動タグ付与

など。このAPI単体で企画するよりメイン機能のサブとして発揮しそう。


[1]:https://api.ce-cotoha.com/contents/index.html
[2]:https://syosetu.com/
[3]:https://dev.syosetu.com/man/api/
[4]:https://github.com/ofbear/analysis_narou