pikesaku’s blog

個人的なプログラム勉強メモです。記載内容について一切の責任は持ちません。

Natural Language API の基本メモ(analyzeEntitiesメソッド)

インプットテキスト

AIスピーカー「アレクサ」に潜む弱点 部屋に侵入される恐れも - ライブドアニュース

アマゾンのAIスピーカー「エコー(アレクサ)」の発売以来、急速に人気が高まってきたスマート・デバイスの音声操作機能。だが、最近そこに思わぬセキュリティ・ホールが発見された。
私たち人間には聞き取れないが、機械にだけは聞き取れるサブリミナル・メッセージを音声や音楽などに忍ばせることで、スマホAIスピーカーを外部の第三者が自由自在に操れるというのだ。
このショッキングな研究成果を発表したのは、米カリフォルニア大学バークレイ校の科学者チーム。彼らは録音された音声メッセージや音楽に巧妙な命令を忍ばせ、これをユーチューブなどから流すことで、AIスピーカーのようなスマート・デバイスを秘かに操作することに成功した。
これにより本来の利用者がスマート・デバイスの電源を入れた状態で音楽を聴いたり、動画を見たりしている間に、(自分のアカウントを通じて)悪意を持った第三者から勝手にオンライン・ショッピングをされたり、自分のお金をどこかに送金されたり、甚だしい場合にはドアのロックを外されて部屋に侵入されたりする恐れが出てきたという。

 

サンプルコード


実行結果


Natural Language API の基本メモ(analyzeSentimentメソッド)

インプットテキスト

AIスピーカー「アレクサ」に潜む弱点 部屋に侵入される恐れも - ライブドアニュース

アマゾンのAIスピーカー「エコー(アレクサ)」の発売以来、急速に人気が高まってきたスマート・デバイスの音声操作機能。だが、最近そこに思わぬセキュリティ・ホールが発見された。
私たち人間には聞き取れないが、機械にだけは聞き取れるサブリミナル・メッセージを音声や音楽などに忍ばせることで、スマホAIスピーカーを外部の第三者が自由自在に操れるというのだ。
このショッキングな研究成果を発表したのは、米カリフォルニア大学バークレイ校の科学者チーム。彼らは録音された音声メッセージや音楽に巧妙な命令を忍ばせ、これをユーチューブなどから流すことで、AIスピーカーのようなスマート・デバイスを秘かに操作することに成功した。
これにより本来の利用者がスマート・デバイスの電源を入れた状態で音楽を聴いたり、動画を見たりしている間に、(自分のアカウントを通じて)悪意を持った第三者から勝手にオンライン・ショッピングをされたり、自分のお金をどこかに送金されたり、甚だしい場合にはドアのロックを外されて部屋に侵入されたりする恐れが出てきたという。

 

サンプルコード

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

import argparse
import sys

from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types
import six


def sentiment_text(text):
    """Detects sentiment in the text."""
    client = language.LanguageServiceClient()

    if isinstance(text, six.binary_type):
        text = text.decode('utf-8')

    # Instantiates a plain text document.
    document = types.Document(
        content=text,
        type=enums.Document.Type.PLAIN_TEXT)

    # Detects sentiment in the document. You can also analyze HTML with:
    #   document.type == enums.Document.Type.HTML

    sentiment = client.analyze_sentiment(document).document_sentiment
    print('AnalyzeSentiment -------------------------------------')
    print('')
    print(' [全体結果]')
    print(' Score:     {}'.format(sentiment.score))
    print(' Magnitude: {}'.format(sentiment.magnitude))
    print('')

    print(' [文単位結果]')
    sentiment = client.analyze_sentiment(document).sentences
    for line in sentiment:
        print(' Sentence:  {}'.format(line.text.content.encode('utf-8')))
        print(' Score:     {}'.format(line.sentiment.score))
        print(' Magnitude: {}'.format(line.sentiment.magnitude))
        print('')


def main():
    text = 'アマゾンのAIスピーカー「エコー(アレクサ)」の発売以来、急速に人気が高まってきたスマート・デバイスの音声操作機能。だが、最近そこに思わぬセキュリティ・ホールが発見された。私たち人間には聞き取れないが、機械にだけは聞き取れるサブリミナル・メッセージを音声や音楽などに忍ばせることで、スマホやAIスピーカーを外部の第三者が自由自在に操れるというのだ。このショッキングな研究成果を発表したのは、米カリフォルニア大学バークレイ校の科学者チーム。彼らは録音された音声メッセージや音楽に巧妙な命令を忍ばせ、これをユーチューブなどから流すことで、AIスピーカーのようなスマート・デバイスを秘かに操作することに成功した。これにより本来の利用者がスマート・デバイスの電源を入れた状態で音楽を聴いたり、動画を見たりしている間に、(自分のアカウントを通じて)悪意を持った第三者から勝手にオンライン・ショッピングをされたり、自分のお金をどこかに送金されたり、甚だしい場合にはドアのロックを外されて部屋に侵入されたりする恐れが出てきたという。'
    sentiment_text(text)


