COTOHA API 使ってみた(GitHubにコードもあるよ)

## 0. 関連記事

* [自然言語処理を簡単に扱えると噂のCOTOHA APIをPythonで使ってみた](https://qiita.com/gossy5454/items/83072418fb0c5f3e269f)
* [「メントスと囲碁の思い出」をCOTOHAさんに要約してもらった結果。COTOHA最速チュートリアル付き](https://qiita.com/youwht/items/16e67f4ada666e679875)

n番煎じ

## 1. 背景

~~[プレゼント企画](https://zine.qiita.com/event/collaboration-cotoha-api/) を知ったため.~~

個人的にテキスト解析を前々からやろうとは思っていたため, これを機に決意.
とはいえ, 調べてみると公式からの各種言語に対応したAPIは出されていなかった.([この記事](https://qiita.com/gossy5454/items/83072418fb0c5f3e269f) の作者さんの所属がNTTっぽいのでもしかしたらこれが公式説はあったりする)

そこで, 勉強がてら作ってみる.

[COTOHA API Portalへのリンク](https://api.ce-cotoha.com/)

## 2. 作成したAPIの説明

### 2.1 動作確認した環境

[requests](https://pypi.org/project/requests/)が必要です. 

#### windows

* Windows 10 Home
* Python 3.7.3

#### Linux

* Ubuntu 18.04.3 LTS
* Python 3.6.9

#### Mac

♰持ってない♰

### 2.2 Quick start

1. まず[COTOHA API for Developers](https://api.ce-cotoha.com/contents/developers/index.html)に無料登録
2. 以下のコマンドを実行

```shell
git clone https://github.com/tsuji-tomonori/cotohapy.git
cd cotohapy
pip install -r requirements.txt
# config.json の作成
python demo.py
# もし, python3 環境の場合
python3 demo.py
# action!
```

```config.json``` は以下のようになります.

```json
{
    "access_token_publish_url": "",
    "developer_api_base_url": "",
    "clientid": "",
    "clientsecret": ""
}
```

アカウントホームに行くと以下のページが出てくるため, それをもとに設定してください. 対応表を下につけておきます.

<img width="510" alt="key.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277804/5e2c8df8-4a74-4c48-d52c-df2cabffcb04.png">


### 2.3 使用方法

#### GitHub
```shell
git clone https://github.com/tsuji-tomonori/cotohapy.git
```

#### インポート

```python
from cotohapy3 import CotohaAPI
```

ライブラリーは「cotohapy3」の中にすべて入っています. ```CotohaAPI``` 以外にもクラスはありますが, それは後程...

#### [アクセストークン取得](https://api.ce-cotoha.com/contents/reference/accesstoken.html)

初めに必ず行ってください. 

```python
api = CotohaAPI(
    developer_api_base_url=developer_api_base_url, 
    access_token_publish_url=access_token_publish_url
)
api.login(clientid=clientid, clientsecret=clientsecret)
```

```python
def __init__(self, developer_api_base_url, access_token_publish_url)
```

| 引数                     | データ型 | 内容                     |
| ------------------------ | -------- | ------------------------ |
| developer_api_base_url   | str      | API Base URL             |
| access_token_publish_url | str      | Access Token Publish URL |

```python
def login(self, clientid, clientsecret)
```

| 引数         | データ型 | 内容          |
| ------------ | -------- | ------------- |
| clientid     | str      | Client ID     |
| clientsecret | str      | Client secret |

#### [構文解析](https://api.ce-cotoha.com/contents/reference/apireference.html): ```parse```

```python
# 実行例
api.parse("昨日母と銀座で焼き肉を食べた")
```

```python
def parse(self, sentence, **kwargs)
```

| 引数     | データ型 | 内容                                             |
| -------- | -------- | ------------------------------------------------ |
| sentence | str      | 解析対象文                                       |
| **kwargs |          | その他任意のパラメタ (公式リファレンスのAPI参照) |

#### 固有表現抽出: ```ne```

```python
# 実行例
api.ne("昨日は東京駅を利用した。")
```

````python
def ne(self, sentence, **kwargs)
````

| 引数     | データ型 | 内容                                             |
| -------- | -------- | ------------------------------------------------ |
| sentence | str      | 解析対象文                                       |
| **kwargs |          | その他任意のパラメタ (公式リファレンスのAPI参照) |

#### 照応解析: ```coreference```

```python
# 実行例
api.coreference("太郎は友人です。彼は焼き肉を食べた。")
```

```python
def coreference(self, document, **kwargs)
```

| 引数     | データ型   | 内容                                                         |
| -------- | ---------- | ------------------------------------------------------------ |
| document | str / list | 以下のどちらかの形式で指定<br />```str```: 解析対象の文<br />```list```: 解析対象の文集合 |
| **kwargs |            | その他任意のパラメタ (公式リファレンスのAPI参照)             |

#### キーワード抽出: ```keyword```

```python
# 実行例
api.keyword("レストランで昼食を食べた。")
```

```python
def keyword(self, document, **kwargs)
```

| 引数     | データ型   | 内容                                                         |
| -------- | ---------- | ------------------------------------------------------------ |
| document | str / list | 以下のどちらかの形式で指定<br />```str```: 解析対象の文<br />```list```: 解析対象の文集合 |
| **kwargs |            | その他任意のパラメタ (公式リファレンスのAPI参照)             |

#### 類似度計算: ```similarity```

```python
# 実行例
api.similarity("近くのレストランはどこですか？", "このあたりの定食屋はどこにありますか？")
```

```python
def similarity(self, s1, s2, **kwargs)
```

| 引数     | データ型 | 内容                                             |
| -------- | -------- | ------------------------------------------------ |
| s1       | str      | 類似度算出対象のテキスト                         |
| s2       | str      | 類似度算出対象のテキスト                         |
| **kwargs |          | その他任意のパラメタ (公式リファレンスのAPI参照) |

#### 文タイプ判定: ```sentence_type```

```python
# 実行例
api.sentence_type("あなたの名前は何ですか？")
```

```python
def sentence_type(self, sentence, **kwargs)
```

| 引数     | データ型 | 内容                                             |
| -------- | -------- | ------------------------------------------------ |
| sentence | str      | 解析対象文                                       |
| **kwargs |          | その他任意のパラメタ (公式リファレンスのAPI参照) |

#### ユーザー属性推定(β): ```user_attribute```

```python
# 実行例
api.user_attribute("私は昨日田町駅で飲みに行ったら奥さんに怒られた。")
```

```python
def user_attribute(self, document, **kwargs)
```

| 引数     | データ型   | 内容                                                         |
| -------- | ---------- | ------------------------------------------------------------ |
| document | str / list | 以下のどちらかの形式で指定<br />```str```: 解析対象の文<br />```list```: 解析対象の文集合 |
| **kwargs |            | その他任意のパラメタ (公式リファレンスのAPI参照)             |

#### 言い淀み除去(β): ```remove_filler```

```python
# 実行例
api.remove_filler(
    "えーーっと、あの、今日の打ち合わせでしたっけ。すみません、ちょっと、急用が入ってしまって。"
)
```

```python
def remove_filler(self, text, **kwargs)
```

| 引数     | データ型 | 内容                                             |
| -------- | -------- | ------------------------------------------------ |
| text     | str      | 解析対象テキスト                                 |
| **kwargs |          | その他任意のパラメタ (公式リファレンスのAPI参照) |

#### 音声認識誤り検知(β): ```detect_misrecognition```

```python
# 実行例
api.detect_misrecognition("温泉認識は誤りを起こす")
```

```python
def detect_misrecognition(self, sentence, **kwargs)
```

| 引数     | データ型 | 内容                      |
| -------- | -------- | ------------------------- |
| sentence | str      | 解析対象文                |
| **kwargs |          | 特になし(β版より念のため) |

#### 感情分析: ```sentiment```

```python
# 実行例
api.sentiment("人生の春を謳歌しています")
```

```python
def sentiment(self, sentence)
```

| 引数     | データ型 | 内容       |
| -------- | -------- | ---------- |
| sentence | str      | 解析対象文 |

#### 要約(β): ```summary```

```python
# 実行例
with open("summary.txt", "r", encoding="utf-8") as f:
    document = f.read()
api.summary(document, 1)
```

```summary.txt
前線が太平洋上に停滞しています。一方、高気圧が千島近海にあって、北日本から東日本をゆるやかに覆っています。関東地方は、晴れ時々曇り、ところにより雨となっています。東京は、湿った空気や前線の影響により、晴れ後曇りで、夜は雨となるでしょう。
```

```python
def summary(self, document, sent_len, **kwargs)
```

| 引数     | データ型 | 内容                      |
| -------- | -------- | ------------------------- |
| document | str      | 入力文章                  |
| sent_len | int      | 要約文数                  |
| **kwargs |          | 特になし(β版より念のため) |

## 3. 今後の予定

何か作ったやつを出したい

あるいは説明していない機能について説明したい

## 参考

[pixivpy](https://github.com/upbit/pixivpy)