音声コマンドを理解し、ニュースや知識源を検索し、内容を要約して読み上げます。
デモビデオをご覧ください。
Chatbots Magazine の「Chatbots Magazine のトップ 100 記事」で私の Delbot の記事が紹介されました。
python app.py
と入力してWebサービスを起動します。ボットは依然としてホットなトピックです。誰もが彼らについて話しています。
ゼロから構築してみてはどうでしょうか?今日構築する単純なものは、次のような質問を理解し、答えることができます。
私たちの目標は、ボットを最初からコーディングし、その際に自然言語処理 (NLP) を使用することです。
さらに、Web アプリのセクションも完了すると、ボットは音声対応で Web ベースになります。最も良い点は、音声認識や合成のために特別なことをする必要がないことです。最新の Web ブラウザの組み込み機能を使用します。
大まかに言うと、2 つの大きなタイプのクエリを理解できるようにしたいと考えています。以下にフローチャートを示します。
ニュースを尋ねるかもしれません。例えば:
ガーディアン紙のファンタスティック・ビーストの最新情報は何ですか?
ボットは、リクエストされたニュース ソース (何も指定されていない場合は New York Times) の API をクエリし、結果を要約します。
[...] ハリー・ポッター映画の最初の作品 (2001 年のハリー・ポッターと賢者の石) と最後の映画 (2011 年のハリー・ポッターと死の秘宝パート 2) を比較するのは、バンビとレザボア・ドッグスを比較するのと似ています。私たちが彼に初めて会ったのは、ハリーが生まれるほぼ 60 年前、1920 年代のニューヨークでした。そこで彼は [...]
(出典: https://www.theguardian.com/books/2016/nov/25/jk-rowling-fantastic-beasts-screenplay)
知識に関する質問をする場合があります。例えば:
RDF トリプルとは何ですか?
するとボットは次のように答えます。
セマンティック トリプル、または単にトリプルは、リソース記述フレームワークのアトミック データ エンティティです。nこの形式により、知識を機械可読な方法で表現できます。特に、RDF トリプルのすべての部分は、一意の URI を介して個別にアドレス指定できます。たとえば、上記の 2 番目のステートメントは、RDF では http://example.name#BobSmith12 http://xmlns.com/foaf/0.1/ のように表現されます。 http://example.name#JohnDoe34 を知っています。
(出典: https://en.wikipedia.org/wiki/Semantic_triple)
入力を分類するための簡単なルールを定義します。クエリにnewsまたはlast のいずれかの単語が含まれる場合、それはニュース クエリです。それ以外の場合は、知識クエリです。
QueryAnalyzer
クラスのpredict
関数は、ボットの主要なエントリ ポイントです。上記の分類を実行します。他の関数を呼び出して、
最後に、出力と、エラーがあったかどうかを示すフラグを返します。
入力は次のいずれかの形式であると想定します。
ニューヨーク・タイムズ紙のスター・ウォーズに関する最新ニュースは何ですか?
Brexitに関する最新情報を読んでください。
ガーディアン紙から、 2017 年のマーベル・シネマティック・ユニバース映画に関するニュースを教えてください。
トークン | 与える | 自分 | の | 最新 | ニュース | の上 | ドナルド | トランプ | から | の | 新しい | ヨーク | 回 | 。 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
POS | 動詞 | プロン | DET | 調整 | 名詞 | ADP | プロパン | プロパン | ADP | DET | プロパン | プロパン | プロパン | パンクト |
タグ | VB | PRP | DT | JJS | NN | で | NNP | NNP | で | DT | NNP | NNP | NNP | 。 |
上記のような構造の文章にはパターンがあります。そして前置詞が重要です。
検索のトピックは最初と最後の前置詞の間です。要求されたソースは、最後の前置詞の後の末尾にあります。最後の名詞チャンクがソースです。
2 番目の例のようにソースが指定されていない場合は、最初の前置詞以降のすべてが検索のトピックであるとみなされます。
副詞は、簡単に言えば、前置詞と後置詞です。
英語のような頭頭語の言語では、通常、副詞は名詞句の前に置きます。たとえば、マーベル・シネマティック・ユニバースのキャラクターなど。グジャラート語のような主語終止言語では、代弁は名詞句の後に続きます。これらは後置詞です。例: માર્વેલ ચલચિત્ર જગત_ના_ પાત્રો は、単語ごとに次のように翻訳されます: マーベル シネマティック ユニバースのキャラクター。
QueryExtractor
クラスからget_news_tokens
を呼び出し、入力からソースとクエリを抽出します。内部的には、 _split_text
呼び出して、名詞のチャンク、品詞、および完全に解析されたテキストを入力から抽出します。クエリ内の用語を見出し語化します。
次に、 sourceに基づいて、media_aggregator.py 内のAggregator
クラスの 1 つに対するクエリを使用して、 get_news
関数を呼び出します。これは、ニュース API によって応答として送信されたニュース記事のリストを返します。現在、The Guardian API と The New York Times API をサポートしています。
最後に、応答リストから最初の項目 (デフォルト) を選択し、 shorten_news
関数を使用して要約します。
入力は次のいずれかの形式であると想定します。
ジョン・ディア
ジャンヌ・ダルク
ドナルド・トランプとは誰ですか?
JRR トールキンとは誰ですか?
主語・述語・目的語とは何ですか?
素粒子物理学について教えてください。
トークン | 何 | は | の | RDF | トリプル | ? |
---|---|---|---|---|---|---|
POS | 名詞 | 動詞 | DET | プロパン | 名詞 | パンクト |
タグ | WP | VBZ | DT | NNP | NN | 。 |
トークン | 教えて | 自分 | について | 彼 | - | 男 | そして | の | マスター | の | の | 宇宙 | 。 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
POS | 動詞 | プロン | ADP | プロン | パンクト | 名詞 | コンジ | DET | 名詞 | ADP | DET | 名詞 | パンクト |
タグ | VB | PRP | で | PRP | 菌糸 | NN | CC | DT | NNS | で | DT | NN | 。 |
助動詞が見つかった場合、最初に出現した後のすべてをクエリとして扱います。したがって、例 1では、クエリはRDF Tripleです。
それ以外の場合は、最初の名詞チャンク以降のすべての名詞チャンクがクエリとして扱われます。したがって、例 2では、クエリはhe-man the masters the Universeです。
QueryExtractor
クラスからget_knowledge_tokens
を呼び出し、クエリを抽出します。
これをget_gkg
関数に渡します。この関数は、 wikipedia Python パッケージを通じて Wikipedia API にクエリを実行し、上位の結果の 5 文の要約を返します。
NLTK によるテキスト要約のFrequencySummarizer
クラスを使用しました。あるいは、sumy を使用することもできます。
パッケージre 、 bs4 、 requests 、 operator 、 collections 、 heapq 、 stringおよびnltkに加えて、以下を使用します。
spaCy : spaCy のインストールに関するドキュメントに従ってセットアップしてください。 spaCy は、簡単な NLP を行うのに役立ちます。 NLTK を使用することもできますが、spaCy を使用すると作業が速くなります。このプロジェクトではspaCyを使用しています。
Wikipedia : これは、Wikipedia API のクエリに役立ちます。ここで、 wikipedia Python パッケージのドキュメントを読むことができます。
要約: 私が使用したものは、JustGlowing によって書かれた The Glowing Python ブログから借用しました。長い内容をまとめています。あるいは、sumy を使用することもできます。
Flask-RESTful、Flask (オプション) : これらは、Web アプリを構築し、RESTful Web サービスを通じてボットを運用するためのものです。
音声クエリを実行し、ブラウザーに応答コンテンツを読み上げさせることができるクールな Web ページを追加します。これには Web Speech API を利用します。
Flask ベースの REST Web サービスを 20 行未満のコードで立ち上げて実行します。 QueryService
クラスはリクエストを処理します。
現時点では、Web アプリからボットに入力を送信するために必要なサービス呼び出しは 1 回だけです。これは、 QueryService
クラスのpost
関数を通じて行われます。 post
、次に、前述したようにメインのエントリ ポイントであるpredict
関数を呼び出します。
ボットをデモするための基本的な Web ページを作成しました。 Web Speech API を使用して音声入力を受け取り、コンテンツを読み上げます。 Index.html ファイルはテンプレート フォルダーにあります。 Web サイトを開く前に、必要なパッケージとライブラリがすべてインストールされていること、および Web サービスが起動して実行中であることを確認してください。
私たちのシンプルなボットは、限られた範囲のリクエストを理解します。以下のような他の種類のリクエストは理解できません。
異なる構造のナレッジ リクエスト
ブートストラップ集約とは何なのか説明してください。
計算神経科学について教えてください。
異なる構造のニュースリクエスト
ニューヨーク・タイムズはロジャー・フェデラーの最新の試合について何と言っていますか?
テニスの世界で何が起こっているのでしょうか?
他の種類のナレッジ リクエスト
チーズはどのように作られるのですか?
JKローリングはどこで生まれましたか?
金星に天空都市を建設できるでしょうか?
フランス革命はいつ起こりましたか?
なぜ木星には大赤斑があるのでしょうか?
フォローアップの質問と背景
ブートストラップ集約とは何なのか説明してください。
そして、それはランダム フォレストとどのように関係するのでしょうか?
フォローアップの質問でそれが何を指すのかを理解することは、照応解決として知られています。それはすべてコンテキストを理解することの一部です。異なる単語は、異なる文脈では異なる意味を持ちます。人間はこれらを微妙に理解していますが、機械に同じことを教えることは非常に困難です。
私たちは、定義したいくつかのルールに基づいてボットを構築するという目標を達成しました。 NLP テクニックもいくつか利用しました。最後に、ボットを Web アプリケーションにデプロイしました。ただし、ボットが理解して回答できるクエリの種類は限られています。なぜ理解できる範囲がこれほど狭いのでしょうか?
一般に、コンピューターに言語を本当に理解させるのは、AI にとって難しい問題です。 NLP の中には、これに特化した NLU (Natural Language Understanding) として知られる分野があります。
機械学習ベースのソリューションを実装すれば、ボットがより広範囲のリクエストを理解できる可能性があります。
ここで使用するAPIの利用規約を必ずお読みください。