main()

実行結果

AnalyzeSentiment -------------------------------------

 [全体結果]
 Score:     -0.20000000298
 Magnitude: 3.0

 [文単位結果]
 Sentence:  アマゾンのAIスピーカー「エコー(アレクサ)」の発売以来、急速に人気が高まってきたスマート・デバイスの音声操作機能。
 Score:     -0.5
 Magnitude: 0.5

 Sentence:  だが、最近そこに思わぬセキュリティ・ホールが発見された。
 Score:     0.10000000149
 Magnitude: 0.10000000149

 Sentence:  私たち人間には聞き取れないが、機械にだけは聞き取れるサブリミナル・メッセージを音声や音楽などに忍ばせることで、スマホやAIスピーカーを外部の第三者が自由自在に操れるというのだ。
 Score:     -0.20000000298
 Magnitude: 0.20000000298

 Sentence:  このショッキングな研究成果を発表したのは、米カリフォルニア大学バークレイ校の科学者チーム。
 Score:     0.40000000596
 Magnitude: 0.40000000596

 Sentence:  彼らは録音された音声メッセージや音楽に巧妙な命令を忍ばせ、これをユーチューブなどから流すことで、AIスピーカーのようなスマート・デバイスを秘かに操作することに成功した。
 Score:     -0.699999988079
 Magnitude: 0.699999988079

 Sentence:  これにより本来の利用者がスマート・デバイスの電源を入れた状態で音楽を聴いたり、動画を見たりしている間に、(自分のアカウントを通じて)悪意を持った第三者から勝手にオンライン・ショッピングをされたり、自分のお金をどこかに送金されたり、甚だしい場合にはドアのロックを外されて部屋に侵入されたりする恐れが出てきたという。
 Score:     -0.800000011921
 Magnitude: 0.800000011921

Natural Language API の基本メモ

特徴

テキスト分析・アノテーション(※1)付与するメソッドがあり
分析結果より言語理解のための情報が得られる
※1 データに注釈となる情報をメタデータとして追加すること、あるいは、追加されたメタデータのこと。
 アノテーションとは - IT用語辞典 Weblio辞書

機能 メソッド 出力
感情分析 analyzeSentiment 感情分析結果。ポジティブ or ネガティブ or ニュートラ
エンティティ分析 analyzeEntities 既知のエンティティ(著名人、地名などの固有名詞、レストラン、競技場などの普通名詞)に関する情報
エンティティ感情分析 analyzeEntitySentiment 抽出したエンティティに対する感情分析結果
構文解析 analyzeSyntax 品詞(動詞・形容詞・名詞等)分解結果
コンテンツ分類 classifyText カテゴリ

 

感情分析API(analyzeSentimentメソッド)

APIレスポンス概要

項目 説明
score -1.0(ネガティブ)~1.0(ポジティブ)
magnitude 感情の強度(ポジティブとネガティブの両方)が 0.0~+inf

 
magnitudeは感情が表現される度に数値アップ。文章が長い程、高スコアになる傾向あり。
scoreは相対算出。ネガティブ・ポジティブが混在するドキュメントは相殺される。
混在と無感情ドキュメントの区別にmagnitudeを利用。
混在 -> magnitude数値高い
無感情 -> magnitude数値低い
ドキュメントの感情比較する際は、scoreをmagnitudeで調整して算出する。

f:id:pikesaku:20180520083933p:plain

レスポンスにはリクエストしたドキュメント全体と文章単位の上記値が含まれる。
 

感情分析API(analyzeEntitiesメソッド)

APIレスポンス概要

項目 説明
entity 名詞 or 固有名詞の文字列
type タイプ。人物 or 場所 or 消費財
metadata 知識レポジトリ情報。Wiki URL等
salience ドキュメントにおける重要度。0.0(低)〜1.0(高)
mentions ドキュメント内の出現位置、使われ方(固有名詞or普通名詞)

 
typeで類似のentityを区別可能。例)「Lawrence of Arabia」(映画)と「T.E. Lawrence」(人物)
metadataは随時情報追加される
salienceは要約に利用可能
mentionsに使われ方の2つのタイプ情報あり。PROPER(固有名詞)、COMMON(普通名詞)
 

