コンピュータは構造化されたデータを理解するのが得意ですが、主に文化的習慣に基づいた人間の言語を理解するのはコンピュータにとって非常に困難です。では、自然言語処理はどのようにして成功を収めたのでしょうか? それは、人間の言語を (可能な限り) 構造化することです。この記事では、簡単な例を使用して、自然言語処理パイプラインの各段階の動作プロセス、つまり文の分割、語彙のトークン化、...から共参照の解決までの言語構造化プロセスを段階的に示します。著者の説明は非常に直感的で分かりやすいです。NLPを始めたばかりの人にとっては珍しい良記事です。 コンピューターが人間の言語を理解する方法。 コンピュータは、スプレッドシートやデータベース テーブルなどの構造化されたデータの処理に非常に優れています。しかし、私たち人間は通常、スプレッドシートではなく言葉でコミュニケーションをとります。これはコンピュータにとって良いことではありません。 残念ながら、歴史上、私たちは構造化されたデータで満たされた世界に住んだことはありません。 世界の情報の多くは構造化されていません。たとえば、英語やその他の人間の言語で書かれた生のテキストなどです。では、コンピューターに非構造化テキストを理解させ、そこからデータを抽出させるにはどうすればよいでしょうか? 自然言語処理 (略して NLP) は、コンピューターが人間の言語を理解して処理できるようにすることに重点を置いた AI のサブフィールドです。次に、NLP の仕組みを確認し、Python プログラミングを使用して生のテキストから情報を抽出する方法を学びます。 注: NLP の仕組みを気にせず、単にコードをコピーして貼り付けたい場合は、「Python での NLP パイプラインの実装」セクションに進んでください。 1. コンピューターは言語を理解できますか? コンピュータが存在する限り、プログラマーは英語のような言語を理解できるプログラムを書こうとしてきました。その理由は明らかです。人類は何千年もの間情報を書き留めてきました。コンピューターがこのデータをすべて読み取って理解できれば非常に役立つでしょう。 コンピューターはまだ人間のように英語を理解することはできませんが、すでに多くのことができます。特定の分野では、NLP を使用して驚くべきことを実現できます。また、NLP を独自のプロジェクトに適用することで、膨大な時間を節約することもできます。 さらに便利なのは、NLP テクノロジーの最新の進歩をオープンソースの Python ライブラリ (spaCy、textacy、neuralcoref など) を通じて呼び出すことができ、NLP テクノロジーを実装するには数行の Python コードしか必要ないことです。 2. テキストから意味を抽出するのは簡単ではない 英語を読んで理解するプロセスは信じられないほど複雑であり、そのプロセスには、英語が論理的で一貫したルールに従わないことがあるという点さえ考慮されていません。たとえば、このニュースの見出しは何を意味しているのでしょうか?
規制当局は、違法に石炭を燃やしたとして事業主を尋問しているのでしょうか。それとも、規制当局は文字通り事業主を陥れて炭火で炙り出しているのでしょうか。おわかりのように、コンピューターで英語を解析するのはかなり複雑になります。 機械学習で複雑なことを行うには、通常、パイプラインを構築することになります。問題を非常に小さな部分に分割し、機械学習を使用して各部分を個別に解決し、最後に相互に情報を提供する複数の機械学習モデルを接続することで、非常に複雑な問題を解決できるという考え方です。 これはまさに NLP で使用する戦略です。英語を理解するプロセスを小さなチャンクに分割し、各チャンクがどのように機能するかを見ていきます。 3. NLPパイプラインを段階的に構築する Wikipedia のこの一節を見てみましょう。
(ロンドンはイングランドの首都であり、英国で最も人口の多い都市です。2000 年もの間、英国南東部のテムズ川流域における主要な人間の居住地でした。ローマ人によって建設され、ロンディニウムと名付けられました。 この文章にはいくつか役に立つ事実が含まれています。コンピュータがこれを読んで、ロンドンが都市であること、ロンドンはイングランドに位置していること、ロンドンにローマ人が定住したことを理解できたらいいでしょう。しかし、この目標を達成するためには、まずコンピューターに書き言葉の最も基本的な概念を教え、その後、その基礎に基づいて徐々に改善していく必要があります。 ステップ1: 文の分割 パイプラインの最初のステップは、次のようにテキストを個々の文に分割することです。
英語の各文は、別々の考えやアイデアを表現していると推測できます。段落全体を理解するプログラムを書くよりも、文を理解するプログラムを書く方がはるかに簡単です。 句読点を見つけるたびに文を分割する文分割モデルをコーディングするのは簡単です。ただし、最新の NLP パイプラインでは、適切にフォーマットされていないファイルに対処するために、より洗練された手法が使用されることがよくあります。 ステップ2: 語彙のトークン化 ドキュメントを文に分割したので、一度に 1 つずつ処理できます。ドキュメントの最初の文から始めましょう:
次のステップは、この文を異なる単語またはトークンに分割することです。これをトークン化と呼びます。トークン化後の結果は次のとおりです。
英語でのトークン化は簡単に行えます。それらの間にスペースがある限り、私たちはそれらを分離します。句読点も意味を持つため、別のトークンとして扱います。 ステップ3: 各トークンの品詞を予測する 次に、各トークンを見て、名詞、動詞、形容詞などの品詞を推測します。文中の各単語の役割を知ることは、文の意味を理解するのに役立ちます。 各単語(および文脈のための周囲の追加単語)を、事前トレーニング済みの品詞分類モデルに入力できます。 品詞モデルは当初、各単語に品詞のラベルを付けた何百万もの英語の文章を入力し、その動作を再現するように学習させることでトレーニングされました。 このモデルは純粋に統計に基づいており、人間のように言葉の意味を真に理解しているわけではないことに注意することが重要です。類似した文や単語に基づいて品詞を推測する方法しか知りません。 文全体を処理すると、次のようになります。 この情報があれば、非常に基本的な意味を理解し始めることができます。たとえば、文中の名詞に「ロンドン」や「首都」が含まれているので、この文はロンドンに関するものである可能性が高いことがわかります。 ステップ4: テキストの見出し語化 英語(およびほとんどの言語)では、単語はさまざまな形で現れます。次の2つの文を見てください。
どちらの文も名詞「ポニー」について論じていますが、異なる語形(単数形と複数形)を使用しています。コンピューターでテキストを処理するときは、2 つの文が同じ概念について議論していることがわかるように、各単語の基本形を知っておくと役立ちます。そうしないと、文字列「pony」と「ponies」はコンピュータにとってはまったく異なる 2 つの単語のように見えます。 NLP では、このプロセスを「見出し語化」と呼びます。これは、文中の各単語の最も基本的な形式または見出し語を見つけることです。 動詞にも同じことが当てはまります。動詞の語源を見つけて、それを見出し語化することで、動詞を未活用形に変換することもできます。つまり、「私はポニーを2匹持っていました。」は「私はポニーを2匹持っています。」になります。 見出し語化は通常、品詞に基づいた見出し語形式の参照テーブルを介して行われ、これまで見たことのない単語を処理するためのカスタム ルールが使用される場合もあります。 以下は、語義化して動詞の原形を追加すると次のようになる文です。 私たちが行った唯一の変更は、「is」を「be」に変更したことです。 ステップ5: ストップワードを特定する 次に、文中の各単語の重要性を考慮する必要があります。英語には、「and」、「the」、「a」など、頻繁に登場するつなぎ言葉がたくさんあります。これらの単語は他の単語よりも頻繁に出現するため、テキストの統計を取るときに多くのノイズが発生します。一部の NLP パイプラインでは、これらを「ストップワード」としてマークします。つまり、統計分析を実行する前に除外する必要がある単語です。 ストップワードをグレー表示した後の文は次のようになります。 ストップワードは通常、既知のストップワードのハードコードされたリストをチェックすることによって識別されます。しかし、すべてのアプリケーションで機能するストップワードの標準リストは存在しません。無視される単語のリストは、アプリケーションによって異なる場合があります。 たとえば、ロック バンドの検索エンジンを構築する場合は、「The」という単語を無視しないようにする必要があります。この単語は多くのバンド名に登場しており、1980年代には「The The」という有名なロックバンドも存在します。 ステップ 6a: 依存関係の解決 次のステップは、文中のすべての単語が互いにどのように関連しているかを把握することです。これを依存関係解析と呼びます。 私たちの目標は、文中の各単語に単一の親単語を割り当てるツリーを構築することです。木の根は文の主動詞です。文の構文解析ツリーの冒頭部分は次のようになります。 しかし、さらに先へ進むことができます。各単語の親単語を特定することに加えて、2 つの単語間に存在する関係の種類を予測することもできます。 この構文解析ツリーは、文の主語が名詞「London」であり、それが「capital」と「be」関係にあることを示しています。ようやく役に立つことがわかりました。ロンドンは首都です。文の完全な構文解析ツリーをたどると (上記を除く)、ロンドンがイギリスの首都であることがわかります。 先ほど機械学習モデルを使用して品詞を予測したのと同じように、依存関係の解析も、単語を機械学習モデルに入力して結果を出力することで機能します。しかし、単語の依存関係を解析するのは特に複雑な作業であり、詳細に説明するには記事全体が必要になります。それがどのように機能するかを知りたい場合は、まず Matthew Honnibal の優れた記事「Parsing English in 500 Lines of Python」を読むのが良いでしょう。 しかし、著者は 2015 年の記事でこのアプローチが標準になったと述べていますが、実際には時代遅れであり、著者自身も使用していません。 2016 年に Google は、新しいディープラーニング アプローチを使用して以前の基準を超えた Parsey-McParseFace という新しい依存関係アナライザーをリリースし、業界全体に急速に広まりました。 1年後、彼らはさらに改良された「ParseySaurus」という新しいモデルをリリースしました。言い換えれば、解析技術は、現在でも活発に研究されており、常に変化し、改善が続けられています。 また、英語の文章の多くは曖昧で解析が難しいということを覚えておくことも重要です。この場合、モデルは解析された文のバージョンに基づいて推測を行いますが、それは完璧ではなく、モデルが恥ずかしい間違いを犯すこともあります。しかし、時間が経つにつれて、当社の NLP モデルはより優れた方法でテキストを解析し続けるようになります。 ステップ6b: 名詞句を見つける これまで、文中の各単語を独立した存在として扱ってきました。しかし、時には 1 つのアイデアや物事を表す単語をグループ化する方が意味がある場合もあります。依存関係解析ツリー内の関連情報を使用することで、同じことを表すすべての単語を自動的にグループ化することができます。 例えば: 名詞句を組み合わせて次の形式を作成できます。 このステップを実行するかどうかは、最終的な目標によって決まります。これは、どの単語が形容詞であるかについての詳細を必要とせず、完全なアイデアの抽出に重点を置きたい場合に、迅速かつ簡単な方法です。 ステップ 7: 固有表現認識 (NER) 大変な作業がすべて終わったので、ようやく小学校の文法を超えて、実際にアイデアを抽出し始めることができます。 この文には次の名詞があります。 これらの名詞の中には実在するものもあります。たとえば、「ロンドン」、「イングランド」、「イギリス」は地図上の物理的な場所を表します。これを検出できてよかったです! この情報を使用して、NLP を使用し、ドキュメントに記載されている実際の地名のリストを自動的に抽出できます。 固有表現抽出 (NER) の目的は、これらの名詞を検出し、それらが表す現実世界の概念にラベルを付けることです。各タグを NER タグ付けモデルで実行した後の文は次のようになります。 しかし、NER システムは単なる辞書検索以上のものです。代わりに、単語が文中でどのように現れるかという文脈と統計モデルを使用して、その単語が表す名詞の種類を推測します。優れた NER システムは、文脈上の手がかりを使用して、「Brooklyn Decker」という名前と「Brooklyn」という場所を区別できます。 NER システムがタグ付けできる一般的なオブジェクト タイプを次に示します。
NER はテキストから構造化されたデータを簡単に取得できるため、さまざまな用途に使用できます。これは、NLP パイプラインから貴重な情報をすばやく取得する最も簡単な方法の 1 つです。 ステップ8: 共参照の解決 この時点で、文の適切な表現が得られました。私たちは、各単語の品詞、単語同士の関係、どの単語が固有表現について話しているのかを知っています。 しかし、まだ大きな問題が残っています。英語には、he、she、it などの人称代名詞がたくさんあります。これらは、すべての文で名前を何度も書く代わりに使用するショートカットです。人間は文脈に基づいてこれらの単語が何を表しているかを記録することができます。しかし、私たちの NLP モデルは、一度に 1 つの文しか調べないため、人称代名詞の意味がわかりません。 ドキュメントの 3 番目の文を見てみましょう。
この文を NLP パイプラインを使用して解析すると、「それ」はローマ人によって建てられたことがわかります。しかし、「ロンドン」がローマ人によって設立されたことを知ることはより有益です。 人間がこの文章を読むと、「それ」が「ロンドン」を意味していることが容易に理解できます。共参照解決の目的は、文中の代名詞を追跡して同じマッピングを見つけることです。同じエンティティに言及するすべての単語を見つけたいのです。 文書内の「London」という単語の共参照解決の結果は次のとおりです。 共参照情報を解析ツリーおよび名前付きエンティティ情報と組み合わせることで、ドキュメントから多くの情報を抽出できます。 共参照解決は、NLP パイプラインで実装するのが最も難しいステップの 1 つです。これは文の分析よりも難しいです。最近のディープラーニングの進歩により、より正確な新しい手法が生まれましたが、まだ完璧ではありません。仕組みについて詳しく知りたい場合は、https://explosion.ai/demos/displacy-ent をご覧ください。 4. NLPパイプラインのPython実装 完全な NLP パイプラインの概要は次のとおりです。 共参照解決は、実行する必要のないオプションの手順です。 わあ、手順が多そうですね! 注: 先に進む前に、これらは一般的な NLP パイプラインの手順ですが、実行したい内容や NLP ライブラリの実装方法に応じて、一部の手順をスキップしたり、順序を変更したりできることを述べておきます。たとえば、spaCy などの一部のライブラリは、依存関係解析の結果を使用した後、パイプラインで文の分割を実行します。 では、このパイプラインをどのようにコーディングすればよいでしょうか? spaCy のような素晴らしい Python ライブラリのおかげで、すでにコーディングが完了しています。手順はすべてコード化されており、すぐに使用できます。 まず、Python 3 がインストールされていると仮定すると、次のようにして spaCy をインストールできます。
次に、テキストに対して NLP パイプラインを実行するコードは次のようになります。
これを実行すると、ドキュメント内で検出された名前付きエンティティとエンティティ タイプのリストが表示されます。
これらのコードは、https://spacy.io/usage/linguistic-features#entity-types で見つかります。 「Londinium」は地名ではなく人名だと勘違いしていることに注意してください。これはおそらく、トレーニング データセットに類似するものがないため、最善の推測を行ったためです。固有または専門的な用語を含むテキストを解析する場合、名前付きエンティティの検出には通常、モデルの微調整 (https://spacy.io/usage/training#section-ner) の短い期間が必要になります。 エンティティを検出し、それを使用してデータ スクラバーを構築してみましょう。新しいGDPRのプライバシールールに準拠しようとしているとしましょう (https://medium.com/@ageitgey/understand-the-gdpr-in-10-minutes-407f4b54111f) そして、人の名前などの個人を特定できる情報を含むファイルが何千もあることに気付きます。この文書からすべての名前を削除する任務が与えられました。 何千ものファイルを手作業で検索し、すべての名前を削除するには何年もかかります。しかし、NLP を使用すれば、これは簡単に実現できます。検出した名前をすべて削除する簡単なスクラバーを次に示します。
実行すると、予想通りの結果が得られることがわかります。
5. 事実の抽出 spaCy でできることはたくさんあります。ただし、spaCy 解析の出力を、より複雑なデータ抽出アルゴリズムへの入力として使用することもできます。 spaCy の上にいくつかの一般的なデータ抽出アルゴリズムを実装する textacy という Python ライブラリがあります。これは良い出発点です。 実装されているアルゴリズムの 1 つは、半構造化文抽出と呼ばれます。これを使用して、主語が「London」で動詞が「be」の形である単純な文の構文解析ツリーを検索できます。これはロンドンについての事実を見つけるのに役立ちます。 コード実装は次のとおりです。
結果は次のとおりです。
あまり印象的ではないかも知れません。しかし、3 つの文だけではなく、ロンドンの Wikipedia 記事のテキスト全体に同じコードを実行すると、さらに印象的な結果が得られます。
いよいよ面白くなってきました! これは自動的に収集される大量の情報です。 追加のサポートについては、neuralcoref ライブラリをインストールし、パイプラインに Coreference 解析を追加してみてください。これにより、「ロンドン」を直接言及するのではなく、「それ」について話している文がキャッチされるため、より多くの事実が得られます。 他に何ができるでしょうか? spaCy のドキュメントと textacy のドキュメントを参照すると、解析されたテキストで何ができるかの多くの例を確認できます。これまで見てきたのはほんの一例にすぎません。 もう 1 つの現実世界の例を示します。前の例で抽出した情報を使用して、世界中のすべての都市に関する情報をユーザーが表示できる Web サイトを構築しているとします。 ウェブサイトに検索機能がある場合は、Google のような一般的な検索クエリを自動補完すると便利です。
Google による「ロンドン」の自己改善の提案 しかし、これを実現するには、ユーザーに提案できる改善点のリストが必要です。 NLP を使用すると、このデータをすばやく生成できます。 文書から頻繁に言及される名詞のチャンクを抽出する方法の 1 つを次に示します。
これをロンドンの Wikipedia の記事で実行すると、次のような出力が得られます。
7. 詳細な議論 これは、NLP で何ができるかについてのアイデアを提供するための単なる小さな試みです。今後の記事では、テキスト分類や Amazon Alexa などのシステムが質問を解析する方法など、NLP の他のアプリケーションについて説明します。 ただし、その前に、spaCy をインストールして使い始めてください。Python ユーザーではない場合や、別の NLP ライブラリを使用する場合でも、考え方はほぼ同じです。 オリジナルリンク: https://medium.com/@ageitgey/natural-language-processing-is-fun-9a0bff37854e [この記事は51CTOコラム「Machine Heart」、WeChatパブリックアカウント「Machine Heart(id: Almosthuman2014)」からのオリジナル記事です] この著者の他の記事を読むにはここをクリックしてください |
>>: 人工知能はプライバシー侵害につながり、人々は顔スキャンが安全を奪うのではないかと心配している
糖尿病は網膜症を引き起こす可能性があり、これは失明につながる合併症です。しかし、良いニュースとしては...
OpenAIのGPTストアにはオープンソースの代替品がある——ハグフェイスより。同社が新たに立ち上げ...
データの規模を拡大し、関連するリテラシーを向上させることで、米空軍のさまざまな部門と人員は、意思決定...
映画やテレビ作品では、人工知能による殺人はごく普通のことのように思えますが、結局のところ、それは人間...
金庸の武侠小説『射雁英雄伝』には、桃花島に閉じ込められた「悪童」周伯同が「左右の格闘術」を編み出した...
私はいつも映画に出てくるロボットが大好きで、悪いロボットも好きです。しかし不安なのは、私たちの周りの...
次世代の交通手段は、電子機器、持続可能性、経験を設計の中核としており、Gen AI は、想定される次...
拡張現実技術の可能性は、小売、エンターテインメント、教育などのクリエイティブ産業を超えて広がります。...
Companies and Markets の評価レポートでは、世界の音声認識市場は今後さらに多様...
AIが「コーダー」に取って代わるという現実はまだ実現していないが、その逆を行い、コーダーを使ってA...
インテリジェント運転技術の継続的な発展により、私たちの移動方法や交通システムは変化しています。 3D...