|
|
# 自然言語処理の入門
|
|
|
|
|
|
このレッスンでは、*計算言語学*の一分野である*自然言語処理*の簡単な歴史と重要な概念を紹介します。
|
|
|
|
|
|
## [講義前のクイズ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/31/)
|
|
|
|
|
|
## はじめに
|
|
|
|
|
|
NLP(自然言語処理)は、機械学習が適用され、実際のソフトウェアで使用されている最もよく知られた分野の一つです。
|
|
|
|
|
|
✅ 日常的に使用しているソフトウェアの中で、NLPが組み込まれているものを考えてみてください。例えば、ワードプロセッサやモバイルアプリなど。
|
|
|
|
|
|
このレッスンで学ぶこと:
|
|
|
|
|
|
- **言語の概念**。言語がどのように発展し、主要な研究分野が何であったか。
|
|
|
- **定義と概念**。コンピュータがテキストを処理する方法に関する定義と概念、例えばパーシング、文法、名詞と動詞の識別などを学びます。このレッスンにはいくつかのコーディングタスクが含まれており、次のレッスンでコーディングを学ぶための重要な概念がいくつか紹介されます。
|
|
|
|
|
|
## 計算言語学
|
|
|
|
|
|
計算言語学は、何十年にもわたる研究と開発の分野で、コンピュータが言語をどのように扱い、さらには理解し、翻訳し、コミュニケーションできるかを研究します。自然言語処理(NLP)は、コンピュータが「自然」な、つまり人間の言語をどのように処理できるかに焦点を当てた関連分野です。
|
|
|
|
|
|
### 例 - 音声入力
|
|
|
|
|
|
もし、タイピングの代わりに電話に向かって話したり、仮想アシスタントに質問をしたことがあるなら、その音声はテキスト形式に変換され、話した言語から処理または*パース*されました。検出されたキーワードは、その後、電話やアシスタントが理解し、実行できる形式に処理されました。
|
|
|
|
|
|