感情分析API(analyzeEntitySentimentメソッド)

APIレスポンス概要

analyzeSentimentとanalyzeEntitiesの情報を統合したもの。
 

構文解析API(analyzeSyntaxメソッド)

APIレスポンス概要

sentences(文抽出)とtokens(品詞抽出)の2つあり。それぞれが以下の情報を持つ。
 
sentences

項目 説明
content 抽出された文章
beginOffset ドキュメント内の開始位置

 
tokens

項目 説明
content 抽出された文章
beginOffset ドキュメント内の開始位置

Natural Language API Client Librariesを使う!

参考

cloud.google.com
 

作業の流れ

Cloud Shellでも認証設定必要だった。。。gcloudコマンドは認証設定なしで動いたのに。

①アカウント作成

f:id:pikesaku:20180519102101p:plain
 
f:id:pikesaku:20180519102249p:plain
 

JSONファイルダウンロード

 

③Cloud ShellにJSONファイルをアップロードし以下環境変数にファイルパス設定

export GOOGLE_APPLICATION_CREDENTIALS=/home/pike/hoge.json

 

④サンプルコード実行

a.py

# Imports the Google Cloud client library
from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types
# Instantiates a client
client = language.LanguageServiceClient()
# The text to analyze
text = u'Hello, world!'
document = types.Document(
    content=text,
    type=enums.Document.Type.PLAIN_TEXT)
# Detects the sentiment of the text
sentiment = client.analyze_sentiment(document=document).document_sentiment
print('Text: {}'.format(text))
print('Sentiment: {}, {}'.format(sentiment.score, sentiment.magnitude))

 

$ python ./a.py
Text: Hello, world!
Sentiment: 0.300000011921, 0.300000011921
$

 
サービスアカウント設定しないとコード実行時に以下エラーになる。

Traceback (most recent call last):
  File "./a.py", line 16, in <module>
    sentiment = client.analyze_sentiment(document=document).document_sentiment
  File "/usr/local/lib/python2.7/dist-packages/google/cloud/language_v1/gapic/language_service_client.py", line 180, in analyze_sentiment
    return self._analyze_sentiment(request, retry=retry, timeout=timeout)
  File "/usr/local/lib/python2.7/dist-packages/google/api_core/gapic_v1/method.py", line 139, in __call__
    return wrapped_func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/google/api_core/retry.py", line 260, in retry_wrapped_func
    on_error=on_error,
  File "/usr/local/lib/python2.7/dist-packages/google/api_core/retry.py", line 177, in retry_target
    return target()
  File "/usr/local/lib/python2.7/dist-packages/google/api_core/timeout.py", line 206, in func_with_timeout
    return func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/google/api_core/grpc_helpers.py", line 56, in error_remapped_callable
    six.raise_from(exceptions.from_grpc_error(exc), exc)
  File "/usr/local/lib/python2.7/dist-packages/six.py", line 737, in raise_from
    raise value
google.api_core.exceptions.PermissionDenied: 403 Cloud Natural Language API has not been used in project 618104708054 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/
language.googleapis.com/overview?project=618104708054 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

Google Natural Language API をやってみる!

API実行方法は2方法あり

①PCにCloud SDKインストールし、gcloudコマンド実行
②Cloud Shellから実行
Cloud ShellはAPI認証設定済み。こちらを使う。
 
 

作業の流れは以下

②Cloud Natural Language API 有効化

f:id:pikesaku:20180519090523p:plain
f:id:pikesaku:20180519090533p:plain
 

③Cloud ShellでサンプルAPI実行

f:id:pikesaku:20180519090612p:plain
f:id:pikesaku:20180519090627p:plain

pyenv環境でバージョン指定する時

やり方

pyenv global 2.7.X

自然言語の要約をためす

目的

勉強で参考にしたページの要約をしたい。
 

環境構築

環境: Mac High Sierra

1. pythonをv2.7にする
2. pipで以下パッケージをインストール
numpy
scipy
scikit-learn
networkx
cherrypy
janome
pulp
Mecabはpipでエラーが出たため、janome選択
 

実行方法について

サーバ起動しWebリクエストする方法とPython APIの2つの方法あり。両方やってみる。
 

Webリクエスト実行

$ python -m summpy.server -h 127.0.0.1 -p 8080

 

ソース

# -*- coding: utf-8 -*-
import requests

