GCPの「Natural Language API」を試してみた
概要
GCPにおける自然言語系機械学習サービスである、Natural Languageについて調べました。
また、日本語の対応状況を調べ、「日本語対応しているサービス(コンテンツ分類以外)」については、実際に操作してみました。
GCPにおける自然言語サービスの日本語対応状況について調べてみたい、という方の参考になれば幸いです。
目次
- 「Natural Language」について
- 「Natural Language API」について
- 「感情分析」をやってみた
- 「エンティティ分析」をやってみた
- 「エンティティ感情分析」をやってみた
- 「構文解析」をやってみた
- まとめ
「Natural Language」について
「Natural Language」は「AutoML Natural Language」、「Natural Language API」の2つのサービスからなり、それぞれ特徴があります。
それぞれのサービスの違いについてはこちらの「最適な Natural Language サービスを選ぶ」に整理されていました。
(下記は2019年7月31日時点の記述内容を転載したものです)
AutoML Natural Language | Natural Language API | |
---|---|---|
統合された REST API Natural Language は REST API でアクセス可能です。テキストをリクエストにアップロードしたり、Google Cloud Storage と統合したりできます。 |
☑ | ☑ |
構文解析 トークンと文の抽出、品詞の特定、各文の係り受け解析ツリーの作成が可能です。 |
☑ | |
エンティティ分析 ドキュメント(領収書、請求書、契約書など)の中のエンティティを識別し、ラベル(日付、人、連絡先情報、組織、場所、イベント、商品、メディアなど)を付けることができます。 |
☑ | |
カスタム エンティティの抽出 ドキュメント内のエンティティを識別し、各自のドメイン固有のキーワードやフレーズに基づいてラベル付けできます。 |
☑(ベータ版) | |
感情分析 テキストのブロック内で示されている全体的な意見、感想、態度の感情を読み取ることができます。 |
☑ | |
カスタム感情分析 各自のドメイン固有の感情スコアに合わせて、テキストのブロック内で示されている全体的な意見、感想、態度を読み取ることができます。 |
☑(ベータ版) | |
コンテンツの分類 事前定義された 700 以上のカテゴリでドキュメントを分類できます。 |
☑ | |
カスタム コンテンツの分類 ラベルを作成すると、各自のトレーニング データを使用して、独自のユースケースに対応したモデルをカスタマイズできます。 |
☑(ベータ版) | |
多言語 さまざまな言語のテキストを簡単に分析できます。英語、スペイン語、日本語、中国語(簡体字、繁体字)、フランス語、ドイツ語、イタリア語、韓国語、ポルトガル語、ロシア語に対応しています。 |
☑ | |
カスタムモデル 最小限の労力と機械学習の専門知識で、カスタム機械学習モデルをトレーニングできます。 |
☑ | |
Google の AutoML モデルを利用 Google の最先端 AutoML テクノロジーを活用して、高品質モデルを生成します。 |
☑ |
上記の整理を見てもわかる通り、「AutoML Natural Language」は、「カスタムモデルを学習させる」ことができるサービスのようです。
AutoML Natural Language を利用し、最小限の労力と機械学習の専門知識で高品質な独自のカスタム機械学習モデルをトレーニングすることで、感情の分類、抽出、検出ができます。AutoML Natural Language UI を使用し、トレーニング データをアップロードしてカスタムモデルをテストできます。
また、「Natural Language API」は事前に学習しておいたモデルに対してAPIベースでリクエストできるサービスのようです。
Natural Language API の強力な事前トレーニング済みモデルにより、デベロッパーは感情分析、エンティティ分析、エンティティ感情分析、コンテンツ分類、構文分析などの自然言語理解の機能を操作できます。
手軽に試すなら「Natural Language API」を利用し、それでも課題を解決できないようなら「AutoML Natural Language」を使ってカスタムモデルを作成する、と使い分けていくと良さそうです。
「Natural Language API」について
「Natural Language API」では「感情分析」、「エンティティ分析」、「エンティティ感情分析」、「コンテンツ分類」、「構文分析」を利用することができます。
各分析内容については、下記の通りです。
分析項目 | 分析内容の概要 | ざっくりどんな分析か | 詳細はこちら |
---|---|---|---|
感情分析 | 文章が「ポジティブ」か、「ネガティブ」か、「ニュートラル」か、を分類 | 「score」、「magnitude」の2つの数値を返却するので、この数値とタスクの目的から「閾値」等を決めてポジティブかネガティブかニュートラルなのかを判断させる | 感情分析 |
エンティティ分析 | 指定されたテキストに既知のエンティティ(著名人、ランドマークなどの固有名詞、レストラン、競技場などの普通名詞)が含まれているかどうかを調べて、そのエンティティに関する情報を返します。 | 「どんな単語(name)」が「どんなタイプ(type)」であり、「文章中でどのくらい重要か(salience)」ということを分析する | エンティティ分析 |
エンティティ感情分析 | 指定されたテキストに既知のエンティティ(固有名詞や普通名詞)が含まれているかどうかを調べて、そのエンティティに関する情報を返し、そのテキスト内でのそのエンティティの感情的な考え方を分析します。また、そのエンティティに対する執筆者の考え方がポジティブか、ネガティブか、ニュートラルかを判断します。 | 「感情分析」と「エンティティ分析」を組み合わせたもの。 | エンティティ感情分析 |
構文解析 | 言語情報を抽出し、指定されたテキストを一連の文とトークン(通常は単語の境界)に分解して、それらのトークンをさらに分析できるようにします。 | 文章中の単語の品詞や修飾関係、lemma等を分析する | 構文解析 |
コンテンツ分類 | テキストをコンテンツカテゴリに分類。カテゴリ一覧はこちら | テキストがどんなカテゴリに属していそうか、を分類する | コンテンツ分類 |
日本語がどこまで対応されているか、といった点が気になりますが、こちらを確認すると、「コンテンツの分類」以外は全て日本語対応していました。
(2019年7月31日時点)
また、料金体系についてはこちらに記述してありました。
まず、「Natural Language API」の料金を計算するにあたっては「リクエスト数」、「文章中の文字数(Unicode文字)」、「月単位での計算」という3点を意識する必要があります。
「文章中の文字数」については、「1,000文字で1Unit」として計算する必要があります。
たとえば、Natural Language API に送信する 3 件のリクエストそれぞれに、800 文字、1,500 文字、600 文字が含まれている場合、1 番目のリクエスト(800)が 1 ユニット、2 番目のリクエスト(1,500)が 2 ユニット、3 番目のリクエスト(600)が 1 ユニット、合計 4 ユニットとして課金されます。
参照:単価
下記に、月&Units数ごとの1,000Units単価について転記しておきます。 (2019年7月31日時点)
例えば、感情分析を月に7,000Units実行した場合は「1,000Units」ごとに$1かかるので合計$7、2,000,000Units実行した場合は「1,000Units」ごとに$0.5かかるので合計$1,000、という計算です。
機能 | 0~5,000 | 5,000~1,000,000 | 1,000,000~5,000,000 | 5,000,000~20,000,000 |
---|---|---|---|---|
エンティティ分析 | 無料 | $1.00 | $0.50 | $0.25 |
感情分析 | 無料 | $1.00 | $0.50 | $0.25 |
構文解析 | 無料 | $0.50 | $0.25 | $0.125 |
エンティティ感情分析 | 無料 | $2.00 | $1.00 | $0.50 |
機能 | 0~30,000 | 30,000~250,000 | 250,000~5,000,000 | 5,000,000~ |
---|---|---|---|---|
コンテンツの分類 | 無料 | $2.00 | $0.50 | $0.10 |
参照:月額料金
Units数が多くなりすぎそうな場合は、GCPの営業担当者に連絡する必要があるようです。
1 つのプロジェクトで 2,000 万ユニット/月(コンテンツ分類では 500 万ユニット/月)を超える場合は、お客様のニーズをお知らせください。必要に応じて、カスタム ソリューションを構築することもできます。上限を超える分量を希望する場合は、料金について営業担当者にお問い合わせください。
参照:料金
「感情分析」をやってみた
ここからは日本語対応されている物(つまり「コンテンツ分類」以外)を対象として、各APIを実際に操作してみようと思います。
(基本的に、公開されているPythonのサンプルスクリプトベース)
まずは「感情分析」について、クイックスタートのPythonのサンプルスクリプトを参考にやってみました。
「感情分析」では、「Natural Language API」について で書いた通り、「文章」をINPUTとして「score」、「magnitude」等の値を取得できます。
この「score」、「magnitude」の2つの値を利用して文章が「ポジティブ」なのか「ネガティブ」なのか「ニュートラル」なのかを判断していくことになります。
返り値のサンプルがNatural Language API の基本に書いてありました。
・返り値の例
{ "documentSentiment": { "score": 0.2, "magnitude": 3.6 }, "language": "en", "sentences": [ { "text": { "content": "Four score and seven years ago our fathers brought forth on this continent a new nation, conceived in liberty and dedicated to the proposition that all men are created equal.", "beginOffset": 0 }, "sentiment": { "magnitude": 0.8, "score": 0.8 } }, ... }
・各項目の内容について
項目 | 内容 |
---|---|
documentSentiment | ドキュメントの全体的な感情が含まれています。これは、「score」、「magnitude」の2つのフィールドで構成されます。 |
score | -1.0(ネガティブ)~1.0(ポジティブ)のスコアで感情が表されます。 |
magnitude | 指定したテキストの感情の強度(ポジティブとネガティブの両方)が 0.0~+inf の値で示されます。score と違って magnitude は正規化されていないため、テキスト内で感情(ポジティブとネガティブの両方)が表現されるたびにテキストの magnitude の値が増加します(そのため、長いテキストブロックで値が高くなる傾向があります)。 |
language | language にはドキュメントの言語が含まれています。最初のリクエストで言語を渡した場合はその言語が含まれ、渡さなかった場合は自動的に検出された言語が含まれます。 |
sentences | 元のドキュメントから抽出された文のリストが含まれています。これには「sentiment」というフィールドが含まれており、「sentiment」は 各文に関連付けられた文レベルの感情の値が格納されています。これには、上で説明した score 値と magnitude 値が含まれます。 |
「documentSentiment」が「文章全体」の分析結果、「sentences」以下が「文単位」での分析結果のようです。
また、それぞれの分析結果項目の中でも「score」、「magnitude」の2つがメインになりそうです。
実際に利用する前には、下記の3つのステップを踏む必要があるのですが、本エントリーではこの点の記述は省略します。
(以降の「エンティティ分析」、「エンティティ感情分析」、「構文解析」も同様)
- 「プロジェクト」のセットアップ
- クレデンシャル情報を設定
- パッケージのインストール
また、今回は「MacBook Pro (13-inch, 2017, Four Thunderbolt 3 Ports)」を利用して検証しました。
前置きが長くなりましたが、早速色々なテキストで「score」、「magnitude」を取得した結果を纏めてみます。
(言及しない限りは「ドキュメント全体」の結果を記述しています)
「感情分析」では、「どういった数値が取得できたからこの文章は必ずポジティブである」といったような判断はできず、最終的なユースケースに合わせて閾値を決める必要がある点に注意してください。
短く、ポジティブな文章
・文章
今日は天気も良く、とても気分の良い日だった。
・OUTPUT
score:0.8999999761581421 magnitude:0.8999999761581421
scoreはかなり1に近いので、ポジティブな文章であると言えそうです。
また、文章が短いので「magnitude」も小さめです。
長く、ポジティブな文章
・文章
今日はガチ勢の友人と一緒にボルダリングをした。休日だけあってとても混んでいたが、その分他の人の登り方を参考にしたり、アドバイスを受けることができた。 おかげで、今まではどう登ればいいのかわからなかった壁の登り方がわかり、実際に登ることができたのでとても気分が良い。 また、上手い人の登り方を見ていると「自分の課題」も浮き彫りになるので、とても参考になる。 平日は自分が登ることがメインで、休日は人の登り方を参考にじっくり登る、といった使い分けができそうだ。
・OUTPUT
score:0.699999988079071 magnnitude: 3.700000047683716
文章が長くなったこともあり、「magnitude」が大きくなりました。
「score」は約0.7であり、「ポジティブ」と判断するか「ニュートラル」と判断するかは最終的なユースケースにより異なるのかと思いますが、「ポジティブ」と判断してもいい値だと思います。
また、折角なので「文章全体」ではなく「文単位」での分析も試してみました。
・スクリプト
# 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 = ''' 今日はガチ勢の友人と一緒にボルダリングをした。休日だけあってとても混んでいたが、その分他の人の登り方を参考にしたり、アドバイスを受けることができた。 おかげで、今まではどう登ればいいのかわからなかった壁の登り方がわかり、実際に登ることができたのでとても気分が良い。 また、上手い人の登り方を見ていると「自分の課題」も浮き彫りになるので、とても参考になる。 平日は自分が登ることがメインで、休日は人の登り方を参考にじっくり登る、といった使い分けができそうだ。 ''' document = types.Document( content=text, type=enums.Document.Type.PLAIN_TEXT) # Detects the sentiment of the text sentiment = client.analyze_sentiment(document=document) for sentence in sentiment.sentences: print(sentence.text.content, sentence.sentiment.score, sentence.sentiment.magnitude)
・OUTPUT
確かに、文単位での分析もできているようです。
どの文も、直感と近い数値感と言えそうです。
今日はガチ勢の友人と一緒にボルダリングをした。 0.30000001192092896 0.30000001192092896 休日だけあってとても混んでいたが、その分他の人の登り方を参考にしたり、アドバイスを受けることができた。 0.6000000238418579 0.6000000238418579 おかげで、今まではどう登ればいいのかわからなかった壁の登り方がわかり、実際に登ることができたのでとても気分が良い。 0.8999999761581421 0.8999999761581421 また、上手い人の登り方を見ていると「自分の課題」も浮き彫りになるので、とても参考になる。 0.800000011920929 0.800000011920929 平日は自分が登ることがメインで、休日は人の登り方を参考にじっくり登る、といった使い分けができそうだ。 0.800000011920929 0.800000011920929
短く、ネガティブな文章
・文章
最近天気が悪くて洗濯物が干せず、深夜にコインランドリーに通う羽目になり睡眠不足気味で辛い。
・OUTPUT
score:-0.8999999761581421 magnitude:0.8999999761581421
scoreは-1に近く、ネガティブな文章と判断しても良さそうです。
また、文章が短いこともあり、「magnitude」は小さめです。
長く、ネガティブな文章
・文章
先日バスケの試合を観戦したが、とても酷いものだった。 私の好きなプレイヤーはシュートが単発になりがちで、プレイも荒れており、ディフェンスでもファールがかさみ、まるで審判と戦っているかのようであった。 それでもチームが勝ってくれればまだよかったのだが、20点以上の差をつけられて負けてしまった。 折角会場まで足を運んだのに、とても残念だ。 おかげで帰宅中はずっとモヤモヤした気持ちが晴れず、彼の過去の動画を見て気を紛らわせることしかできなかった。
・OUTPUT
score:-0.699999988079071 magnitude:3.5
scoreも-1に近く、「magnitude」も大きくなっています。
このくらいの数値感なら、「ネガティブ」と判断しても良さそうです。
短く、ニュートラルな文章
・文章
怪物と戦う者は、その過程で自分自身も怪物になることのないように気をつけなくてはならない。
・OUTPUT
score:0.10000000149011612 magnitude:0.10000000149011612
scoreは0に近く、また「magnitude」も小さいですね。
この文章は「ニュートラル」な文章と判断されているようです。
長く、「ポジティブ」、「ネガティブ」が混合した文章
・文章
我が同胞たる市民諸君よ。 本日我々は、米国再生という神秘を祝う。 この式典は真冬に開催されているが、我々は語る言葉と世界に見せる顔によって、春をもたらす。世界最古の民主主義国の中で再生した春は、米国を改革する展望と勇気を生む。 建国者らが世界に対して米国の独立を、全能の神に対して国民の目標を力強く宣言したとき、彼らは米国が存続するためには変革が必要であるということを知っていた。それは変革のための変革でなく、生命、自由、幸福追求といった米国の理想を守る変革である。我々は時代の音楽に合わせて行進するが、我々の任務は時を超えている。米国人たることの意義は、各世代の米国人が決めるべきことである。 国民を代表して、私は半世紀に亙って米国に尽くしてきた、前任者のブッシュ大統領に敬意を表する。そして、私はと固い意志と犠牲によって大恐慌やファシズム、共産主義に打ち勝ってきた多くの男女に感謝する。 自由という陽光によって暖められながらも、今なお古き憎悪と新たな災厄に脅かされている世界で今、冷戦の影の下で育った世代が新たな責任を担う。 比類なき繁栄の下で育った我々が継承する経済は今なお世界最強ではあるが、企業の倒産や賃金の停滞、不平等の拡大、国民間の深い溝によって弱体化している。 只今私が支持を誓ったのと同じ宣誓をジョージ・ワシントンが初めて立てた頃、ニュースは陸では馬の背に乗って、そして海では船に乗って、ゆっくりと伝達された。今やこの式典の映像と音声は、世界中の数10億の人民に生放送されている。 通信と商業は世界的規模になっており、投資資金は世界中を駆け巡っている。科学技術は魔法の域に近付いている。そして、より良い生活への熱望は今や普遍的なものとなっている。我々は、地球上のあらゆる人々との平和的競争の中で、生計を立てているのである。 強大な力が世界を揺るがし、作り変えようとしている。当代の緊急課題は、変化を敵でなく味方にできるか否かである。 この新たな世界は、競争に勝利できた多くの米国人の生活を豊かにした。だが、大半の者は懸命に働いているにも拘らず収入が減っている。勤め口が全くない者もいる。医療費負担は家計を圧迫しているばかりか、規模の大小に関係なく多くの企業をも倒産の淵に追いやっている。犯罪を恐れる気持ちが、遵法精神溢れる市民から自由を奪っている。そして、多くの貧しい児童が望ましい生活を想像することすらできずにいる。つまり我々は、変化を味方にできなかったのである。 厳しい現実を直視し、断固たる措置を取らねばならないことは判っている。だが我々は、それを怠った。時流に身を任せた結果、国内資源は侵食され、国内経済は破壊され、国民の信頼は揺らいだ。 我々の試練は凄まじいものであるが、我々の強さも同様である。そして米国民は休むこともなく、探究心と希望を持ち続けてきた。今日我々は、先人らと同様の展望と意志をもって任務に取り組まねばならない。 我が国の革命から南北戦争、大恐慌、公民権運動に至る数々の危機から、米国民は常に固い決意を奮い起こし、米国史の支柱を打ち立ててきた。 「我が国の基盤そのものを維持するには、時に劇的な変化が必要である」とトマス・ジェファスンは考えていた。国民諸君よ、今度は我々の番だ。この機会を捉えよう。 我が国の民主主義は、世界の羨望の的となるのみならず、自国の再生の原動力ともならねばならない。米国の問題は、米国の正しさによって解決できるはずである。 だから本日、我々は停滞と漂流の時代を終らせることを誓う。米国再生という新たな季節が始まった。米国を再生するには、大胆にならねばならない。我々は、これまでの世代ならばする必要もなかったことをせねばならない。自国民に、自国民の雇用に、自国民の将来に投資すると共に、巨額の赤字を削減せねばならない。しかも、あらゆる機会を求めて競争せねばならない世界の中で、行動せねばならないのである。それは容易ではないであろうし、犠牲を要するであろう。だが、きっとできる。しかも公正に。犠牲のための犠牲ではなく、己のための犠牲を払い、家族が子らを養う時と同じ気持ちで我が国に尽くさねばならない。 建国者らは、後世のことを思いつつ己を見詰めた。我々もそうしよう。眠りに落ちる子供の目を見たことのある者ならば、後世というものの何たるかが判るはずである。後世とは、来たるべき世界である。我々は子孫のために理想を掲げ、子孫からこの惑星を借り、子孫に対して神聖な責任を負っているのである。我々は、米国ならではのことをせねばならない。全ての者により多くの機会を提供し、全ての者から責任を求めねばならないのである。 自分は何も提供しないにも拘らず、政府や他人からは施しを期待するという悪習を断つべき時である。己や家族のためだけでなく、地域や国家のため、我々皆がより多くの責任を果たすようにしよう。米国を再生するためには、米国の民主主義を甦らせねばならない。 この美しい都は、文明開闢以来のあらゆる都と同様に、しばしば権謀術数の場となっている。権力者らは地位を求めて争い、誰が台頭し、誰が没落したのかをいつまでも気にしている。そして、額に汗して働く人々が我々をこの場に送り込み、我々に資金を提供してくれていることを忘れてしまうのである。 米国民はもっと報われて然るべきである。そして今この都には、より良い行動をしたいと願う人々がいる。ここにいる皆に言いたい。米国政治の改革を決意し、権力と特権が国民の声を掻き消すことのないようにしよう。個人的な利害は脇に措いて、米国の痛みを感じ、米国の展望を見据えられるようにしよう。我が政府を、フランクリン・ローズヴェルトの言う「大胆かつ持続的な実験」の場とすることを、そして昨日のための政府ではなく、明日のための政府とすることを決意しよう。この都を、持ち主である国民の許へ返そう。 米国を再生するには、国内だけでなく海外でも、試練に対処せねばならない。国外問題と国内問題との間には、もはや境界などない。世界経済、世界環境、世界エイズ危機、世界軍拡競争。これらは、我々皆に影響を及ぼす。 古き秩序が去り行く今では、新たな世界はより自由になったが、より不安定にもなっている。共産主義の崩壊は、古き憎悪と新たな危機を生んだ。我々が苦労して築き上げてきた世界を米国が導き続けねばならないことは明らかである。 米国は国内を再建しつつも、この新たな世界において試練を恐れないし、機会を逃す気もない。友邦や同盟諸国と共に、変化の形成に取り組み、変化に呑み込まれないようにしよう。 我が国は、重要な国益が脅かされたり、国際社会の意志と良心が拒絶されたりすれば、可能な限り平和的外交によって、そして必要とあらば武力によって行動する。今もペルシャ湾やソマリアなど各地で、勇敢な米国人が我が国に尽くしている。彼らこそ、我々の決意の証である。 だが、我々の最大の力は理念の力である。それは、多くの地においては今なお目新しいものである。世界中で、我が国の理念が受け入れられることは喜ばしい。我々の希望も、心も、手も、民主主義と自由を築こうとしている世界中の人々と共にある。彼らの大義は米国の大義である。 本日我々が祝っている変化を招いたのは米国民である。諸君は、声を合わせて主張した。歴史的な数の票を投じた。そして議会を、大統領を、そして政治のあり方そのものの様相を変えた。そう、春をもたらしたのは国民諸君なのである。今こそ我々は、この季節が求める任務を遂行せねばならない。 私は大統領権限を総動員して、この任務に取り組む。議会も協力して欲しい。だが大統領も議会も政府も、単独ではこの任務を遂行できない。国民諸君よ。諸君もまた、我が国の再生に加わらねばならない。若き新世代の米国民には、この季節に相応しい奉仕を求めたい。諸君の理想に従って、苦しむ児童らを助けたり、困窮している人々に寄り添ったり、分裂した地域社会を立て直したりして欲しい。為すべきことは山ほどある。(若者だけでなく、)若き心を保っている他の多くの人々にも、できることは充分ある。 奉仕する際、我々は単純ながらも強力な真実、即ち「我々は互いを必要とする」という真実に気付く。我々は互いを気遣わねばならない。今日、我々は米国を賛美するのみならず、米国の理念そのものに身を捧げる。 それは革命の中で生まれ、2世紀に及ぶ試練を通じて再生した理念である。「幸運な者も不運な者も、運の巡りによっては逆の立場に置かれていたかもしれない」と知ることによって強まった理念である。「我が国はその多様性から深い結束をもたらし得る」との信条によって高まった理念である。「米国の長く壮大な旅路は永久に上昇せねばならない」との信念に満ち満ちた理念である。 だから国民諸君よ。21世紀を迎えるに当たり、活力と希望を、信念と規律を持って始め、最後まで取り組もう。聖書は言う。「我ら善を為すに倦うまざれ。もし撓たわまずば、時至りて刈り取るべし」。 この祝賀という歓喜の山頂にいる我々の許に、国に尽くせとの呼び声が谷間から聞こえてくる。トランペットの音が聞こえた。守り手が交代した。今こそ、各々のやり方で、神の助けを借りつつ、呼び声に応えねばならない。 ありがとう。諸君全員に神の御加護のあらんことを。
参照:Wikisource
・OUTPUT
score:0.20000000298023224 magnitude:47.29999923706055
scoreは0に近く、また「magnitude」が大きいことから「ポジティブ」、「ネガティブ」が混合した文章と言えそうです。
「エンティティ分析」をやってみた
続いて、こちらを参考に「エンティティ分析」をやってみました。
まず、「エンティティ分析」でどんな結果を取得できるのか、についてこちらを参考にまとめます。
項目 | データ型 | 内容 |
---|---|---|
name | string | 検出された単語 |
type | enum(Type) | 「name」がどんなエンティティなのか、というタイプ。タイプ一覧はこちら |
metadata | map (key: string, value: string) | エンティティに紐づけられたメタデータ。殆どの場合、WikiのURLか「Knowledge Graph MID」 |
salience | number | 対象のエンティティが文章中に及ぼす「重要度」。0~1の範囲の値で、返り値の全てのEntityのsalienceを合計すると1となる。1に近いほど重要度が高い。 |
mentions[] | object(EntityMention) | 対象単語が「どんな単語か」を複数返却する |
sentiment | object(Sentiment) | 「magnitude」と「score」を返却する。これらの意味は「感情分析」と同じ。「エンティティ感情分析」の時のみ取得可能。 |
「name」、「type」、「salience」の3つが重要そうですね。
いくつかの文章で実際にどんな値が返却できるか、をこちらのPythonのスクリプトをそのまま使って確認してみました。
・短い文章
田中さんはダイエットと称して3日ほど食事をしていない
・結果
==================== name : 田中 type : PERSON salience : 0.4030778110027313 wikipedia_url : - mid : - ==================== name : ダイエット type : EVENT salience : 0.3420647978782654 wikipedia_url : - mid : - ==================== name : 食事 type : EVENT salience : 0.2548573911190033 wikipedia_url : - mid : - ==================== name : 3 type : NUMBER salience : 0.0 wikipedia_url : - mid : -
「田中」が人物として、「ダイエット」&「食事」がイベントとして検出されています。
「salience」については判断が難しいですが、いずれも重要な要素であり、ある程度以上大きな値が取得できているので、そこまで直感とは反していないかと思います。
・長めの文章
長めの文章を投げてみました。
我が同胞たる市民諸君よ。 本日我々は、米国再生という神秘を祝う。 この式典は真冬に開催されているが、我々は語る言葉と世界に見せる顔によって、春をもたらす。世界最古の民主主義国の中で再生した春は、米国を改革する展望と勇気を生む。 建国者らが世界に対して米国の独立を、全能の神に対して国民の目標を力強く宣言したとき、彼らは米国が存続するためには変革が必要であるということを知っていた。それは変革のための変革でなく、生命、自由、幸福追求といった米国の理想を守る変革である。我々は時代の音楽に合わせて行進するが、我々の任務は時を超えている。米国人たることの意義は、各世代の米国人が決めるべきことである。 国民を代表して、私は半世紀に亙って米国に尽くしてきた、前任者のブッシュ大統領に敬意を表する。そして、私はと固い意志と犠牲によって大恐慌やファシズム、共産主義に打ち勝ってきた多くの男女に感謝する。 自由という陽光によって暖められながらも、今なお古き憎悪と新たな災厄に脅かされている世界で今、冷戦の影の下で育った世代が新たな責任を担う。 比類なき繁栄の下で育った我々が継承する経済は今なお世界最強ではあるが、企業の倒産や賃金の停滞、不平等の拡大、国民間の深い溝によって弱体化している。 只今私が支持を誓ったのと同じ宣誓をジョージ・ワシントンが初めて立てた頃、ニュースは陸では馬の背に乗って、そして海では船に乗って、ゆっくりと伝達された。今やこの式典の映像と音声は、世界中の数10億の人民に生放送されている。 通信と商業は世界的規模になっており、投資資金は世界中を駆け巡っている。科学技術は魔法の域に近付いている。そして、より良い生活への熱望は今や普遍的なものとなっている。我々は、地球上のあらゆる人々との平和的競争の中で、生計を立てているのである。 強大な力が世界を揺るがし、作り変えようとしている。当代の緊急課題は、変化を敵でなく味方にできるか否かである。 この新たな世界は、競争に勝利できた多くの米国人の生活を豊かにした。だが、大半の者は懸命に働いているにも拘らず収入が減っている。勤め口が全くない者もいる。医療費負担は家計を圧迫しているばかりか、規模の大小に関係なく多くの企業をも倒産の淵に追いやっている。犯罪を恐れる気持ちが、遵法精神溢れる市民から自由を奪っている。そして、多くの貧しい児童が望ましい生活を想像することすらできずにいる。つまり我々は、変化を味方にできなかったのである。 厳しい現実を直視し、断固たる措置を取らねばならないことは判っている。だが我々は、それを怠った。時流に身を任せた結果、国内資源は侵食され、国内経済は破壊され、国民の信頼は揺らいだ。 我々の試練は凄まじいものであるが、我々の強さも同様である。そして米国民は休むこともなく、探究心と希望を持ち続けてきた。今日我々は、先人らと同様の展望と意志をもって任務に取り組まねばならない。 我が国の革命から南北戦争、大恐慌、公民権運動に至る数々の危機から、米国民は常に固い決意を奮い起こし、米国史の支柱を打ち立ててきた。 「我が国の基盤そのものを維持するには、時に劇的な変化が必要である」とトマス・ジェファスンは考えていた。国民諸君よ、今度は我々の番だ。この機会を捉えよう。 我が国の民主主義は、世界の羨望の的となるのみならず、自国の再生の原動力ともならねばならない。米国の問題は、米国の正しさによって解決できるはずである。 だから本日、我々は停滞と漂流の時代を終らせることを誓う。米国再生という新たな季節が始まった。米国を再生するには、大胆にならねばならない。我々は、これまでの世代ならばする必要もなかったことをせねばならない。自国民に、自国民の雇用に、自国民の将来に投資すると共に、巨額の赤字を削減せねばならない。しかも、あらゆる機会を求めて競争せねばならない世界の中で、行動せねばならないのである。それは容易ではないであろうし、犠牲を要するであろう。だが、きっとできる。しかも公正に。犠牲のための犠牲ではなく、己のための犠牲を払い、家族が子らを養う時と同じ気持ちで我が国に尽くさねばならない。 建国者らは、後世のことを思いつつ己を見詰めた。我々もそうしよう。眠りに落ちる子供の目を見たことのある者ならば、後世というものの何たるかが判るはずである。後世とは、来たるべき世界である。我々は子孫のために理想を掲げ、子孫からこの惑星を借り、子孫に対して神聖な責任を負っているのである。我々は、米国ならではのことをせねばならない1。全ての者により多くの機会を提供し、全ての者から責任を求めねばならないのである。 自分は何も提供しないにも拘らず、政府や他人からは施しを期待するという悪習を断つべき時である。己や家族のためだけでなく、地域や国家のため、我々皆がより多くの責任を果たすようにしよう。米国を再生するためには、米国の民主主義を甦らせねばならない。 この美しい都は、文明開闢以来のあらゆる都と同様に、しばしば権謀術数の場となっている。権力者らは地位を求めて争い、誰が台頭し、誰が没落したのかをいつまでも気にしている。そして、額に汗して働く人々が我々をこの場に送り込み、我々に資金を提供してくれていることを忘れてしまうのである。 米国民はもっと報われて然るべきである。そして今この都には、より良い行動をしたいと願う人々がいる。ここにいる皆に言いたい。米国政治の改革を決意し、権力と特権が国民の声を掻き消すことのないようにしよう。個人的な利害は脇に措いて、米国の痛みを感じ、米国の展望を見据えられるようにしよう。我が政府を、フランクリン・ローズヴェルトの言う「大胆かつ持続的な実験」の場とすることを、そして昨日のための政府ではなく、明日のための政府とすることを決意しよう。この都を、持ち主である国民の許へ返そう。 米国を再生するには、国内だけでなく海外でも、試練に対処せねばならない。国外問題と国内問題との間には、もはや境界などない。世界経済、世界環境、世界エイズ危機、世界軍拡競争。これらは、我々皆に影響を及ぼす。 古き秩序が去り行く今では、新たな世界はより自由になったが、より不安定にもなっている。共産主義の崩壊は、古き憎悪と新たな危機を生んだ。我々が苦労して築き上げてきた世界を米国が導き続けねばならないことは明らかである。 米国は国内を再建しつつも、この新たな世界において試練を恐れないし、機会を逃す気もない。友邦や同盟諸国と共に、変化の形成に取り組み、変化に呑み込まれないようにしよう。 我が国は、重要な国益が脅かされたり、国際社会の意志と良心が拒絶されたりすれば、可能な限り平和的外交によって、そして必要とあらば武力によって行動する。今もペルシャ湾やソマリアなど各地で、勇敢な米国人が我が国に尽くしている。彼らこそ、我々の決意の証である。 だが、我々の最大の力は理念の力である。それは、多くの地においては今なお目新しいものである。世界中で、我が国の理念が受け入れられることは喜ばしい。我々の希望も、心も、手も、民主主義と自由を築こうとしている世界中の人々と共にある。彼らの大義は米国の大義である。 本日我々が祝っている変化を招いたのは米国民である。諸君は、声を合わせて主張した。歴史的な数の票を投じた。そして議会を、大統領を、そして政治のあり方そのものの様相を変えた。そう、春をもたらしたのは国民諸君なのである。今こそ我々は、この季節が求める任務を遂行せねばならない。 私は大統領権限を総動員して、この任務に取り組む。議会も協力して欲しい。だが大統領も議会も政府も、単独ではこの任務を遂行できない。国民諸君よ。諸君もまた、我が国の再生に加わらねばならない。若き新世代の米国民には、この季節に相応しい奉仕を求めたい。諸君の理想に従って、苦しむ児童らを助けたり、困窮している人々に寄り添ったり、分裂した地域社会を立て直したりして欲しい。為すべきことは山ほどある。(若者だけでなく、)若き心を保っている他の多くの人々にも、できることは充分ある。 奉仕する際、我々は単純ながらも強力な真実、即ち「我々は互いを必要とする」という真実に気付く。我々は互いを気遣わねばならない。今日、我々は米国を賛美するのみならず、米国の理念そのものに身を捧げる。 それは革命の中で生まれ、2世紀に及ぶ試練を通じて再生した理念である。「幸運な者も不運な者も、運の巡りによっては逆の立場に置かれていたかもしれない」と知ることによって強まった理念である。「我が国はその多様性から深い結束をもたらし得る」との信条によって高まった理念である。「米国の長く壮大な旅路は永久に上昇せねばならない」との信念に満ち満ちた理念である。 だから国民諸君よ。21世紀を迎えるに当たり、活力と希望を、信念と規律を持って始め、最後まで取り組もう。聖書は言う。「我ら善を為すに倦うまざれ。もし撓たわまずば、時至りて刈り取るべし」。 この祝賀という歓喜の山頂にいる我々の許に、国に尽くせとの呼び声が谷間から聞こえてくる。トランペットの音が聞こえた。守り手が交代した。今こそ、各々のやり方で、神の助けを借りつつ、呼び声に応えねばならない。 ありがとう。諸君全員に神の御加護のあらんことを。
参照:Wikisource
・結果
文章が長いので、結果もかなり長くなります。
このくらい長い文章でも「米国」、「世界」、「国民」等の大事な単語は「salience」が大きめの値が取得できている点が素晴らしいです。
(結果が長すぎるので、一部のみ抜粋しています)
==================== name : 米国 type : LOCATION salience : 0.42730996012687683 wikipedia_url : https://en.wikipedia.org/wiki/United_States mid : /m/09c7w0 ==================== name : 世界 type : LOCATION salience : 0.22651812434196472 wikipedia_url : - mid : - ==================== name : 国民 type : PERSON salience : 0.035098422318696976 wikipedia_url : - mid : - ==================== name : 市民諸君 type : OTHER salience : 0.02857254259288311 wikipedia_url : - mid : - ==================== name : 変革 type : EVENT salience : 0.015877222642302513 wikipedia_url : - mid : - ==================== name : 多く type : OTHER salience : 0.01532671321183443 wikipedia_url : - mid : - ==================== name : 再生 type : EVENT salience : 0.014577853493392467 wikipedia_url : - mid : - ==================== name : こと type : OTHER salience : 0.011261838488280773 wikipedia_url : - mid : - ==================== name : 人 type : PERSON salience : 0.008536425419151783 wikipedia_url : - mid : - ==================== name : 同胞 type : OTHER salience : 0.007673593237996101 wikipedia_url : - mid : - ==================== name : 世紀 type : OTHER salience : 0.007192459423094988 wikipedia_url : - mid : - ==================== name : こと type : OTHER salience : 0.007041648030281067 wikipedia_url : - mid : - ==================== name : こと type : OTHER salience : 0.007041648030281067 wikipedia_url : - mid : - ==================== name : 春 type : OTHER salience : 0.006779118441045284 wikipedia_url : - mid : - ==================== name : 米国民 type : LOCATION salience : 0.006715337745845318 wikipedia_url : https://en.wikipedia.org/wiki/Nation mid : /m/05gf5 ==================== name : 民主主義国 type : OTHER salience : 0.005426900461316109 wikipedia_url : - mid : - ==================== name : 世代 type : OTHER salience : 0.005239737685769796 wikipedia_url : - mid : - ==================== name : 中 type : OTHER salience : 0.0040919240564107895 wikipedia_url : - mid : - ==================== name : 世界最古 type : OTHER salience : 0.0040919240564107895 wikipedia_url : - mid : - ==================== name : 変化 type : EVENT salience : 0.003883403493091464 wikipedia_url : - mid : - ==================== name : 神秘 type : OTHER salience : 0.0038172858767211437 wikipedia_url : - mid : - ==================== name : 式典 type : EVENT salience : 0.003562280209735036 wikipedia_url : - mid : - ==================== name : 展望 type : EVENT salience : 0.0033916670363396406 wikipedia_url : - mid : - ==================== name : 任務 type : OTHER salience : 0.0033228665124624968 wikipedia_url : - mid : - ==================== name : 生活 type : OTHER salience : 0.003239330602809787 wikipedia_url : - mid : - ==================== name : 再生 type : EVENT salience : 0.002792669925838709 wikipedia_url : - mid : - ==================== name : 神 type : PERSON salience : 0.002705297665670514 wikipedia_url : - mid : - ==================== name : 顔 type : OTHER salience : 0.0025314113590866327 wikipedia_url : - mid : - ==================== name : 言葉 type : OTHER salience : 0.0025314113590866327 wikipedia_url : - mid : - ==================== name : 大統領 type : PERSON salience : 0.0023891841992735863 wikipedia_url : - mid : - ==================== name : 企業 type : ORGANIZATION salience : 0.0022615501657128334 wikipedia_url : - mid : - ==================== name : 倒産 type : EVENT salience : 0.0022615501657128334 wikipedia_url : - mid : - ==================== name : 世界 type : LOCATION salience : 0.0022147190757095814 wikipedia_url : - mid : - ==================== name : 共産主義 type : OTHER salience : 0.0021468414925038815 wikipedia_url : - mid : - ==================== name : 建国者 type : PERSON salience : 0.002122245728969574 wikipedia_url : - mid : - ==================== name : 勇気 type : OTHER salience : 0.0018902226584032178 wikipedia_url : - mid : - ==================== name : 犠牲 type : OTHER salience : 0.0018847803585231304 wikipedia_url : - mid : - ==================== name : 競争 type : EVENT salience : 0.0018356150249019265 wikipedia_url : - mid : - ==================== name : 理想 type : OTHER salience : 0.0017491448670625687 wikipedia_url : - mid : - ==================== name : 理念 type : OTHER salience : 0.0017103311838582158 wikipedia_url : - mid : - ==================== name : 世界 type : LOCATION salience : 0.0016788372304290533 wikipedia_url : - mid : - ==================== name : 規模 type : OTHER salience : 0.0015541359316557646 wikipedia_url : - mid : - ==================== name : 時代 type : OTHER salience : 0.0015076270792633295 wikipedia_url : - mid : - ==================== name : 目標 type : OTHER salience : 0.0015066213672980666 wikipedia_url : - mid : - ==================== name : 全能 type : OTHER salience : 0.0015066213672980666 wikipedia_url : - mid : - ==================== name : 独立 type : OTHER salience : 0.0015066213672980666 wikipedia_url : - mid : - ==================== name : 責任 type : OTHER salience : 0.001466414425522089 wikipedia_url : - mid : - ==================== name : 者 type : PERSON salience : 0.0014276155270636082 wikipedia_url : - mid : - ==================== name : 味方 type : OTHER salience : 0.0013456624001264572 wikipedia_url : - mid : - ==================== name : 意志 type : OTHER salience : 0.0013378240400925279 wikipedia_url : - mid : - ==================== name : 我が国 type : LOCATION salience : 0.0012758702505379915 wikipedia_url : - mid : -
「エンティティ感情分析」をやってみた
続いて、こちらのPythonスクリプトをそのまま使って「エンティティ感情分析」をやってみました。
(サンプルスクリプトの「import six」となっているところは「import sys」の間違いかと思われます)
「エンティティ感情分析」は「感情分析」と「エンティティ分析」を組み合わせたもの、とのことです。
エンティティ感情分析とは、エンティティ分析と感情分析の両方を組み合わせたものであり、テキスト内でエンティティについて表現された感情(ポジティブかネガティブか)の特定を試みることです。エンティティ感情を表すには、数値のスコアと強度の値が使用され、そのエンティティについて言及されるたびに感情が特定されます。このスコアを集計して、そのエンティティの全体的な感情スコアと強度が計算されます。
参照:エンティティ感情分析
ネガティブな文章
・文章
最近天気が悪くて洗濯物が干せず、深夜にコインランドリーに通う羽目になり睡眠不足気味で辛い。
・結果
「Sentiment_score」から、「天気」や「洗濯物」に対して、ネガティブな感情が向けられていることがわかります。
実際、上記の文章はそれらに対してネガティブな感情が含まれているとも見なせるので、直感とそこまで乖離はありません。
また、今回の文章では「Salience」にそれほど大きな差はありませんでした。
Mentions: Name: "天気" Begin Offset : 2 Content : 天気 Sentiment_Magnitude : 0.6000000238418579 Sentiment_score : -0.6000000238418579 Type : 2 Salience: 0.2516593337059021 Sentiment: magnitude: 0.6000000238418579 score: -0.6000000238418579 Mentions: Name: "洗濯物" Begin Offset : 8 Content : 洗濯物 Sentiment_Magnitude : 0.6000000238418579 Sentiment_score : -0.6000000238418579 Type : 2 Salience: 0.22235557436943054 Sentiment: magnitude: 0.6000000238418579 score: -0.6000000238418579 Mentions: Name: "睡眠不足気味" Begin Offset : 35 Content : 睡眠不足気味 Sentiment_Magnitude : 0.10000000149011612 Sentiment_score : -0.10000000149011612 Type : 2 Salience: 0.20233599841594696 Sentiment: magnitude: 0.10000000149011612 score: -0.10000000149011612 Mentions: Name: "羽目" Begin Offset : 30 Content : 羽目 Sentiment_Magnitude : 0.10000000149011612 Sentiment_score : -0.10000000149011612 Type : 2 Salience: 0.17895415425300598 Sentiment: magnitude: 0.10000000149011612 score: -0.10000000149011612 Mentions: Name: "コインランドリー" Begin Offset : 19 Content : コインランドリー Sentiment_Magnitude : 0.0 Sentiment_score : 0.0 Type : 2 Salience: 0.1446949541568756 Sentiment:
ポジティブとネガティブが混ざった文章
・文章
最近購入した本が、内容はとても良いのだが誤植が多く残念だった。 ある程度中身を理解している人ならまだいいだろうが、初学者の方にとっては不便であろう。
・結果
「sentiment_score」から、「内容」に対してはポジティブ、「誤植」に対してはネガティブな感情を抱いている、といった結果が取得できています。
これも、文章の中身から判断すると妥当な結果が取得できていると言えます。
Mentions: Name: "内容" Begin Offset : 9 Content : 内容 Sentiment_Magnitude : 0.800000011920929 Sentiment_score : 0.800000011920929 Type : 2 Salience: 0.2668163776397705 Sentiment: magnitude: 0.800000011920929 score: 0.800000011920929 Mentions: Name: "誤植" Begin Offset : 20 Content : 誤植 Sentiment_Magnitude : 0.6000000238418579 Sentiment_score : -0.6000000238418579 Type : 2 Salience: 0.2123270481824875 Sentiment: magnitude: 0.6000000238418579 score: -0.6000000238418579 Mentions: Name: "初学者" Begin Offset : 57 Content : 初学者 Sentiment_Magnitude : 0.0 Sentiment_score : 0.0 Type : 2 Salience: 0.1457337588071823 Sentiment: Mentions: Name: "方" Begin Offset : 61 Content : 方 Sentiment_Magnitude : 0.0 Sentiment_score : 0.0 Type : 2 Salience: 0.1457337588071823 Sentiment: Mentions: Name: "中身" Begin Offset : 36 Content : 中身 Sentiment_Magnitude : 0.0 Sentiment_score : 0.0 Type : 2 Salience: 0.13308587670326233 Sentiment: Mentions: Name: "人" Begin Offset : 45 Content : 人 Sentiment_Magnitude : 0.0 Sentiment_score : 0.0 Type : 2 Salience: 0.09630317240953445 Sentiment:
「構文解析」をやってみた
続いて、こちらのPythonスクリプトを参考に「構文解析」をやってみました。
「構文解析」は、今まで見てきたAPIとは若干毛並みが異なります。
「感情分析」や「エンティティ分析」は「文章の内容」を分析した結果(ex.ポジティブなのかネガティブなのか、どの単語が文章中で重要度が高いか)を取得できていましたが、「構文解析」は「文章の構造」について解析するものです。
ほとんどの Natural Language API メソッドは、指定されたテキストの内容を分析しますが、analyzeSyntax メソッドは、言語自体の構造を検査します。 構文解析では、指定されたテキストを一連の文とトークン(通常は単語)に分解して、それらのトークンに関する言語情報を提供します。
返り値の仕様がこちらに書いてあったので、これを元にざっくりまとめました。
{ "sentences": [ { object(Sentence) } ], "tokens": [ { object(Token) } ], "language": string }
項目 | データ型 | 内容 |
---|---|---|
sentences[] | object(Sentence) | Inputとして利用した文章 |
tokens[] | object(Token) | Inputとして利用した文章をトークン単位で分割して、解析した結果 |
language | string | Inputで利用した文章の言語。指定した場合は指定した言語として分析するが、指定しなかった場合は自動で検出される |
「tokens」がメインになりそうですね。
tokensに格納される値が気になったのでこちらを参照してみると、「text」、「partOfSpeech」、「dependencyEdge」、「lemma」の4つの値を返却するようです。
{ "text": { object(TextSpan) }, "partOfSpeech": { object(PartOfSpeech) }, "dependencyEdge": { object(DependencyEdge) }, "lemma": string }
項目 | データ型 | 内容 |
---|---|---|
text | object(TextSpan) | トークン |
partOfSpeech | object(PartOfSpeech) | トークンに付与される「Part-of-speech tag」。「Part-of-speech tag」の詳細についてはこちらの論文を参照。 |
dependencyEdge | object(DependencyEdge) | 修飾するトークンのインデックス。詳細についてはこちらの論文を参照。 |
lemma | string | トークンのlemma |
「partOfSpeech」がわかりづらかったので調べてみました。
具体的には、下記のような12個の要素を返り値として返却するようです。
{ "tag": enum(Tag), "aspect": enum(Aspect), "case": enum(Case), "form": enum(Form), "gender": enum(Gender), "mood": enum(Mood), "number": enum(Number), "person": enum(Person), "proper": enum(Proper), "reciprocity": enum(Reciprocity), "tense": enum(Tense), "voice": enum(Voice) }
参照:PartOfSpeech
更に、上記の12個の要素はそれぞれ複数の値を返却します。
これらの各要素の詳細については、本エントリーでは言及しませんので、気になる方はこちらをご確認ください。
また、「dependencyEdge」もわかりづらかったので、もう少しだけ調べてみました。
こちらの解説がわかりやすかったです。
各トークンについて、dependencyEdge 要素は、他のどのトークンを修飾するかを(headTokenIndex フィールドで)識別し、このトークンとそのヘッドトークン間の構文関係を(label フィールドで)識別します。たとえば、初出の「your country」という句のトークン「your」に対する dependencyEdge 要素は次のようになります。
"dependencyEdge": { "headTokenIndex": 4, "label": "POSS" },
この要素は、「your」が 5 つ目のトークンを修飾すること(headTokenIndex では 0 から始まるオフセットが使用されます)、およびこれが所有格の修飾子であることを示します。
というわけで、「対象のトークンがどのトークンを修飾しているか」といったことを示すインデックスのようです。
長くなりましたが、「構文解析」でどのようなことができそうか、というのがざっくりと把握できてきました。
早速、実際にどのような結果が取得できるのかを見てみましょう。
こちらのPythonスクリプトを参考にやってみました。
(「構文解析」は色々な分析結果が取得できるのですが、今回は上記リンク先のサンプルスクリプトに則り、結果の一部分だけを確認します)
・スクリプト
import six from google.cloud import language from google.cloud.language import enums from google.cloud.language import types text = u'''早く秋が来ないかなぁ。 ''' client = language.LanguageServiceClient() if isinstance(text, six.binary_type): text = text.decode('utf-8') encoding = enums.EncodingType.UTF32 if sys.maxunicode == 65535: encoding = enums.EncodingType.UTF16 # Instantiates a plain text document. document = types.Document( content=text, type=enums.Document.Type.PLAIN_TEXT) # Detects syntax in the document. You can also analyze HTML with: # document.type == enums.Document.Type.HTML tokens = client.analyze_syntax(document).tokens for token in tokens: part_of_speech_tag = enums.PartOfSpeech.Tag(token.part_of_speech.tag) print(u'トークン:{},タグ:{},lemma:{},修飾するトークンのインデックス:{}'.format(token.text.content,part_of_speech_tag.name,token.lemma, token.dependency_edge.head_token_index))
・文章
早く秋が来ないかなぁ。
・結果
下記のように文章を「トークン」単位に分割し、タグやlemma、どのトークンを修飾するのか、といった情報が取得できました。この文章の場合は、「が」は「秋」を修飾していること、「早く」のlemmaは「早い」であること、などがわかります。また、「早く」は「形容詞(ADJ)」、「来」は「動詞(VERB)」、「。」は「句読点」であることもわかります。
トークン:早く,タグ:ADJ,lemma:早い,修飾するトークンのインデックス:3 トークン:秋,タグ:NOUN,lemma:秋,修飾するトークンのインデックス:3 トークン:が,タグ:PRT,lemma:が,修飾するトークンのインデックス:1 トークン:来,タグ:VERB,lemma:来る,修飾するトークンのインデックス:5 トークン:ない,タグ:VERB,lemma:ない,修飾するトークンのインデックス:3 トークン:かなぁ,タグ:NOUN,lemma:かなぁ,修飾するトークンのインデックス:5 トークン:。,タグ:PUNCT,lemma:。,修飾するトークンのインデックス:5
各タグの詳細についてはTagをご参照ください。
・文章
私は夏祭りの賑やかな雰囲気が好きだ。
・結果
「夏」は「祭り」を、「賑やか」は「雰囲気」を修飾していることがわかります。
また、「私」は「代名詞(PRON)」、「賑やか」は「形容詞(ADJ)」であることも解析できています。
トークン:私,タグ:PRON,lemma:私,修飾するトークンのインデックス:9 トークン:は,タグ:PRT,lemma:は,修飾するトークンのインデックス:0 トークン:夏,タグ:NOUN,lemma:夏,修飾するトークンのインデックス:3 トークン:祭り,タグ:NOUN,lemma:祭り,修飾するトークンのインデックス:7 トークン:の,タグ:PRT,lemma:の,修飾するトークンのインデックス:3 トークン:賑やか,タグ:ADJ,lemma:賑やか,修飾するトークンのインデックス:7 トークン:な,タグ:VERB,lemma:だ,修飾するトークンのインデックス:5 トークン:雰囲気,タグ:NOUN,lemma:雰囲気,修飾するトークンのインデックス:9 トークン:が,タグ:PRT,lemma:が,修飾するトークンのインデックス:7 トークン:好き,タグ:ADJ,lemma:好きだ,修飾するトークンのインデックス:9 トークン:だ,タグ:VERB,lemma:だ,修飾するトークンのインデックス:9 トークン:。,タグ:PUNCT,lemma:。,修飾するトークンのインデックス:9
まとめ
GCPの「Natural Language」について調べ、「Natural Language API」のいくつかのAPIを実際に操作してみました。
「コンテンツ分類」も日本語対応するのが楽しみですね。
GCPにおける自然言語サービスの日本語対応状況について調べたい、という方の参考になれば幸いです。