<jupyter_start><jupyter_text>Natural Language Processing Tutorial (NLP101) - Level Beginner **Created using:PyCaret 2.0**  **Date Updated:2020年8月24日**日 1.0 チュートリアルの目的自然言語処理チュートリアル **(NLP101)** へようこそ。このチュートリアルは、あなたがPyCaretの初心者で、 `pycaret.nlp` モジュールを使って自然言語処理を始めようとしているものと仮定しています。このチュートリアルでは、以下のことを学びます。**データの取得:** PyCaretのリポジトリからデータをインポートするには？**環境の設定:** PyCaret で環境を設定し、重要なテキスト前処理を行うには？**モデルの作成:** トピックモデルの作成方法?**Assign Model:** 学習したモデルを用いて、ドキュメントやテキストをトピックに割り当てるには？**Plot Model:** トピックモデルやコーパス全体を様々なプロットで分析する方法 **Save / Load Model:** How to save/load model for future use?読了時間：約30分 1.1 PyCaret のインストールPyCaret を使い始めるための最初のステップは pycaret をインストールすることです。pycaret のインストールは簡単で、数分しかかかりません。以下の手順に従ってください。 ローカル Jupyter Notebook に PyCaret をインストールする`pip install pycaret`  Jupyter Notebook に PyCaret をインストールする。 Google ColabまたはAzureノートブックへのPyCaretのインストール`!pip install pycaret` 1.2 前提条件- Python 3.6 以上 - PyCaret 2.0 以上- pycaret のリポジトリからデータをロードするためのインターネット接続- NLP の基本的な知識`from pycaret.utils import enable_colab``enable_colab()`は、Google colabでこのノートブックを実行する場合、対話型のビジュアルを表示するには、ノートブックの先頭で次のセルのコードを実行しなければなりません。 1.4 See also:- __[Natural Language Processing Tutorial (NLP102) - Level Intermediate](https://github.com/pycaret/pycaret/blob/master/tutorials/Natural%20Language%20Processing%20Tutorial%20Level%20Intermediate%20-%20NLP102.ipynb)__- __[Natural Language Processing Tutorial (NLP103) - Level Expert](https://github.com/pycaret/pycaret/blob/master/tutorials/Natural%20Language%20Processing%20Tutorial%20Level%20Expert%20-%20NLP103.ipynb)__  2.0 What is Natural Language Processing?自然言語処理（NLP）とは、人間が自然に使っている言語を分析・理解・生成し、コンピュータ言語ではなく、人間の自然な言葉を使って、文章や話し言葉の文脈でコンピュータと対話することを扱う人工知能の一分野である。機械学習におけるNLPの一般的な使用例としては、以下のようなものがある。- トピックの発見とモデリング：テキストコレクションの意味とテーマを捕らえ、トピックモデリングなどの高度なモデリング技術を適用して、類似した文書をグループ化する。- **文書要約**:大量のテキストの要約を自動的に生成します。- **音声** -テキストおよびテキスト-音声変換:**書かれたテキストに音声コマンドを変換し、その逆。- **機械翻訳:**ある言語から別のテキストまたは音声の自動翻訳。  __[自然言語処理についてもっと知りたい](https://en.wikipedia.org/wiki/Natural_language_processing)__  3.0 Overview of Natural Language Processing Module in PyCaretPyCaret の NLP モジュール (`pycaret.nlp`) は教師なし機械学習モジュールで、トピックモデルを作成してテキストデータを分析し、ドキュメントに隠れた意味構造を見つけるために使用することができます。PyCaret の NLP モジュールは、あらゆる NLP 問題の基本ステップである、幅広いテキスト前処理技術を内蔵しています。これは、機械学習アルゴリズムが学習できる形式に生テキストを変換するものです。最初のリリースでは、PyCaretのNLPモジュールは `English` 言語のみをサポートし、 Latent Dirichlet Allocation から Non-Negative Matrix Factorization まで、トピックモデルのいくつかの有名な実装を提供します。また、5つ以上のアルゴリズムと10以上のプロットが用意されており、テキストを分析することができます。PyCaret の NLP モジュールは、ユニークな関数 `tune_model()` を実装しており、分類のための `AUC` や回帰のための `R2` といった教師あり学習の目的を最適化するために、トピックモデルのハイパーパラメータを調整することもできます。  4.0 Dataset for the Tutorial このチュートリアルでは、**Kiva Microfunds** https://www.kiva.org/ のデータを使用する予定です。Kiva Microfundsは、個人が世界中の低所得の起業家や学生にお金を貸すことを可能にする非営利団体です。2005年に始まって以来、Kivaは約98％の返済率で何百万ものローンをクラウドファンディングしてきました。Kivaでは、各融資依頼には、性別や場所など借り手の従来の人口統計学的情報と、個人的なストーリーの両方が含まれています。このチュートリアルでは、パーソナルストーリーで与えられたテキストを使って、データセットの洞察を深め、テキストに隠された意味構造を理解します。データセットには6,818のサンプルが含まれています。特徴量の簡単な説明は以下の通り。- **country:** country of borrower- **en:** personal story of borrower when applied for loan- **gender:** Gender (M=male, F=female)- **loan_amount:** amount of loan approved and disbursed- **nonpayment:** Type of lender (Lender = Kiva website上の個人の登録ユーザー, Partner = ローンを見つけて資金提供するKivaと連携したマイクロファイナンスの機関)- **sector:** sector of borrower- **status:** status of loan (1-default, 0-repaid)このチュートリアルでは、`en`カラムのみを用いてトピックモデルを作成する。次回のチュートリアル __[自然言語処理 (NLP102) - Level Intermediate](https://github.com/pycaret/pycaret/blob/master/tutorials/Natural%20Language%20Processing%20Tutorial%20Level%20Intermediate%20-%20NLP102.ipynb)__ では、トピックモデルを用いて、ローンの「状態」を予測する分類器を構築し、申請者がデフォルトになるかどうかを知ることにします。 Dataset Acknowledgement: Kiva Microfunds https://www.kiva.org/  5.0 Getting the Data PyCaret の git リポジトリ __[Click Here to Download](https://github.com/pycaret/pycaret/blob/master/datasets/kiva.csv)__ からデータをダウンロードするか、 `get_data()` 関数を用いてデータをロードします（インターネット接続が必要です）。<jupyter_code>from pycaret.datasets import get_data
data = get_data('kiva')
#check the shape of data
data.shape
# sampling the data to select only 1000 documents
data = data.sample(1000, random_state=786).reset_index(drop=True)
data.shape<jupyter_output><empty_output><jupyter_text>6.0 Setting up Environment in PyCaret `setup()`関数はpycaretの環境を初期化し、自然言語処理問題を扱う上で不可欠ないくつかのテキスト前処理を行います。setupはpycaretの他の関数を実行する前に呼び出す必要があります。setup は、pandas dataframe と `target` パラメータとして渡されるテキストカラムの名前という2つのパラメータを受け取ります。テキストを含む `list` を渡すこともできますが、その場合は `target` パラメータを渡す必要はありません。セットアップが実行されると、以下の前処理が自動的に適用される。- **数値文字の除去:** すべての数値文字がテキストから除去されます。- **特殊文字の除去:** 英数字以外の特殊文字はすべて削除されます。- **単語のトークン化：**単語のトークン化とは、大きなテキストサンプルを単語に分割する処理です。これは、さらなる分析のために各単語を個別に捕捉する必要がある自然言語処理タスクの中核となる要件です。__[Read More](https://nlp.stanford.edu/IR-book/html/htmledition/tokenization-1.html)- **ストップワード除去:** ストップワード（またはストップワード）とは、言語的に意味があるかもしれないが、一般的で情報検索にほとんど価値をもたらさないため、テキストからしばしば除去される単語のことである。英語では、このような単語の例として、以下のものがある。例えば、"the", "a", "an", "in" などです。__[Read More](https://en.wikipedia.org/wiki/Stop_words)- **Bigram Extraction:** Bigramとは、トークンの文字列から隣接する2つの要素の並びのことで、通常は文字、音節、単語などが含まれる。例えば、New York という単語はトークン化されると "New" と "York" という2つの異なる単語として認識されますが、十分な回数繰り返されると、Bigram Extraction はその単語を1つ、すなわち "New_York" として表現します __[Read More](https://en.wikipedia.org/wiki/Bigram)- **Trigram Extraction：** bigram 抽出と同様、3つのトークンの列にある、隣接する要素の列を Trigram として表現します。__[Read More](https://en.wikipedia.org/wiki/Trigram)__   - **Lemmatizing:** Lemmatizationとは、単語の屈折した形をグループ化し、単語のレンマ、または辞書形式で識別される、単一の単語として分析できるようにするプロセスである。英語では、単語はいくつかの屈折した形で現れる。たとえば、「歩く」という動詞は、「walk」、「walked」、「walks」、「walking」のように表示されることがあります。辞書で調べると出てくる「walk」という基本形を、その単語のレンマと呼ぶ。__[Read More](https://en.wikipedia.org/wiki/Lemmatisation)__   - **Custom Stopwords:** 多くの場合、テキストには言語の規則上ストップワードではない単語が含まれていますが、それらは全く、あるいはほとんど情報を付加しません。例えば、このチュートリアルでは、loan データセットを使用しています。そのため、「ローン」、「銀行」、「お金」、「ビジネス」のような単語は当たり前すぎて、何の価値もない。また、トピックモデルにも多くのノイズが含まれることがあります。このような単語は `custom_stopwords` パラメータを使ってコーパスから取り除くことができる。次回のチュートリアル __[自然言語処理チュートリアル (NLP102) - 中級編](https://github.com/pycaret/pycaret/blob/master/tutorials/Natural%20Language%20Processing%20Tutorial%20Level%20Intermediate%20-%20NLP102.ipynb)__ では、 `setup()` 内で `custom_stopwords` パラメータを使用するデモを紹介します。  <br**Note :** `pycaret.nlp` のいくつかの機能には英語の言語モデルが必要です。言語モデルはpycaretのインストール時に自動的にダウンロードされません。Anaconda PromptのようなPythonのコマンドラインインターフェイスをダウンロードする必要があります。言語モデルをダウンロードするには、コマンドラインに次のように入力してください。python -m spacy download en_core_web_sm`  `python -m textblob.download_corpora`  と入力してください。<jupyter_code>from pycaret.nlp import *
exp_nlp101 = setup(data = data, target = 'en', session_id = 123)<jupyter_output><empty_output><jupyter_text>Once the setup is succesfully executed it prints the information grid with the following information: - **session_id :**  A pseduo-random number distributed as a seed in all functions for later reproducibility. If no `session_id` is passed, a random number is automatically generated that is distributed to all functions. In this experiment session_id is set as `123` for later reproducibility.- ** Documents :** Number of documents (or samples in dataset if dataframe is passed). - **Vocab Size :** Size of vocabulary in the corpus after applying all text pre-processing such as removal of stopwords, bigram/trigram extraction, lemmatization etc. Notice that all text pre-processing steps are performed automatically when you execute `setup()`. These steps are imperative to perform any NLP experiment. `setup()` function prepares the corpus and dictionary that is ready-to-use for the topic models that you can create using `create_model()` function. Another way to pass the text is in the form of list in which case no `target` parameter is needed.  7.0 Create a Topic Model **What is Topic Model?** In machine learning and natural language processing, a topic model is a type of statistical model for discovering the abstract "topics" that occur in a collection of documents. Topic modeling is a frequently used text-mining tool for discovery of hidden semantic structures in a text body. Intuitively, given that a document is about a particular topic, one would expect particular words to appear in the document more or less frequently: "dog" and "bone" will appear more often in documents about dogs, "cat" and "meow" will appear in documents about cats, and "the" and "is" will appear equally in both. A document typically concerns multiple topics in different proportions; thus, in a document that is 10% about cats and 90% about dogs, there would probably be about 9 times more dog words than cat words. The "topics" produced by topic modeling techniques are clusters of similar words. A topic model captures this intuition in a mathematical framework, which allows examining a set of documents and discovering, based on the statistics of the words in each, what the topics might be and what each document's balance of topics is. __[Read More](https://en.wikipedia.org/wiki/Topic_model)__Creating a topic model in PyCaret is simple and similar to how you would have created a model in supervised modules of pycaret. A topic model is created using `create_model()` function which takes one mandatory parameter i.e. name of model as a string. This function returns a trained model object. There are 5 topic models available in PyCaret. see the docstring of `create_model()` for complete list of models. See an example below where we create Latent Dirichlet Allocation (LDA) model:<jupyter_code>lda = create_model('lda')
print(lda)<jupyter_output>LdaModel(num_terms=4573, num_topics=4, decay=0.5, chunksize=100)<jupyter_text>We have created Latent Dirichlet Allocation (LDA) model with just one word i.e. `create_model()`. Notice the `num_topics` parameter is set to `4` which is a default value taken when you donot pass `num_topics` parameter in `create_model()`. In below example, we will create LDA model with 6 topics and we will also set `multi_core` parameter to `True`. When `multi_core` is set to `True` Latent Dirichlet Allocation (LDA) uses all CPU cores to parallelize and speed up model training.<jupyter_code>lda2 = create_model('lda', num_topics = 6, multi_core = True)
print(lda2)<jupyter_output>LdaModel(num_terms=4573, num_topics=6, decay=0.5, chunksize=100)<jupyter_text>8.0 Assign a Model Now that we have created a topic model, we would like to assign the topic proportions to our dataset (6818 documents / samples) to analyze the results. We will achieve this by using `assign_model()` function. See an example below:<jupyter_code>lda_results = assign_model(lda)
lda_results.head()<jupyter_output><empty_output><jupyter_text>Notice how 6 additional columns are now added to the dataframe. `en` is the text after all pre-processing. `Topic_0 ... Topic_3` are the topic proportions and represents the distribution of topics for each document. `Dominant_Topic` is the topic number with highest proportion and `Perc_Dominant_Topic` is the percentage of dominant topic over 1 (only shown when models are stochastic i.e. sum of all proportions equal to 1) .  9.0 Plot a Model `plot_model()` function can be used to analyze the overall corpus or only specific topics extracted through topic model. Hence the function `plot_model()` can also work without passing any trained model object. See examples below:  9.1 Frequency Distribution of Entire Corpus<jupyter_code>plot_model()<jupyter_output><empty_output><jupyter_text>9.2 Top 100 Bigrams on Entire Corpus<jupyter_code>plot_model(plot = 'bigram')<jupyter_output><empty_output><jupyter_text>9.3 Frequency Distribution of Topic 1 `plot_model()` can also be used to analyze the same plots for specific topics. To generate plots at topic level, function requires trained model object to be passed inside `plot_model()`. In example below we will generate frequency distribution on `Topic 1` only as defined by `topic_num` parameter.<jupyter_code>plot_model(lda, plot = 'frequency', topic_num = 'Topic 1')<jupyter_output><empty_output><jupyter_text>9.4 Topic Distribution<jupyter_code>plot_model(lda, plot = 'topic_distribution')<jupyter_output><empty_output><jupyter_text>Each document is a distribution of topics and not a single topic. Although, if the task is of categorizing document into specific topics, it wouldn't be wrong to use the topic proportion with highest value to categorize the document into **a topic**. In above plot, each document is categorized into one topic using the largest proportion of topic weights. We can see most of the documents are in `Topic 3` with only few in `Topic 1`. If you hover over these bars, you will get basic idea of themes in this topic by looking at the keywords. For example if you evaluate `Topic 2`, you will see keywords words like 'farmer', 'rice', 'land', which probably means that the loan applicants in this category pertains to agricultural/farming loans. However, if you hover over `Topic 0` and `Topic 3` you will observe lot of repitions and keywords are overlapping in all topics such as word "loan" and "business" appears both in `Topic 0` and `Topic 3`. In next tutorial, __[Natural Language Processing Tutorial (NLP102) - Level Intermediate](https://github.com/pycaret/pycaret/blob/master/Tutorials/Natural%20Language%20Processing%20Tutorial%20Level%20Intermediate%20-%20NLP102.ipynb)__ we will demonstrate the use of `custom_stopwords` at which point we will re-analyze this plot.  9.5 T-distributed Stochastic Neighbor Embedding (t-SNE)<jupyter_code>plot_model(lda, plot = 'tsne')<jupyter_output><empty_output><jupyter_text>T-distributed Stochastic Neighbor Embedding (t-SNE) is a nonlinear dimensionality reduction technique well-suited for embedding high-dimensional data for visualization in a low-dimensional space of two or three dimensions. __[Learn More](https://en.wikipedia.org/wiki/T-distributed_stochastic_neighbor_embedding)__  9.6 Uniform Manifold Approximation and Projection Plot<jupyter_code>plot_model(lda, plot = 'umap')<jupyter_output><empty_output><jupyter_text>UMAP (Uniform Manifold Approximation and Projection) is a novel manifold learning technique for dimensionality reduction. It is similar to tSNE and PCA in its purpose as all of them are techniques to reduce dimensionality for 2d/3d projections. UMAP is constructed from a theoretical framework based in Riemannian geometry and algebraic topology. __[Learn More](https://towardsdatascience.com/how-exactly-umap-works-13e3040e1668)__  10.0 Evaluate Model Another way to analyze performance of models is to use `evaluate_model()` function which displays a user interface for all of the available plots for a given model. It internally uses the `plot_model()` function. See below example where we have generated Sentiment Polarity Plot for `Topic 3` using LDA model stored in `lda` variable.<jupyter_code>evaluate_model(lda)<jupyter_output><empty_output><jupyter_text>11.0 Saving the model As you get deeper into Natural Language Processing, you will learn that training time of topic models increases exponentially as the size of corpus increases. As such, if you would like to continue your experiment or analysis at a later point, you don't need to repeat the entire experiment and re-train your model. PyCaret inbuilt function `save_model()` allows you to save the model for later use.<jupyter_code>save_model(lda,'Final LDA Model 08Feb2020')<jupyter_output>Model Succesfully Saved<jupyter_text>12.0 Loading the model To load a saved model on a future date in the same or different environment, we would use the PyCaret's `load_model()` function.<jupyter_code>saved_lda = load_model('Final LDA Model 08Feb2020')
print(saved_lda)<jupyter_output>LdaModel(num_terms=4573, num_topics=4, decay=0.5, chunksize=100)
{'fraction_non_alphanumeric': 0.0837173579109063, 'fraction_numerical': 0.01894521249359959, 'mean_word_length': 7.297928836962294, 'pattern_counts': {'":': 0, '<': 54, '<?xml version=': 0, '>': 53, 'https://': 17, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '14', 'dir': 'jupyter-structured-clean-dedup', 'id': '511506', 'license': 'MIT', 'n_tokens_mistral': 7041, 'n_tokens_neox': 6460, 'n_words': 1518, 'path': 'tutorials/Japanese/JA-Natural Language Processing Tutorial Level Beginner - NLP101.ipynb', 'repo_name': 'hanaseleb/pycaret', 'size': '15624'}