ほとんどの自然言語処理タスクでは、処理対象のテキストを分解し、分析し、その結果をルールやデータセットと照合する必要があります。これらのタスクを通じて、プログラマーはテキスト内の単語やフレーズの_意味_や_意図_、または単に_頻度_を導き出すことができます。
テキストを処理する際に使用される一般的な技術を見てみましょう。これらの技術は機械学習と組み合わせることで、大量のテキストを効率的に分析するのに役立ちます。ただし、これらのタスクに機械学習を適用する前に、自然言語処理の専門家が直面する問題を理解する必要があります。
テキストを分析する方法はさまざまです。実行できるタスクがあり、それらを通じてテキストを理解し、結論を導き出すことができます。通常、これらのタスクは順序立てて実行されます。
おそらくほとんどの自然言語処理アルゴリズムが最初に行うことは、テキストをトークン、つまり単語に分割することです。一見簡単そうに思えますが、句読点や異なる言語の単語や文の区切りを考慮する必要があるため、複雑になることがあります。区切りを決定するためにさまざまな方法を使用する必要があるかもしれません。
Pride and Prejudiceの文をトークン化する様子。インフォグラフィック作成者:Jen Looper
単語埋め込みは、テキストデータを数値に変換する方法です。埋め込みは、意味が似ている単語や一緒に使われる単語がクラスター化されるように行われます。
"I have the highest respect for your nerves, they are my old friends." - Pride and Prejudiceの文の単語埋め込み。インフォグラフィック作成者:Jen Looper
✅ この興味深いツールを試して単語埋め込みを実験してみましょう。単語をクリックすると、似た単語のクラスターが表示されます。例えば、'toy'は'disney', 'lego', 'playstation', 'console'とクラスター化されます。
トークン化されたすべての単語は、品詞としてタグ付けすることができます。例えば、名詞、動詞、形容詞などです。文the quick red fox jumped over the lazy brown dogは、品詞タグ付けされると、fox = 名詞、jumped = 動詞となります。
Pride and Prejudiceの文を解析する様子。インフォグラフィック作成者:Jen Looper
構文解析は、文中でどの単語が互いに関連しているかを認識することです。例えば、the quick red fox jumpedは形容詞-名詞-動詞のシーケンスであり、lazy brown dogのシーケンスとは別です。
大量のテキストを分析する際に役立つ手法の一つは、興味のあるすべての単語やフレーズの辞書を作成し、それがどれだけ頻繁に出現するかを記録することです。例えば、the quick red fox jumped over the lazy brown dogというフレーズでは、theの頻度は2です。
以下は、単語の頻度を数える例です。ラドヤード・キップリングの詩「The Winners」には次のような一節があります:
What the moral? Who rides may read.
When the night is thick and the tracks are blind
A friend at a pinch is a friend, indeed,
But a fool to wait for the laggard behind.
Down to Gehenna or up to the Throne,
He travels the fastest who travels alone.
フレーズの頻度は必要に応じて大文字小文字を区別することもできます。例えば、a friendの頻度は2、theの頻度は6、travelsの頻度は2です。
テキストを一定の長さの単語のシーケンスに分割することができます。1単語(ユニグラム)、2単語(バイグラム)、3単語(トライグラム)、または任意の数の単語(N-グラム)です。
例えば、the quick red fox jumped over the lazy brown dogをN-グラムスコア2で分割すると、以下のN-グラムが生成されます:
- the quick
- quick red
- red fox
- fox jumped
- jumped over
- over the
- the lazy
- lazy brown
- brown dog
これをスライディングボックスとして文に適用すると視覚的に理解しやすくなります。以下は3単語のN-グラムの場合です。各文でN-グラムが太字で示されています:
- the quick red fox jumped over the lazy brown dog
- the quick red fox jumped over the lazy brown dog
- the quick red fox jumped over the lazy brown dog
- the quick red fox jumped over the lazy brown dog
- the quick red fox jumped over the lazy brown dog
- the quick red fox jumped over the lazy brown dog
- the quick red fox jumped over the lazy brown dog
- the quick red fox jumped over the lazy brown dog
N-グラム値3:インフォグラフィック作成者:Jen Looper
ほとんどの文には、主語または目的語となる名詞があります。英語では、しばしばa、an、theがその前に付くことで識別できます。文の意味を理解しようとする際に、名詞句を抽出することは自然言語処理で一般的なタスクです。
✅ 文「I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun.」では、名詞句を特定できますか?
文the quick red fox jumped over the lazy brown dogには2つの名詞句があります:quick red foxとlazy brown dog。
文やテキストは、ポジティブまたはネガティブな感情を分析することができます。感情は極性と客観性/主観性で測定されます。極性は-1.0から1.0(ネガティブからポジティブ)、客観性は0.0から1.0(最も客観的から最も主観的)で測定されます。
✅ 後で学ぶように、機械学習を使用して感情を判断する方法はさまざまですが、一つの方法として、人間の専門家がポジティブまたはネガティブに分類した単語やフレーズのリストを使用し、そのモデルをテキストに適用して極性スコアを計算する方法があります。この方法がうまく機能する場合とそうでない場合がある理由を考えてみてください。
語形変化を使用すると、単語の単数形または複数形を取得することができます。
レンマは、一連の単語の根本的な単語または見出し語です。例えば、flew、flies、flyingのレンマは動詞flyです。
自然言語処理研究者にとって便利なデータベースもあります。特に以下が挙げられます:
WordNetは、単語、同義語、反意語、その他多くの詳細をさまざまな言語で提供するデータベースです。翻訳、スペルチェッカー、またはあらゆる種類の言語ツールを構築する際に非常に役立ちます。
幸いなことに、これらの技術をすべて自分で構築する必要はありません。自然言語処理や機械学習に特化していない開発者でも利用しやすい優れたPythonライブラリが利用可能です。次のレッスンではこれらの例をさらに詳しく学びますが、ここでは次のタスクに役立ついくつかの便利な例を紹介します。
TextBlobというライブラリを使用してみましょう。このライブラリには、これらの種類のタスクに取り組むための便利なAPIが含まれています。TextBlobは「NLTKとpatternの巨人の肩の上に立ち、両者とうまく連携します。」そのAPIにはかなりの量の機械学習が組み込まれています。
注:Quick Startガイドは、経験豊富なPython開発者に推奨されます。
名詞句を特定しようとする際、TextBlobは名詞句を見つけるためのいくつかの抽出オプションを提供しています。
-
ConllExtractorを見てみましょう。from textblob import TextBlob from textblob.np_extractors import ConllExtractor # import and create a Conll extractor to use later extractor = ConllExtractor() # later when you need a noun phrase extractor: user_input = input("> ") user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified np = user_input_blob.noun_phrases
ここで何が起こっているのでしょうか?ConllExtractorは「ConLL-2000トレーニングコーパスで学習されたチャンク解析を使用する名詞句抽出器」です。ConLL-2000は、2000年の計算自然言語学習会議を指します。この会議では毎年、難しい自然言語処理の問題に取り組むワークショップが開催され、2000年には名詞チャンク化がテーマでした。モデルはWall Street Journalを基に学習され、「セクション15-18をトレーニングデータ(211727トークン)として使用し、セクション20をテストデータ(47377トークン)として使用」しました。使用された手順はこちらで確認でき、結果も参照できます。
前のレッスンでは非常にシンプルなQ&Aボットを作成しました。今回は、入力を感情分析してその感情に応じた応答を出力することで、マーヴィンを少し共感的にします。また、noun_phraseを特定してそのトピックについてさらに質問する必要があります。
より良い会話型ボットを構築する際の手順:
- ユーザーにボットとの対話方法を説明する指示を表示
- ループ開始
- ユーザー入力を受け取る
- ユーザーが終了を要求した場合は終了
- ユーザー入力を処理し、適切な感情応答を決定
- 感情に名詞句が含まれている場合は、それを複数形にしてそのトピックについてさらに質問
- 応答を表示
- ステップ2に戻る
以下はTextBlobを使用して感情を判断するコードスニペットです。感情応答のグラデーションは4つしかありません(必要に応じて増やすこともできます):
if user_input_blob.polarity <= -0.5:
response = "Oh dear, that sounds bad. "
elif user_input_blob.polarity <= 0:
response = "Hmm, that's not great. "
elif user_input_blob.polarity <= 0.5:
response = "Well, that sounds positive. "
elif user_input_blob.polarity <= 1:
response = "Wow, that sounds great. "以下はサンプル出力の例です(ユーザー入力は>で始まる行にあります):
Hello, I am Marvin, the friendly robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?
> I am ok
Well, that sounds positive. Can you tell me more?
> I went for a walk and saw a lovely cat
Well, that sounds positive. Can you tell me more about lovely cats?
> cats are the best. But I also have a cool dog
Wow, that sounds great. Can you tell me more about cool dogs?
> I have an old hounddog but he is sick
Hmm, that's not great. Can you tell me more about old hounddogs?
> bye
It was nice talking to you, goodbye!
タスクの一つの解決策はこちらにあります。
✅ 知識チェック
- 共感的な応答は、ボットが実際にユーザーを理解していると思わせることができるでしょうか?
- 名詞句を特定することで、ボットはより「信じられる」ものになるでしょうか?
- 文から名詞句を抽出することは、なぜ有用なのでしょうか?
前の知識チェックでのボットを実装し、友人にテストしてもらいましょう。それが友人を騙せるかどうか試してみてください。ボットをより「信じられる」ものにすることはできますか?
前の知識チェックでのタスクを実装してみましょう。ボットを友人にテストしてもらいましょう。それが友人を騙せるかどうか試してみてください。ボットをより「信じられる」ものにすることはできますか?
次のいくつかのレッスンでは感情分析についてさらに学びます。この興味深い技術についてKDNuggetsの記事などを調べてみてください。
免責事項:
この文書は、AI翻訳サービス Co-op Translator を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確さが含まれる可能性があります。元の言語で記載された原文が正式な情報源と見なされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤認について、当社は一切の責任を負いません。



