Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
77
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@kazuhirokomoda

自然言語処理をはじめたい人のためのゆるい記事

自然言語処理

自然言語処理(しぜんげんごしょり、英語: natural language processing、略称:NLP)は、人間が日常的に使っている自然言語をコンピュータに処理させる一連の技術であり、人工知能と言語学の一分野である。

Wikipedia 自然言語処理

ここ数年で(もっと前から?)、Googleで検索した時に
Wikipediaの説明が四角い枠の中に表示されるようになりましたが、
あれも「Wikipediaから重要そうなところを抽出する」という意味で、
自然言語処理の一種と考えられます。
(ちなみに「文章の第一文を抽出する」のは、
ニュースや報告文などの要約タスクではよく知られた経験則です。)

API

自然言語処理は奥が深くて、具体的な処理を自分で実装するのも楽しいのですが、
そうでなくても手軽に使えるAPIがあるようなので、
今回はそれを紹介してみます。

gooラボAPI

https://labs.goo.ne.jp/api/

supported by goo

なんかいろいろある。

  • 商品評判要約API (Product Review Summarization API)
  • 形態素解析API (Morphological Analysis API)
  • 固有表現抽出API (Japanese named entity extraction API)
  • 語句類似度算出API (Japanese word similarity API)
  • ひらがな化API (Japanese hiragana conversion API)
  • ...

いくつか試してみる

POSTリクエストを送ってください、ということだったので、
方法は何でも構わないのですが、今回はpythonで試します。

# -*- coding: utf-8 -*-

import json
import requests

# goo
# Overview: Japanese Word Similarity API
app_id = #ID you get when registration

url_shortsum = "https://labs.goo.ne.jp/api/shortsum"
url_entity = "https://labs.goo.ne.jp/api/entity"
url_similarity = "https://labs.goo.ne.jp/api/similarity"


def shortsum(length, review_list, request_id="record001"):
    # shortsum API interface: https://labs.goo.ne.jp/api/2015/1150/
    payload = {"app_id": app_id, "request_id": request_id, "length": length, "review_list": review_list}
    headers = {'content-type': 'application/json'}
    r = requests.post(url_shortsum, data=json.dumps(payload), headers=headers)
    print r.text

def entity(sentence, class_filter, request_id="record002"):
    # entity API interface: https://labs.goo.ne.jp/api/2015/336/
    # “ORG”(organization name), “PSN”(person name), “LOC”(location name), “DAT”(date expression) and “TIM”(time expression)
    payload = {"app_id": app_id, "request_id": request_id, "sentence": sentence, "class_filter": class_filter}
    headers = {'content-type': 'application/json'}
    r = requests.post(url_entity, data=json.dumps(payload), headers=headers)
    print r.text

def similarity(word1, word2, request_id="record003"):
    # similarity API interface: https://labs.goo.ne.jp/api/2015/330/
    payload = {"app_id": app_id, "request_id": request_id, "query_pair": [word1, word2]}
    headers = {'content-type': 'application/json'}
    r = requests.post(url_similarity, data=json.dumps(payload), headers=headers)
    print r.text


if __name__ == '__main__':

    shortsum(120, [
        "以前にも購入しているので、こちらのスムージーはフルーティな味でとても美味しいです。今回はお安く購入できたのでお得でした。こちらのスムージーは飲みやすくて、マンゴー味が飽きがこなくて爽やかなのでまたリピートしたいです。",
        "待ちに待ったグリーンスムージーが届きました。牛乳も豆乳も嫌いなので、水180ccで割って飲みました、思っていたほど全然青臭くなくて、マンゴーの味もかすかで美味しくはありませんでした。もっと濃厚なものを想像していましたが、水割りのせいかかなり薄いです。常温で飲んだ方が良いらしいのですが、氷で割りたかったです。水割りのせいか腹持ち感はまるでなく、一食置き換えは無理みたいです。個人的には身体に酵素を取り入れたかったのですが…知人に購入したことを話したところ以下のような意見を頂きました。「代謝酵素と消化酵素は全く違います。スムージーは消化の助けにはなるかも?ですが、代謝酵素としては無理なのです。まず胃で分解されます、なので必要なところには行きません。」さて、効果のほどはどうなのでしょう?酵素を取り入れたい私です。"
        ]
    )
    entity("山下さんは明日の10時30分に新潟に行きます。", "ORG|PSN|LOC|DAT")
    similarity("のれん", "セールスマン")

requests.post(引数)でPOSTリクエストを送ります。
商品評判要約APIには、某通販サイトの商品からレビューを、2つほど突っ込んでみます。

実行結果

(agile_env)nlp $ python test.py
{"request_id":"record001","length":60,"summary":"以前にも購入しているので、こちらのスムージーはフルーティな味でとても美味しいです。今回はお安く購入できたのでお得でした。"}
{"request_id":"record002","class_filter":"ORG|PSN|LOC|DAT","ne_list":[["山下","PSN"],["明日","DAT"],["新潟","LOC"]]}
{"request_id":"record003","score":0.4345982085070782}
(agile_env)nlp $ 
(agile_env)nlp $ 
(agile_env)nlp $ 
(agile_env)nlp $ python test.py
{"request_id":"record001","length":120,"summary":"今回はお安く購入できたのでお得でした。牛乳も豆乳も嫌いなので、水180ccで割って飲みました、思っていたほど全然青臭くなくて、マンゴーの味もかすかで美味しくはありませんでした。常温で飲んだ方が良いらしいのですが、氷で割りたかったです。"}
{"request_id":"record002","class_filter":"ORG|PSN|LOC|DAT","ne_list":[["山下","PSN"],["明日","DAT"],["新潟","LOC"]]}
{"request_id":"record003","score":0.4345982085070782}

"length":60
は、レビューから作成する要約文の長さ(文字)です。
2件で何か傾向が分かる感じではないですが、
文字数を増やすと、その分ディテールも含まれるのが分かります。
あとは、60文字でも120文字でも「お値打ち感」が伝わってくる。

「のれん」「セールスマン」は、
謎かけに使われてる2つの単語の類似度を見たら面白そうだなと。

感情分析

“感情分析”から広がる「ヤフー リアルタイム検索」の可能性--開発チームに聞く
の記事にもあるように、

与えられたキーワードに対して
どのような感情を持っているかをポジティブ/ネガティブ(ポジネガ)で判定する
ような分析が主流のようです。

難しさ

このツイートは、"Anitube閉鎖"というキーワードに対して
「ポジティブ」なのか「ネガティブ」なのか。

感情分析.png

ディープラーニング

トピックス:メール自動返信

最近、Googleから、ちょっと夢が広がるテクノロジーが紹介されました。
Computer, respond to this email.

そしてさらに最近、そうしたテクノロジー開発の基盤となったアルゴリズムを
外部からも使えるようOSSとして公開。
Google releases TensorFlow: Search giant makes its artificial intelligence software available to the public

TensorFlow Get Started

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
77
Help us understand the problem. What are the problem?