都内の大学に通う者です。大学に入学してから一年、プログラミングを始めてから7ヶ月が経とうとしています。普段は友人とアプリを作ったり機械学習のコンペに参加したりしています。
昨日【Qiita x COTOHA APIプレゼント企画】というイベントを知りました。
Macが欲しいので、入賞目指して、初めての記事を書きます。(今日が締め切りですが...)
大学のレポートがめんどくさい
大学では多くのレポートを課されます。これはとても苦痛なイベントです。
うまくすり抜けられないか
楽にすます方法としては、人のレポートをパクるということが挙げられます。しかし、一言一句パクれば流石にバレます。そこで、レポートの内容をそのままに表現だけを変えられないか、と考えました。
題材
今回は以下のような文章(先月書いたレポートの一部)をパクろうと思います。
パクりたいと思うほど上手な文章ではないですね... 「また」が多いし...
ルール
- 『』の中の言葉は変えない。(書籍やホームページの名前なので)
- 地名や人物名、組織名は変えない。
- 数字は変えない。
それっぽいロジックを作る
類語辞典やGCPなどを使って、元の表現を少しずついじります。
その結果がこれです。
所々表現が変わっています。
三つ目のルールは守られていますが、「国立社会保障・人口問題研究所」が「全国人口社会保障研究所」に変わってしまいました。人物名や組織名に対応できていません。
COTOHA APIを使う。
満を持してCOTOHA APIの登場です。
COTOHA APIのリンク
COTOHA APIは「構文解析、照応解析、キーワード抽出、音声認識、要約など、様々な自然言語処理・音声処理APIを提供しているサービスです。NTTグループの40年にわたる研究成果である、日本語辞書や単語を3000種以上の意味性分類する技術などを活用し、高度な解析をAPIで手軽に利用できます。」
この優れたAPIの中で、今回は固有表現抽出APIを使用して、人物名や組織名を判定します。
COTOHA APIの無料枠に登録
ここから簡単に登録できます。
登録したらここでAPI BASE URL、 CLIENT ID、 CLIENT secretを確認します。
data = {
"grantType": "client_credentials",
"clientId": "Your CLIENT ID",
"clientSecret": "Your CLIENT secret"
}
str_json = json.dumps(data)
url = "https://api.ce-cotoha.com/v1/oauth/accesstokens"
headers={
"Content-Type": "application/json"
}
result=requests.post(url,headers=headers,data=str_json)
print(result.text)
これでアクセストークンを確認できます。
def get_koyu_(text, token):
data = {
"sentence":text,
"type": "default"
}
headers = {
"Content-Type":"application/json",
"Authorization":"Bearer " + token
}
str_json = json.dumps(data)
url = "https://api.ce-cotoha.com/api/dev/nlp/v1/ne"
rr=requests.post(url,headers=headers,data=str_json)
result = json.loads(rr.text)["result"]
上のコードで文中の固有表現を抽出できます。
[{'begin_pos': 3, 'end_pos': 8, 'form': '厚生労働省', 'std_form': '厚生労働省', 'class': 'ORG', 'extended_class': '', 'source': 'basic'}, {'begin_pos': 42, 'end_pos': 47, 'form': '平成29年', 'std_form': '平成29年', 'class': 'DAT', 'extended_class': '', 'source': 'basic'}, {'begin_pos': 84, 'end_pos': 88, 'form': '50年後', 'std_form': '50年後', 'class': 'DAT', 'extended_class': '', 'source': 'basic'}, {'begin_pos': 156, 'end_pos': 170, 'form': '国立社会保障・人口問題研究所', 'std_form': '国立社会保障・人口問題研究所', 'class': 'ORG', 'extended_class': '', 'source': 'basic'},...
地名、人名、組織名などのカテゴリがふられているので、これらを頼りに地名、人名、組織名を判定します。
あとはこれらの固有表現を変えないようにコードを書き換えます。
完成
パクる前
パクった後
『』の中の言葉や、組織名はそのままに、表現だけが変わっています。微妙な部分もありますが、とりあえずよしとします。
実際に完成したアプリがこちらです。