|
|
|
> 本当の言語理解は難しい!画像提供:[Jen Looper](https://twitter.com/jenlooper)
|
|
|
|
|
|
### この技術はどのように実現されているのか?
|
|
|
|
|
|
これは、誰かがこのためのコンピュータプログラムを書いたからです。数十年前、一部のSF作家は、人々が主にコンピュータに話しかけ、コンピュータが常に彼らの意味を正確に理解するだろうと予測しました。残念ながら、これは多くの人が想像したよりも難しい問題であることが判明しました。今日では、問題ははるかに理解されていますが、文の意味を理解する際に「完璧な」自然言語処理を達成するには重大な課題があります。特に、ユーモアや皮肉などの感情を理解することは非常に難しい問題です。
|
|
|
|
|
|
この時点で、学校の授業で先生が文の文法の部分を教えたことを思い出すかもしれません。いくつかの国では、学生は文法や言語学を専用の科目として教えられますが、多くの国では、これらのトピックは言語を学ぶ一環として含まれています:小学校での最初の言語(読み書きを学ぶ)や、中学校や高校での第二言語などです。名詞と動詞や副詞と形容詞を区別するのが苦手でも心配しないでください!
|
|
|
|
|
|
*現在形*と*現在進行形*の違いに苦労している場合、それはあなた一人ではありません。これは多くの人、特にその言語のネイティブスピーカーにとっても難しいことです。良いニュースは、コンピュータは形式的なルールを適用するのが非常に得意であり、人間と同じように文を*パース*するコードを書くことを学ぶことができるということです。後で検討する大きな課題は、文の*意味*や*感情*を理解することです。
|
|
|
|
|
|
## 前提条件
|
|
|
|
|
|
このレッスンの主な前提条件は、このレッスンの言語を読んで理解できることです。数学の問題や方程式を解く必要はありません。元の著者はこのレッスンを英語で書きましたが、他の言語にも翻訳されているため、翻訳を読んでいる可能性もあります。異なる言語の文法ルールを比較するために、いくつかの異なる言語が使用される例があります。これらは翻訳されていませんが、説明文は翻訳されているため、意味は明確です。
|
|
|
|
|
|
コーディングタスクでは、Pythonを使用し、例はPython 3.8を使用しています。
|
|
|
|
|
|
このセクションで必要なのは:
|
|
|
|
|
|
- **Python 3の理解**。Python 3でのプログラミング言語の理解。このレッスンでは、入力、ループ、ファイルの読み取り、配列を使用します。
|
|
|
- **Visual Studio Code + 拡張機能**。Visual Studio CodeとそのPython拡張機能を使用します。または、お好みのPython IDEを使用することもできます。
|
|
|
- **TextBlob**。 [TextBlob](https://github.com/sloria/TextBlob) はPythonの簡易テキスト処理ライブラリです。TextBlobのサイトの指示に従ってシステムにインストールしてください(以下のようにコーパスもインストールします):
|
|
|
|
|
|
```bash
|
|
|
pip install -U textblob
|
|
|
python -m textblob.download_corpora
|
|
|
```
|
|
|
|
|
|
> 💡 Tip: VS Code環境でPythonを直接実行できます。詳細は[docs](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott)を参照してください。
|
|
|
|
|
|
## 機械との対話
|
|
|
|
|
|
コンピュータが人間の言語を理解しようとする歴史は数十年にわたり、自然言語処理を考えた最初の科学者の一人は*アラン・チューリング*です。
|
|
|
|
|
|
### 'チューリングテスト'
|
|
|
|
|
|
チューリングが1950年代に*人工知能*を研究していたとき、人間とコンピュータ(タイプされた通信を介して)に会話テストを行い、人間が他の人間と会話しているのかコンピュータと会話しているのかを確信できない場合を考えました。
|
|
|
|
|
|
一定の会話時間の後、人間が回答がコンピュータからのものであるかどうかを判断できなかった場合、そのコンピュータは*考えている*と言えるのでしょうか?
|
|
|
|
|
|
### インスピレーション - '模倣ゲーム'
|
|
|
|
|
|
このアイデアは、*模倣ゲーム*と呼ばれるパーティーゲームから来ました。このゲームでは、尋問者が一人部屋にいて、別の部屋にいる二人の人物(男性と女性)を識別する任務を負います。尋問者はメモを送ることができ、書かれた回答から謎の人物の性別を明らかにする質問を考えなければなりません。もちろん、別の部屋にいるプレイヤーたちは、正直に答えているように見せながら、尋問者を誤解させたり混乱させたりするような回答をすることで、尋問者を欺こうとします。
|
|
|
|
|
|
### エリザの開発
|
|
|
|
|
|
1960年代、MITの科学者*ジョセフ・ワイゼンバウム*は、[エリザ](https://wikipedia.org/wiki/ELIZA)というコンピュータ「セラピスト」を開発しました。エリザは人間に質問をし、彼らの回答を理解しているかのように見せかけました。しかし、エリザは文を解析し、特定の文法構造やキーワードを識別して合理的な回答をすることができましたが、文を*理解*しているとは言えませんでした。例えば、エリザが「**私は** <u>悲しい</u>」という形式の文を提示された場合、エリザは文の単語を並べ替え、置き換えて「**あなたは** <u>悲しい</u> 期間はどれくらいですか?」という回答を形成するかもしれません。
|
|
|
|
|
|
これは、エリザが文を理解し、続けて質問をしているかのような印象を与えましたが、実際には時制を変更し、いくつかの単語を追加していただけでした。エリザが回答するキーワードを識別できない場合、代わりに多くの異なる文に適用できるランダムな回答を返すことになります。例えば、ユーザーが「**あなたは** <u>自転車</u>」と書いた場合、エリザは「**私は** <u>自転車</u> 期間はどれくらいですか?」と回答するかもしれません。もっと合理的な回答ではなく。
|
|
|
|
|
|
[](https://youtu.be/RMK9AphfLco "エリザとのチャット")
|
|
|
|
|
|
> 🎥 上の画像をクリックして、オリジナルのELIZAプログラムについてのビデオをご覧ください
|
|
|
|
|
|
> 注:1966年に公開された[エリザ](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract)のオリジナルの説明を読むことができます。ACMアカウントを持っている場合、または[wikipedia](https://wikipedia.org/wiki/ELIZA)でエリザについて読むこともできます。
|
|
|
|
|
|
## 演習 - 基本的な会話ボットのコーディング
|
|
|
|
|
|
エリザのような会話ボットは、ユーザー入力を引き出し、理解しているかのように見せかけて応答するプログラムです。エリザとは異なり、私たちのボットは知的な会話をしているように見せかけるためのいくつかのルールを持っていません。代わりに、私たちのボットは、ほぼどんな些細な会話にも使えるランダムな応答を持つだけです。
|
|
|
|
|
|
### 計画
|
|
|
|
|
|
会話ボットを作成する際のステップ:
|
|
|
|
|
|
1. ユーザーにボットとの対話方法を指示するテキストを表示
|
|
|
2. ループを開始
|
|
|
1. ユーザー入力を受け取る
|
|
|
2. ユーザーが終了を求めた場合は終了する
|
|
|
3. ユーザー入力を処理し、応答を決定する(この場合、応答は可能な一般的な応答のリストからランダムに選ばれる)
|
|
|
4. 応答を表示する
|
|
|
3. ステップ2に戻る
|
|
|
|
|
|
### ボットの作成
|
|
|
|
|
|
次にボットを作成しましょう。まず、いくつかのフレーズを定義します。
|
|
|
|
|
|
1. 次のランダムな応答を持つPythonでこのボットを作成します:
|
|
|
|
|
|
```python
|
|
|
random_responses = ["That is quite interesting, please tell me more.",
|
|
|
"I see. Do go on.",
|
|
|
"Why do you say that?",
|
|
|
"Funny weather we've been having, isn't it?",
|
|
|
"Let's change the subject.",
|
|
|
"Did you catch the game last night?"]
|
|
|
```
|
|
|
|
|
|
以下は、参考のためのサンプル出力です(ユーザー入力は`>`で始まる行です):
|
|
|
|
|
|
```output
|
|
|
Hello, I am Marvin, the simple robot.
|
|
|
You can end this conversation at any time by typing 'bye'
|
|
|
After typing each answer, press 'enter'
|
|
|
How are you today?
|
|
|
> I am good thanks
|
|
|
That is quite interesting, please tell me more.
|
|
|
> today I went for a walk
|
|
|
Did you catch the game last night?
|
|
|
> I did, but my team lost
|
|
|
Funny weather we've been having, isn't it?
|
|
|
> yes but I hope next week is better
|
|
|
Let's change the subject.
|
|
|
> ok, lets talk about music
|
|
|
Why do you say that?
|
|
|
> because I like music!
|
|
|
Why do you say that?
|
|
|
> bye
|
|
|
It was nice talking to you, goodbye!
|
|
|
```
|
|
|
|
|
|
タスクの一つの可能な解決策は[こちら](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py)です
|
|
|
|
|
|
✅ 考えてみてください
|
|
|
|
|
|
1. ランダムな応答がボットが実際に理解していると思わせることができると思いますか?
|
|
|
2. ボットがより効果的になるためにはどんな機能が必要ですか?
|
|
|
3. ボットが本当に文の意味を理解できるなら、会話の前の文の意味も「覚えて」おく必要があるでしょうか?
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🚀チャレンジ
|
|
|
|
|
|
上記の「考えてみてください」の要素の一つを選び、それをコードに実装するか、擬似コードを使用して紙に解決策を書いてみてください。
|
|
|
|
|
|
次のレッスンでは、自然言語のパースと機械学習の他のアプローチについて学びます。
|
|
|
|
|
|
## [講義後のクイズ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/32/)
|
|
|
|
|
|
## 復習と自己学習
|
|
|
|
|
|
以下の参考文献をさらに読み進める機会としてご覧ください。
|
|
|
|
|
|
### 参考文献
|
|
|
|
|
|
1. Schubert, Lenhart, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = <https://plato.stanford.edu/archives/spr2020/entries/computational-linguistics/>.
|
|
|
2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010.
|
|
|
|
|
|
## 課題
|
|
|
|
|
|
[ボットを探す](assignment.md)
|
|
|
|
|
|
**免責事項**:
|
|
|
この文書は機械ベースのAI翻訳サービスを使用して翻訳されています。正確さを期すよう努めておりますが、自動翻訳には誤りや不正確さが含まれる可能性があります。権威ある情報源としては、原文の言語の文書を参照してください。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用により生じる誤解や誤訳については、当社は一切の責任を負いません。 |