params = dict()
params['sent_limit'] = 1
#params['char_limit'] = 15
params['text'] = "レアル・マドリーのジネディーヌ・ジダン監督は、パリ・サンジェルマンのブラジル代表FWネイマールの獲得が噂される件について、交渉が行われているかどうかは知らないと主張している。"
params['text'] += "11日の会見でのコメントをスペイン紙マルカなどが伝えた。"
params['text'] += "ネイマールのマドリー移籍に向けた報道は、ここ数日再び勢いを増している。"
#params['text'] += "負傷の療養のためブラジルに帰国していたネイマールにマドリー関係者が接触していたとの話や、ネイマールの父親が水面下で仲介役と接触したとの話もある。"
#params['text'] += "会見でネイマール獲得の噂について質問を受けたジダン監督は、「私は何も言う立場にはない」と返答。"
#params['text'] += "「交渉が行われているのかどうかは知らないし、私からは要請していない。"
#params['text'] += "良い形でシーズンを終えることに集中したい。その後のことはそれからだ」と語った。"
#params['text'] += "だが、もしネイマールが加入したとすれば、エースのFWクリスティアーノ・ロナウドと共存することは可能だという考えも述べている。"
#params['text'] += "「良い選手たちはいつも共存可能なものだ。私もジョルカエフと共存できないと言われていた。ピッチ外ではどうだか分からないが、ピッチ上では融合できる」と自身の現役時代を引き合いに出した。"
#params['text'] += "チームはチャンピオンズリーグ決勝を2週間後に控えているが、ネイマール加入の噂が影響することはないと主張。"
#params['text'] += "「そういう移籍の話がいつもあることは選手たちも分かっている。我々は決勝だけに集中している。ネイマールの話に乱されることはない」と語った。"
#print(params['text'])

url = 'http://127.0.0.1:8080/summarize'
r = requests.get(url, params=params)
print(r.content)

 

実行結果

{
  "debug_info": {}, 
  "summary": [
    "レアル・マドリーのジネディーヌ・ジダン監督は、パリ・サンジェルマンのブラジル代表FWネイマールの獲得が噂される件について、交渉が行われているかどうかは知らないと主張している。"
  ]
}

 
む〜1行目がそのままでただけ。
使い方がわからない。。。。。4行目を追加するとエラーになる。

{
  "error": "add_edge() takes exactly 3 arguments (4 given)"
}

 

Python API

ソース

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

from summpy.lexrank import summarize

text = 'レアル・マドリーのジネディーヌ・ジダン監督は、パリ・サンジェルマンのブラジル代表FWネイマールの獲得が噂される件について、交渉が行われているかどうかは知らないと主張している。'
text += '11日の会見でのコメントをスペイン紙マルカなどが伝えた。'
#text += 'ネイマールのマドリー移籍に向けた報道は、ここ数日再び勢いを増している。'
#text += "負傷の療養のためブラジルに帰国していたネイマールにマドリー関係者が接触していたとの話や、ネイマールの父親が水面下で仲介役と接触したとの話もある。"
#text += "会見でネイマール獲得の噂について質問を受けたジダン監督は、「私は何も言う立場にはない」と返答。"
#text += "「交渉が行われているのかどうかは知らないし、私からは要請していない。"
#text += "良い形でシーズンを終えることに集中したい。その後のことはそれからだ」と語った。"
#text += "だが、もしネイマールが加入したとすれば、エースのFWクリスティアーノ・ロナウドと共存することは可能だという考えも述べている。"
#text += "「良い選手たちはいつも共存可能なものだ。私もジョルカエフと共存できないと言われていた。ピッチ外ではどうだか分からないが、ピッチ上では融合できる」と自身の現役時代を引き合いに出した。"
#text += "チームはチャンピオンズリーグ決勝を2週間後に控えているが、ネイマール加入の噂が影響することはないと主張。"
#text += "「そういう移籍の話がいつもあることは選手たちも分かっている。我々は決勝だけに集中している。ネイマールの話に乱されることはない」と語った。"

text = unicode(text, encoding='utf-8')
# ensure type(text) is unicode
sentences, debug_info = summarize(
    text, sent_limit=5, continuous=True, debug=True
)

for sent in sentences:
    print sent.strip().encode('utf-8')# -*- coding: utf-8 -*-

 

実行結果

レアル・マドリーのジネディーヌ・ジダン監督は、パリ・サンジェルマンのブラジル代表FWネイマールの獲得が噂される件について、交渉が行われているかどうかは知らないと主張している。
11日の会見でのコメントをスペイン紙マルカなどが伝えた。

 
む〜よくわからない。使い方が間違ってるのだろう。。。