# 自然言語処理の紹介 このレッスンでは、*計算言語学*の一分野である*自然言語処理*の簡単な歴史と重要な概念について学びます。 ## [講義前のクイズ](https://ff-quizzes.netlify.app/en/ml/) ## はじめに 一般的にNLP(自然言語処理)として知られるこの分野は、機械学習が適用され、実際のソフトウェアで使用されている最もよく知られた分野の一つです。 ✅ 毎日使っているソフトウェアの中で、NLPが組み込まれているものを思い浮かべてみてください。例えば、ワードプロセッサや普段使っているモバイルアプリなどはどうでしょうか? このレッスンで学ぶ内容は以下の通りです: - **言語の概念**。言語がどのように発展してきたのか、そして主要な研究分野について学びます。 - **定義と概念**。テキストを処理する際のコンピュータの仕組みについて、パース、文法、名詞や動詞の識別などの定義と概念を学びます。このレッスンではいくつかのコーディング課題があり、次のレッスンで実際にコードを書くための重要な概念がいくつか紹介されます。 ## 計算言語学 計算言語学は、コンピュータがどのように言語を扱い、理解し、翻訳し、さらには言語でコミュニケーションを取ることができるかを研究する、何十年にもわたる研究開発の分野です。自然言語処理(NLP)は、コンピュータが「自然な」つまり人間の言語を処理する方法に焦点を当てた関連分野です。 ### 例 - スマートフォンの音声入力 スマートフォンに音声入力をしたり、バーチャルアシスタントに質問をしたことがあるなら、あなたの音声はテキスト形式に変換され、その後、話した言語から処理、つまり*パース*されます。検出されたキーワードは、スマートフォンやアシスタントが理解し、動作できる形式に処理されます。 ![理解](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png) > 言語の本当の理解は難しい!画像提供:[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 ``` > 💡 ヒント: PythonはVS Code環境内で直接実行できます。詳細は[ドキュメント](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott)を確認してください。 ## 機械との会話 コンピュータに人間の言語を理解させようとする試みの歴史は何十年も前に遡ります。自然言語処理を最初に考えた科学者の一人が*アラン・チューリング*です。 ### 「チューリングテスト」 1950年代にチューリングが*人工知能*を研究していた際、ある会話テストを考案しました。それは、人間とコンピュータが(タイピングによる通信を通じて)会話を行い、その会話の中で人間が相手が人間かコンピュータかを判別できない場合、コンピュータは*思考している*と言えるのではないか、というものでした。 ### インスピレーション - 「模倣ゲーム」 このアイデアは、*模倣ゲーム*と呼ばれるパーティーゲームから着想を得ています。このゲームでは、尋問者が一人部屋にいて、別の部屋にいる二人の人物のうち、どちらが男性でどちらが女性かを判別するというものです。尋問者はメモを送ることができ、回答から相手の性別を推測する質問を考えます。一方、別室の二人は尋問者を混乱させるような回答をしつつ、正直に答えているように見せかけるのです。 ### Elizaの開発 1960年代、MITの科学者*ジョセフ・ワイゼンバウム*は、[*Eliza*](https://wikipedia.org/wiki/ELIZA)というコンピュータ「セラピスト」を開発しました。Elizaは人間に質問をし、回答を理解しているかのように見せかけるものでした。しかし、Elizaは文をパースして特定の文法構造やキーワードを識別し、それに基づいて適切な回答を生成することはできましたが、文を*理解*しているとは言えませんでした。例えば、Elizaが「**私は** 悲しい」という文を受け取った場合、その文の単語を並べ替えたり置き換えたりして「どのくらいの間**あなたは** 悲しいのですか?」という回答を生成することができました。 これにより、Elizaがその文を理解し、続く質問をしているかのような印象を与えましたが、実際には時制を変更し、いくつかの単語を追加しているだけでした。もしElizaが対応するキーワードを識別できなかった場合、代わりに多くの異なる文に適用可能なランダムな回答を生成しました。例えば、ユーザーが「**あなたは** 自転車です」と書いた場合、Elizaは「どのくらいの間**私は** 自転車ですか?」と回答するかもしれません。もっと理にかなった回答をする代わりに。 [![Elizaとの会話](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Elizaとの会話") > 🎥 上の画像をクリックすると、オリジナルのELIZAプログラムに関する動画が見られます。 > 注: [Eliza](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract)の1966年のオリジナル記述をACMアカウントを持っている場合に読むことができます。または、[Wikipedia](https://wikipedia.org/wiki/ELIZA)でElizaについて読むこともできます。 ## 演習 - 基本的な会話ボットをコーディングする 会話ボット(Elizaのようなもの)は、ユーザー入力を引き出し、理解しているかのように知的に応答するプログラムです。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://ff-quizzes.netlify.app/en/ml/) ## 復習と自己学習 以下の参考文献を読んで、さらに学びを深めてください。 ### 参考文献 1. Schubert, Lenhart, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = . 2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010. ## 課題 [ボットを探す](assignment.md) --- **免責事項**: この文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知ください。元の言語で記載された文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤った解釈について、当方は責任を負いません。