diff --git a/docs/en/transformer_entries/ZeroShotNer.md b/docs/en/transformer_entries/ZeroShotNer.md index f9623d9330980c..1d7a96e1528921 100644 --- a/docs/en/transformer_entries/ZeroShotNer.md +++ b/docs/en/transformer_entries/ZeroShotNer.md @@ -11,6 +11,9 @@ used to recognize entities. The definitions of entities is given by a dictionary specifying a set of questions for each entity. The model is based on RoBertaForQuestionAnswering. +For more extended examples see the +[Examples](https://github.com/JohnSnowLabs/spark-nlp/blob/master/examples/python/annotation/text/english/named-entity-recognition/ZeroShot_NER.ipynb). + Pretrained models can be loaded with `pretrained` of the companion object: ```scala diff --git a/examples/bak2.Text_Preprocessing_with_SparkNLP_Annotators_Transformers.ipynb b/examples/bak2.Text_Preprocessing_with_SparkNLP_Annotators_Transformers.ipynb deleted file mode 100644 index cd9972a1a0bb43..00000000000000 --- a/examples/bak2.Text_Preprocessing_with_SparkNLP_Annotators_Transformers.ipynb +++ /dev/null @@ -1,7131 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "sXatvRX899i0" - }, - "source": [ - "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "9XsAEBYVxeB-" - }, - "source": [ - "\n", - "\n", - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/spark-nlp-workshop/blob/master/tutorials/Certification_Trainings/Public/2.Text_Preprocessing_with_SparkNLP_Annotators_Transformers.ipynb)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Xj5fx5ir-wMt" - }, - "source": [ - "# **Text Preprocessing with Spark NLP**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "H_SG0VCrix5p" - }, - "source": [ - "**Note** Read this article if you want to understand the basic concepts in Spark NLP.\n", - "\n", - "https://towardsdatascience.com/introduction-to-spark-nlp-foundations-and-basic-components-part-i-c83b7629ed59" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "MfkkKkbVF309" - }, - "source": [ - "## **0. Colab Setup**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "iMkMQtZNF2n-" - }, - "outputs": [], - "source": [ - "!pip install -q pyspark==3.3.0 spark-nlp==4.3.0" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "SS07N80gEtSt" - }, - "source": [ - "### **1. Annotators and Transformer Concepts**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "g3_ic8K7E0sy" - }, - "source": [ - "In Spark NLP, all Annotators are either Estimators or Transformers as we see in Spark ML. An Estimator in Spark ML is an algorithm which can be fit on a DataFrame to produce a Transformer. E.g., a learning algorithm is an Estimator which trains on a DataFrame and produces a model. A Transformer is an algorithm which can transform one DataFrame into another DataFrame. E.g., an ML model is a Transformer that transforms a DataFrame with features into a DataFrame with predictions.\n", - "In Spark NLP, there are two types of annotators: AnnotatorApproach and AnnotatorModel\n", - "AnnotatorApproach extends Estimators from Spark ML, which are meant to be trained through fit(), and AnnotatorModel extends Transformers which are meant to transform data frames through transform().\n", - "Some of Spark NLP annotators have a Model suffix and some do not. The model suffix is explicitly stated when the annotator is the result of a training process. Some annotators, such as Tokenizer are transformers but do not contain the suffix Model since they are not trained, annotators. Model annotators have a pre-trained() on its static object, to retrieve the public pre-trained version of a model.\n", - "Long story short, if it trains on a DataFrame and produces a model, it’s an AnnotatorApproach; and if it transforms one DataFrame into another DataFrame through some models, it’s an AnnotatorModel (e.g. WordEmbeddingsModel) and it doesn’t take Model suffix if it doesn’t rely on a pre-trained annotator while transforming a DataFrame (e.g. Tokenizer)." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "x6SaPXwtFBM-" - }, - "source": [ - "By convention, there are three possible names:\n", - "\n", - "**Approach** — Trainable annotator\n", - "\n", - "**Model** — Trained annotator\n", - "\n", - "**nothing** — Either a non-trainable annotator with pre-processing\n", - "step or shorthand for a model\n", - "\n", - "So for example, Stemmer doesn’t say Approach nor Model, however, it is a Model. On the other hand, Tokenizer doesn’t say Approach nor Model, but it has a TokenizerModel(). Because it is not “training” anything, but it is doing some preprocessing before converting into a Model.\n", - "When in doubt, please refer to official documentation and API reference.\n", - "Even though we will do many hands-on practices in the following articles, let us give you a glimpse to let you understand the difference between AnnotatorApproach and AnnotatorModel.\n", - "As stated above, Tokenizer is an AnnotatorModel. So we need to call fit() and then transform()." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ALiQ2TsOFNyc" - }, - "source": [ - "Now let’s see how this can be done in Spark NLP using Annotators and Transformers. Assume that we have the following steps that need to be applied one by one on a data frame.\n", - "\n", - "- Split text into sentences\n", - "- Tokenize\n", - "- Normalize\n", - "- Get word embeddings" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "K0Yy8L-pFb27" - }, - "source": [ - "![image.png](data:image/png;base64,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)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "suLa96N7Fijt" - }, - "source": [ - "**What’s actually happening under the hood?**\n", - "\n", - "When we fit() on the pipeline with Spark data frame (df), its text column is fed into DocumentAssembler() transformer at first and then a new column “document” is created in Document type (AnnotatorType). As we mentioned before, this transformer is basically the initial entry point to Spark NLP for any Spark data frame. Then its document column is fed into SentenceDetector() (AnnotatorApproach) and the text is split into an array of sentences and a new column “sentences” in Document type is created. Then “sentences” column is fed into Tokenizer() (AnnotatorModel) and each sentence is tokenized and a new column “token” in Token type is created. And so on. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 254 - }, - "executionInfo": { - "elapsed": 25398, - "status": "ok", - "timestamp": 1664906807242, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "SDasO3DbKu2Z", - "outputId": "41f67d0d-9012-4c34-f111-b57a8109c482" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Spark NLP version: 4.3.0\n", - "Apache Spark version: 3.3.0\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "

SparkSession - in-memory

\n", - " \n", - "
\n", - "

SparkContext

\n", - "\n", - "

Spark UI

\n", - "\n", - "
\n", - "
Version
\n", - "
v3.3.0
\n", - "
Master
\n", - "
local[*]
\n", - "
AppName
\n", - "
Spark NLP
\n", - "
\n", - "
\n", - " \n", - "
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import sparknlp\n", - "\n", - "spark = sparknlp.start()\n", - "\n", - "print(\"Spark NLP version: \", sparknlp.version())\n", - "print(\"Apache Spark version: \", spark.version)\n", - "\n", - "spark" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Ab6V51l_nPyR" - }, - "source": [ - "### **Create Spark Dataframe**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 7168, - "status": "ok", - "timestamp": 1664906873787, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "qj-Q4LzMGCtQ", - "outputId": "19f8857d-f625-4bf0-b9ba-d39a8927bd30" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------------------------------------------+\n", - "|text |\n", - "+------------------------------------------------+\n", - "|Peter Parker is a nice guy and lives in New York|\n", - "+------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "text = 'Peter Parker is a nice guy and lives in New York'\n", - "\n", - "spark_df = spark.createDataFrame([[text]]).toDF(\"text\")\n", - "\n", - "spark_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 384, - "status": "ok", - "timestamp": 1664906880132, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "SGpOOlBHkPxP", - "outputId": "910c6eab-6d75-4602-ab45-61161cd96efd" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------------+\n", - "| text|\n", - "+--------------------------------------------------------+\n", - "| Peter Parker is a nice guy and lives in New York.|\n", - "|Bruce Wayne is also a nice guy and lives in Gotham City.|\n", - "+--------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "from pyspark.sql.types import StringType, IntegerType\n", - "\n", - "# if you want to create a spark datafarme from a list of strings\n", - "\n", - "text_list = ['Peter Parker is a nice guy and lives in New York.', 'Bruce Wayne is also a nice guy and lives in Gotham City.']\n", - "\n", - "spark.createDataFrame(text_list, StringType()).toDF(\"text\").show(truncate=80)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 875, - "status": "ok", - "timestamp": 1664906889797, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Hz6bw9a6t_Br", - "outputId": "db84014a-c753-43e1-b04f-71df6f27206b" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------------+\n", - "| text|\n", - "+--------------------------------------------------------+\n", - "| Peter Parker is a nice guy and lives in New York.|\n", - "|Bruce Wayne is also a nice guy and lives in Gotham City.|\n", - "+--------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "from pyspark.sql import Row\n", - "\n", - "spark.createDataFrame(list(map(lambda x: Row(text=x), text_list))).show(truncate=80)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ggnHbf1rGn1H" - }, - "outputs": [], - "source": [ - "!wget -q https://raw.githubusercontent.com/JohnSnowLabs/spark-nlp-workshop/master/jupyter/annotation/english/spark-nlp-basics/sample-sentences-en.txt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 6, - "status": "ok", - "timestamp": 1664906901964, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "GaOe_G-OnBVg", - "outputId": "9e7ba134-c689-47a9-f415-6a4c0fd06459" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Peter is a very good person.\n", - "My life in Russia is very interesting.\n", - "John and Peter are brothers. However they don't support each other that much.\n", - "Lucas Nogal Dunbercker is no longer happy. He has a good car though.\n", - "Europe is very culture rich. There are huge churches! and big houses!\n" - ] - } - ], - "source": [ - "with open('./sample-sentences-en.txt') as f:\n", - " print (f.read())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 809, - "status": "ok", - "timestamp": 1664906904383, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "wdrkFmcVGW-o", - "outputId": "5adabd53-3d5c-4e69-f585-ffad494ee1e1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------------------------------------------+\n", - "|text |\n", - "+-----------------------------------------------------------------------------+\n", - "|Peter is a very good person. |\n", - "|My life in Russia is very interesting. |\n", - "|John and Peter are brothers. However they don't support each other that much.|\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |\n", - "+-----------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "spark_df = spark.read.text('./sample-sentences-en.txt').toDF('text')\n", - "\n", - "spark_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 320, - "status": "ok", - "timestamp": 1664906907432, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "IzBvpIZtGrLX", - "outputId": "14e297b9-f3d1-4a33-93cd-edb0f03d90ea" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------------------------------------------+\n", - "|text |\n", - "+-----------------------------------------------------------------------------+\n", - "|Peter is a very good person. |\n", - "|My life in Russia is very interesting. |\n", - "|John and Peter are brothers. However they don't support each other that much.|\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |\n", - "+-----------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "spark_df.select('text').show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 749, - "status": "ok", - "timestamp": 1664906917726, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "s66VfRkXK9l3", - "outputId": "1dd0843c-f272-45c0-900e-91a048fe0cd4" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------------------------+------------------------------+\n", - "| path| text|\n", - "+------------------------------+------------------------------+\n", - "|file:/content/sample-senten...|Peter is a very good person...|\n", - "+------------------------------+------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "textFiles = spark.sparkContext.wholeTextFiles(\"./*.txt\",4)\n", - " \n", - "spark_df_folder = textFiles.toDF(schema=['path','text'])\n", - "\n", - "spark_df_folder.show(truncate=30)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 779, - "status": "ok", - "timestamp": 1664906921013, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "myuUF6vVV1cJ", - "outputId": "4d47df4a-7d98-4820-bd50-7b7d55f02287" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(text=\"Peter is a very good person.\\nMy life in Russia is very interesting.\\nJohn and Peter are brothers. However they don't support each other that much.\\nLucas Nogal Dunbercker is no longer happy. He has a good car though.\\nEurope is very culture rich. There are huge churches! and big houses!\")]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spark_df_folder.select('text').take(1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 325, - "status": "ok", - "timestamp": 1664906923956, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "s3K_q2ptmFnH", - "outputId": "a61f23b5-1525-40c0-ddcc-d451e3b34ad0" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(text=\"Peter is a very good person.\\nMy life in Russia is very interesting.\\nJohn and Peter are brothers. However they don't support each other that much.\\nLucas Nogal Dunbercker is no longer happy. He has a good car though.\\nEurope is very culture rich. There are huge churches! and big houses!\")]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spark_df_folder.select('text').collect()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ZTcOJCrieNQK" - }, - "source": [ - "### **Transformers**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "AwbTXq-keP7V" - }, - "source": [ - "What are we going to do if our DataFrame doesn’t have columns in those type? Here comes transformers. In Spark NLP, we have five different transformers that are mainly used for getting the data in or transform the data from one AnnotatorType to another. Here is the list of transformers:\n", - "\n", - "| **Transformers** | **Description** |\n", - "| - | - |\n", - "|**DocumentAssembler** |To get through the NLP process, we need to get raw data annotated. This is a special transformer that does this for us; it creates the first annotation of type Document which may be used by annotators down the road.\n", - "|**TokenAssembler** |This transformer reconstructs a Document type annotation from tokens, usually after these have been, lemmatized, normalized, spell checked, etc, to use this document annotation in further annotators.\n", - "|**Doc2Chunk** | Converts DOCUMENT type annotations into CHUNK type with the contents of a chunkCol.\n", - "|**Chunk2Doc** |Converts a CHUNK type column back into DOCUMENT. Useful when trying to re-tokenize or do further analysis on a CHUNK result.\n", - "|**Finisher** |Once we have our NLP pipeline ready to go, we might want to use our annotation results somewhere else where it is easy to use. The Finisher outputs annotation(s) values into a string.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tOBEa23Odr-C" - }, - "source": [ - "Each annotator accepts certain types of columns and outputs new columns in another type (we call this AnnotatorType).\n", - "\n", - "In Spark NLP, we have the following types: \n", - "\n", - ">`Document`, `token`, `chunk`, `pos`, `word_embeddings`, `date`, `entity`, `sentiment`, `named_entity`, `dependency`, `labeled_dependency`. \n", - "\n", - "That is, the DataFrame you have needs to have a column from one of these types if that column will be fed into an annotator; otherwise, you’d need to use one of the Spark NLP transformers." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ss59Lk4ULNRT" - }, - "source": [ - "## **Document Assembler**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "74S30BktM8p-" - }, - "source": [ - "In Spark NLP, we have five different transformers that are mainly used for getting the data in or transform the data from one AnnotatorType to another." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "TtyKgt_iM_5C" - }, - "source": [ - "That is, the DataFrame you have needs to have a column from one of these types if that column will be fed into an annotator; otherwise, you’d need to use one of the Spark NLP transformers. Here is the list of transformers: DocumentAssembler, TokenAssembler, Doc2Chunk, Chunk2Doc, and the Finisher.\n", - "\n", - "So, let’s start with DocumentAssembler(), an entry point to Spark NLP annotators." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "GLiXAucCLWS3" - }, - "source": [ - "To get through the process in Spark NLP, we need to get raw data transformed into Document type at first. \n", - "\n", - "DocumentAssembler() is a special transformer that does this for us; it creates the first annotation of type Document which may be used by annotators down the road.\n", - "\n", - "DocumentAssembler() comes from sparknlp.base class and has the following settable parameters. See the full list here and the source code here.\n", - "\n", - "\n", - "| Parametre | Value | Description |\n", - "| - | - | - |\n", - "|**setInputCol()*** |String |The name of the column that will be converted. We can specify only one column here. It can read either a String column or an Array.|\n", - "|**setOutputCol()*** |optional|The name of the column in Document type that is generated. We can specify only one column here. Default is '**document**'.|\n", - "|**setIdCol()*** |optional|String type column with id information|\n", - "|**setMetadataCol()*** |optional|Map type column with metadata information.|\n", - "|**setCleanupMode()***|optional| Cleaning up options|\n", - "\n", - "\n", - "possible values for setCleanupMode :\n", - " ```\n", - " disabled: Source kept as original. This is a default.\n", - " inplace: removes new lines and tabs.\n", - " inplace_full: removes new lines and tabs but also those which were converted to strings (i.e. \\n)\n", - " shrink: removes new lines and tabs, plus merging multiple spaces and blank lines to a single space.\n", - " shrink_full: remove new lines and tabs, including stringified values, plus shrinking spaces and blank lines.\n", - " ```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 320, - "status": "ok", - "timestamp": 1664906952096, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "7aV9M823mWXF", - "outputId": "59905c91-1204-43b9-cee0-78ce859dfa15" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+\n", - "| text|\n", - "+--------------------+\n", - "|Peter is a very g...|\n", - "|My life in Russia...|\n", - "|John and Peter ar...|\n", - "|Lucas Nogal Dunbe...|\n", - "|Europe is very cu...|\n", - "+--------------------+\n", - "\n" - ] - } - ], - "source": [ - "spark_df.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 314, - "status": "ok", - "timestamp": 1664906954191, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "p8kMdclKHr-O", - "outputId": "fdfc7e98-f73b-4cde-bba9-c5f88650572b" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------------------------------------------+\n", - "|text |\n", - "+-----------------------------------------------------------------------------+\n", - "|Peter is a very good person. |\n", - "|My life in Russia is very interesting. |\n", - "|John and Peter are brothers. However they don't support each other that much.|\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |\n", - "+-----------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "spark_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1621, - "status": "ok", - "timestamp": 1664906957934, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "E76Z1SCPLOyy", - "outputId": "e42f3a1d-aac2-44b8-9246-a5cc3f324d4d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+\n", - "|text |document |\n", - "+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+\n", - "|Peter is a very good person. |[{document, 0, 27, Peter is a very good person., {sentence -> 0}, []}] |\n", - "|My life in Russia is very interesting. |[{document, 0, 37, My life in Russia is very interesting., {sentence -> 0}, []}] |\n", - "|John and Peter are brothers. However they don't support each other that much.|[{document, 0, 76, John and Peter are brothers. However they don't support each other that much., {sentence -> 0}, []}]|\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |[{document, 0, 67, Lucas Nogal Dunbercker is no longer happy. He has a good car though., {sentence -> 0}, []}] |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |[{document, 0, 68, Europe is very culture rich. There are huge churches! and big houses!, {sentence -> 0}, []}] |\n", - "+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "from sparknlp.base import *\n", - "\n", - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\\\n", - " .setCleanupMode(\"shrink\")\n", - "\n", - "doc_df = documentAssembler.transform(spark_df)\n", - "\n", - "doc_df.show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4gAyd6D0MSDF" - }, - "source": [ - "At first, we define DocumentAssembler with desired parameters and then transform the data frame with it. The most important point to pay attention to here is that you need to use a String or String[Array] type column in .setInputCol(). So it doesn’t have to be named as text. You just use the column name as it is." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 350, - "status": "ok", - "timestamp": 1664906960636, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Ui6Ufm_fMS5h", - "outputId": "e5aabf5c-00e6-45ad-f202-7d936db11cf3" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "root\n", - " |-- text: string (nullable = true)\n", - " |-- document: array (nullable = true)\n", - " | |-- element: struct (containsNull = true)\n", - " | | |-- annotatorType: string (nullable = true)\n", - " | | |-- begin: integer (nullable = false)\n", - " | | |-- end: integer (nullable = false)\n", - " | | |-- result: string (nullable = true)\n", - " | | |-- metadata: map (nullable = true)\n", - " | | | |-- key: string\n", - " | | | |-- value: string (valueContainsNull = true)\n", - " | | |-- embeddings: array (nullable = true)\n", - " | | | |-- element: float (containsNull = false)\n", - "\n" - ] - } - ], - "source": [ - "doc_df.printSchema()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 494, - "status": "ok", - "timestamp": 1664906963110, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "UHX6sM47NIVP", - "outputId": "670364b6-ee51-4b22-d8dc-690aa019c913" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-------------------------------------------------------------------------------+-----+----+\n", - "|result |begin|end |\n", - "+-------------------------------------------------------------------------------+-----+----+\n", - "|[Peter is a very good person.] |[0] |[27]|\n", - "|[My life in Russia is very interesting.] |[0] |[37]|\n", - "|[John and Peter are brothers. However they don't support each other that much.]|[0] |[76]|\n", - "|[Lucas Nogal Dunbercker is no longer happy. He has a good car though.] |[0] |[67]|\n", - "|[Europe is very culture rich. There are huge churches! and big houses!] |[0] |[68]|\n", - "+-------------------------------------------------------------------------------+-----+----+\n", - "\n" - ] - } - ], - "source": [ - "doc_df.select('document.result','document.begin','document.end').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "1zb-mdaNMbS5" - }, - "source": [ - "The new column is in an array of struct type and has the parameters shown above. The annotators and transformers all come with universal metadata that would be filled down the road depending on the annotators being used. Unless you want to append other Spark NLP annotators to DocumentAssembler(), you don’t need to know what all these parameters mean for now. So we will talk about them in the following articles. You can access all these parameters with {column name}.{parameter name}.\n", - "\n", - "Let’s print out the first item’s result." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 397, - "status": "ok", - "timestamp": 1664906966360, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "r-EWE7TIMb69", - "outputId": "ec346baf-8012-450c-d468-bfc391ce7dca" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['Peter is a very good person.'])]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "doc_df.select(\"document.result\").take(1)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "SiogyzI-MjsI" - }, - "source": [ - "If we would like to flatten the document column, we can do as follows.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 332, - "status": "ok", - "timestamp": 1664906968073, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ocMbESMGMeJA", - "outputId": "6f3898cd-04d6-4e17-d5c7-1332519d9680" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-------------+-----+---+-----------------------------------------------------------------------------+---------------+----------+\n", - "|annotatorType|begin|end|result |metadata |embeddings|\n", - "+-------------+-----+---+-----------------------------------------------------------------------------+---------------+----------+\n", - "|document |0 |27 |Peter is a very good person. |{sentence -> 0}|[] |\n", - "|document |0 |37 |My life in Russia is very interesting. |{sentence -> 0}|[] |\n", - "|document |0 |76 |John and Peter are brothers. However they don't support each other that much.|{sentence -> 0}|[] |\n", - "|document |0 |67 |Lucas Nogal Dunbercker is no longer happy. He has a good car though. |{sentence -> 0}|[] |\n", - "|document |0 |68 |Europe is very culture rich. There are huge churches! and big houses! |{sentence -> 0}|[] |\n", - "+-------------+-----+---+-----------------------------------------------------------------------------+---------------+----------+\n", - "\n" - ] - } - ], - "source": [ - "import pyspark.sql.functions as F\n", - "\n", - "doc_df.withColumn(\n", - " \"tmp\", \n", - " F.explode(\"document\"))\\\n", - " .select(\"tmp.*\")\\\n", - " .show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "yYxUBF6vMl3o" - }, - "source": [ - "## **Sentence Detector**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "H8YL-VNMcfQx" - }, - "source": [ - "Finds sentence bounds in raw text. " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NeFCrak7chlb" - }, - "source": [ - "| Parametre | Value | Description |\n", - "| - | - | - |\n", - "|**setCustomBounds()*** |String |Custom sentence separator text e.g. `[\"\\n\"]`|\n", - "|**setUseCustomOnly()*** |Bool|Use only custom bounds without considering those of Pragmatic Segmenter. Defaults to false. Needs customBounds.|\n", - "|**setUseAbbreviations*** |Bool| Whether to consider abbreviation strategies for better accuracy but slower performance. Defaults to true.|\n", - "|**setExplodeSentences*** |Bool|Whether to split sentences into different Dataset rows. Useful for higher parallelism in fat rows. Defaults to false.|\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "hfMNS_fXb3mx" - }, - "outputs": [], - "source": [ - "from sparknlp.annotator import *\n", - "\n", - "# we feed the document column coming from Document Assembler\n", - "\n", - "sentenceDetector = SentenceDetector()\\\n", - " .setInputCols(['document'])\\\n", - " .setOutputCol('sentences')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 11, - "status": "ok", - "timestamp": 1664906972136, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "atHSGu_oIK6C", - "outputId": "7195ac7d-557f-45f3-df05-19541626e1ce" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{Param(parent='SentenceDetector_176a5418c081', name='lazyAnnotator', doc='Whether this AnnotatorModel acts as lazy in RecursivePipelines'): False,\n", - " Param(parent='SentenceDetector_176a5418c081', name='useAbbreviations', doc='whether to apply abbreviations at sentence detection'): True,\n", - " Param(parent='SentenceDetector_176a5418c081', name='detectLists', doc='whether detect lists during sentence detection'): True,\n", - " Param(parent='SentenceDetector_176a5418c081', name='useCustomBoundsOnly', doc='Only utilize custom bounds in sentence detection'): False,\n", - " Param(parent='SentenceDetector_176a5418c081', name='customBounds', doc='characters used to explicitly mark sentence bounds'): [],\n", - " Param(parent='SentenceDetector_176a5418c081', name='customBoundsStrategy', doc='How to return matched custom bounds'): 'none',\n", - " Param(parent='SentenceDetector_176a5418c081', name='explodeSentences', doc='whether to explode each sentence into a different row, for better parallelization. Defaults to false.'): False,\n", - " Param(parent='SentenceDetector_176a5418c081', name='minLength', doc='Set the minimum allowed length for each sentence.'): 0,\n", - " Param(parent='SentenceDetector_176a5418c081', name='maxLength', doc='Set the maximum allowed length for each sentence'): 99999,\n", - " Param(parent='SentenceDetector_176a5418c081', name='inputCols', doc='previous annotations columns, if renamed'): ['document'],\n", - " Param(parent='SentenceDetector_176a5418c081', name='outputCol', doc='output annotation column. can be left default.'): 'sentences'}" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sentenceDetector.extractParamMap()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 6, - "status": "ok", - "timestamp": 1664906974637, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "uNGl8ndXnTKA", - "outputId": "e932e19b-b368-429f-d502-54e0a14f5ac6" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+\n", - "|text |document |\n", - "+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+\n", - "|Peter is a very good person. |[{document, 0, 27, Peter is a very good person., {sentence -> 0}, []}] |\n", - "|My life in Russia is very interesting. |[{document, 0, 37, My life in Russia is very interesting., {sentence -> 0}, []}] |\n", - "|John and Peter are brothers. However they don't support each other that much.|[{document, 0, 76, John and Peter are brothers. However they don't support each other that much., {sentence -> 0}, []}]|\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |[{document, 0, 67, Lucas Nogal Dunbercker is no longer happy. He has a good car though., {sentence -> 0}, []}] |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |[{document, 0, 68, Europe is very culture rich. There are huge churches! and big houses!, {sentence -> 0}, []}] |\n", - "+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "doc_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 372, - "status": "ok", - "timestamp": 1664906976633, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "yMcJmxwyeii3", - "outputId": "2ab9888a-d14c-4238-a2c9-b33a4da961cb" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|text |document |sentences |\n", - "+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|Peter is a very good person. |[{document, 0, 27, Peter is a very good person., {sentence -> 0}, []}] |[{document, 0, 27, Peter is a very good person., {sentence -> 0}, []}] |\n", - "|My life in Russia is very interesting. |[{document, 0, 37, My life in Russia is very interesting., {sentence -> 0}, []}] |[{document, 0, 37, My life in Russia is very interesting., {sentence -> 0}, []}] |\n", - "|John and Peter are brothers. However they don't support each other that much.|[{document, 0, 76, John and Peter are brothers. However they don't support each other that much., {sentence -> 0}, []}]|[{document, 0, 27, John and Peter are brothers., {sentence -> 0}, []}, {document, 29, 76, However they don't support each other that much., {sentence -> 1}, []}] |\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |[{document, 0, 67, Lucas Nogal Dunbercker is no longer happy. He has a good car though., {sentence -> 0}, []}] |[{document, 0, 41, Lucas Nogal Dunbercker is no longer happy., {sentence -> 0}, []}, {document, 43, 67, He has a good car though., {sentence -> 1}, []}] |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |[{document, 0, 68, Europe is very culture rich. There are huge churches! and big houses!, {sentence -> 0}, []}] |[{document, 0, 27, Europe is very culture rich., {sentence -> 0}, []}, {document, 29, 52, There are huge churches!, {sentence -> 1}, []}, {document, 54, 68, and big houses!, {sentence -> 2}, []}]|\n", - "+-----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "sent_df = sentenceDetector.transform(doc_df)\n", - "\n", - "sent_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 375, - "status": "ok", - "timestamp": 1664906980245, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "uJrXlWNWfSs2", - "outputId": "0bad6f54-787e-4da5-e0be-b9d97ae881d2" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(sentences=[Row(annotatorType='document', begin=0, end=27, result='Peter is a very good person.', metadata={'sentence': '0'}, embeddings=[])]),\n", - " Row(sentences=[Row(annotatorType='document', begin=0, end=37, result='My life in Russia is very interesting.', metadata={'sentence': '0'}, embeddings=[])]),\n", - " Row(sentences=[Row(annotatorType='document', begin=0, end=27, result='John and Peter are brothers.', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='document', begin=29, end=76, result=\"However they don't support each other that much.\", metadata={'sentence': '1'}, embeddings=[])])]" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sent_df.select('sentences').take(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 5, - "status": "ok", - "timestamp": 1664906981870, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "9lfy4uxkntFx", - "outputId": "1f628bb9-c0a3-4e83-ab86-f5a98d9b7731" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['Peter is a very good person.']),\n", - " Row(result=['My life in Russia is very interesting.']),\n", - " Row(result=['John and Peter are brothers.', \"However they don't support each other that much.\"])]" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sent_df.select('sentences.result').take(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 344, - "status": "ok", - "timestamp": 1664906983898, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "2rXfNjSKpcxs", - "outputId": "21fbda5a-19c6-4b07-fb29-e884fbf89606" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(metadata=[{'sentence': '0'}]),\n", - " Row(metadata=[{'sentence': '0'}]),\n", - " Row(metadata=[{'sentence': '0'}, {'sentence': '1'}])]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sent_df.select('sentences.metadata').take(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 53 - }, - "executionInfo": { - "elapsed": 327, - "status": "ok", - "timestamp": 1664906985855, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Ly4eTKK0Th60", - "outputId": "69203295-ffb4-44c0-97c4-2956c1adf3c2" - }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'The patient was prescribed 1 capsule of Advil for 5 days. He was seen by the endocrinology service and she was discharged on 40 units of insulin glargine at night, 12 units of insulin lispro with meals, and metformin 1000 mg two times a day. It was determined that all SGLT2 inhibitors should be discontinued indefinitely fro 3 months.'" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text ='The patient was prescribed 1 capsule of Advil for 5 days. He was seen by the endocrinology service and she was discharged on 40 units of insulin glargine at night, 12 units of insulin lispro with meals, and metformin 1000 mg two times a day. It was determined that all SGLT2 inhibitors should be discontinued indefinitely fro 3 months.'\n", - "text\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 352, - "status": "ok", - "timestamp": 1664906987812, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "q3wTJSVnULpX", - "outputId": "acb5d5d6-3d2d-4ff1-ef3d-cbdd98b6c914" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|text |\n", - "+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|The patient was prescribed 1 capsule of Advil for 5 days. He was seen by the endocrinology service and she was discharged on 40 units of insulin glargine at night, 12 units of insulin lispro with meals, and metformin 1000 mg two times a day. It was determined that all SGLT2 inhibitors should be discontinued indefinitely fro 3 months.|\n", - "+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "spark_df = spark.createDataFrame([[text]]).toDF(\"text\")\n", - "\n", - "spark_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 327, - "status": "ok", - "timestamp": 1664906990629, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "bkF2C2_GVK2S", - "outputId": "6bcb8ec7-3434-455c-c6f1-685a434cc068" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------+\n", - "| text|\n", - "+--------------------------------------------------+\n", - "|The patient was prescribed 1 capsule of Advil f...|\n", - "+--------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "spark_df.show(truncate=50)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 443, - "status": "ok", - "timestamp": 1664906992370, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "UASqrLkWV2sJ", - "outputId": "f6122be9-799a-45f7-9a87-bc3cf63ba1ff" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------+--------------------------------------------------+--------------------------------------------------+\n", - "| text| document| sentences|\n", - "+--------------------------------------------------+--------------------------------------------------+--------------------------------------------------+\n", - "|The patient was prescribed 1 capsule of Advil f...|[{document, 0, 334, The patient was prescribed ...|[{document, 0, 56, The patient was prescribed 1...|\n", - "+--------------------------------------------------+--------------------------------------------------+--------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "doc_df = documentAssembler.transform(spark_df)\n", - "\n", - "sent_df = sentenceDetector.transform(doc_df)\n", - "\n", - "sent_df.show(truncate=50)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 5, - "status": "ok", - "timestamp": 1664906993791, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "rYSQKC4lWf_m", - "outputId": "5c8506c1-0e86-4c98-f146-d93f1f4d909b" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['The patient was prescribed 1 capsule of Advil for 5 days.', 'He was seen by the endocrinology service and she was discharged on 40 units of insulin glargine at night, 12 units of insulin lispro with meals, and metformin 1000 mg two times a day.', 'It was determined that all SGLT2 inhibitors should be discontinued indefinitely fro 3 months.'])]" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sent_df.select('sentences.result').take(1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 310, - "status": "ok", - "timestamp": 1664906996354, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ZBjcZbj8WwxC", - "outputId": "789880fc-2f8c-474c-820a-adb752c62814" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "SentenceDetector_176a5418c081" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# setExplodeSentences: Whether to split sentences into different Dataset rows. Useful for higher parallelism in fat rows. Defaults to false.\n", - "\n", - "sentenceDetector.setExplodeSentences(True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 915, - "status": "ok", - "timestamp": 1664906999664, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "hJ6b7ZEXW8UY", - "outputId": "fb0fd3d6-96fd-40c4-cd8e-1f5e23e02a46" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------+--------------------------------------------------+--------------------------------------------------+\n", - "| text| document| sentences|\n", - "+--------------------------------------------------+--------------------------------------------------+--------------------------------------------------+\n", - "|The patient was prescribed 1 capsule of Advil f...|[{document, 0, 334, The patient was prescribed ...|[{document, 0, 56, The patient was prescribed 1...|\n", - "|The patient was prescribed 1 capsule of Advil f...|[{document, 0, 334, The patient was prescribed ...|[{document, 58, 240, He was seen by the endocri...|\n", - "|The patient was prescribed 1 capsule of Advil f...|[{document, 0, 334, The patient was prescribed ...|[{document, 242, 334, It was determined that al...|\n", - "+--------------------------------------------------+--------------------------------------------------+--------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "sent_df = sentenceDetector.transform(doc_df)\n", - "\n", - "sent_df.show(truncate=50)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 785, - "status": "ok", - "timestamp": 1664907003094, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "9UEVo1RTs3ok", - "outputId": "24f69afe-7b1a-4855-8011-3abf06fcdc86" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|result |\n", - "+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|[The patient was prescribed 1 capsule of Advil for 5 days.] |\n", - "|[He was seen by the endocrinology service and she was discharged on 40 units of insulin glargine at night, 12 units of insulin lispro with meals, and metformin 1000 mg two times a day.]|\n", - "|[It was determined that all SGLT2 inhibitors should be discontinued indefinitely fro 3 months.] |\n", - "+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "sent_df.select('sentences.result').show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 770, - "status": "ok", - "timestamp": 1664907005439, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "AYvdI1mkysgJ", - "outputId": "7aa84046-c6de-4f38-b13b-92a28feb3936" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|col |\n", - "+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|The patient was prescribed 1 capsule of Advil for 5 days. |\n", - "|He was seen by the endocrinology service and she was discharged on 40 units of insulin glargine at night, 12 units of insulin lispro with meals, and metformin 1000 mg two times a day.|\n", - "|It was determined that all SGLT2 inhibitors should be discontinued indefinitely fro 3 months. |\n", - "+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "from pyspark.sql import functions as F\n", - "\n", - "sent_df.select(F.explode('sentences.result')).show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "vpSNJ1Z4tzbE" - }, - "source": [ - "**`.setCustomBounds([r\"\\\\.\", \";\"])`**\n", - "\n", - "**`.setCustomBoundsStrategy(\"append\")`**\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "A2zB7ICWrZUd" - }, - "outputs": [], - "source": [ - "text = [\n", - " [\"Peter is a very good person.\"],\n", - " [\"My life in Russia is very interesting.\"], \n", - " [\"John and Peter are brothers. However; they don't support each other that much.\"],\n", - " [\"Lucas Nogal Dunbercker is no longer happy. He has a good car though.\"],\n", - " [\"Europe is very culture rich. There are huge churches! and big houses!\"]\n", - " ]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 674, - "status": "ok", - "timestamp": 1664907010630, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "kDeWXEcvr1rz", - "outputId": "046f7314-b4fc-4904-f800-b4c1d8367152" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------------------------------------------------------------------------+\n", - "|text |\n", - "+------------------------------------------------------------------------------+\n", - "|Peter is a very good person. |\n", - "|My life in Russia is very interesting. |\n", - "|John and Peter are brothers. However; they don't support each other that much.|\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |\n", - "+------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "spark_df = spark.createDataFrame(text).toDF(\"text\")\n", - "spark_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "EaeWEgBUsc9I" - }, - "outputs": [], - "source": [ - "doc_df = documentAssembler.transform(spark_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 451, - "status": "ok", - "timestamp": 1664907013585, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "awALJxI2rNXa", - "outputId": "d4a016bb-c77b-47fd-c8f6-f4ddcc60c38e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|text |document |sentences |\n", - "+------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|Peter is a very good person. |[{document, 0, 27, Peter is a very good person., {sentence -> 0}, []}] |[{document, 0, 27, Peter is a very good person., {sentence -> 0}, []}] |\n", - "|My life in Russia is very interesting. |[{document, 0, 37, My life in Russia is very interesting., {sentence -> 0}, []}] |[{document, 0, 37, My life in Russia is very interesting., {sentence -> 0}, []}] |\n", - "|John and Peter are brothers. However; they don't support each other that much.|[{document, 0, 77, John and Peter are brothers. However; they don't support each other that much., {sentence -> 0}, []}]|[{document, 0, 27, John and Peter are brothers., {sentence -> 0}, []}, {document, 29, 36, However;, {sentence -> 1}, []}, {document, 38, 77, they don't support each other that much., {sentence -> 2}, []}]|\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |[{document, 0, 67, Lucas Nogal Dunbercker is no longer happy. He has a good car though., {sentence -> 0}, []}] |[{document, 0, 41, Lucas Nogal Dunbercker is no longer happy., {sentence -> 0}, []}, {document, 43, 67, He has a good car though., {sentence -> 1}, []}] |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |[{document, 0, 68, Europe is very culture rich. There are huge churches! and big houses!, {sentence -> 0}, []}] |[{document, 0, 27, Europe is very culture rich., {sentence -> 0}, []}, {document, 29, 52, There are huge churches!, {sentence -> 1}, []}, {document, 54, 68, and big houses!, {sentence -> 2}, []}] |\n", - "+------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "sentenceDetector = SentenceDetector()\\\n", - " .setInputCols(['document'])\\\n", - " .setOutputCol('sentences')\\\n", - " .setCustomBounds([r\"\\.\", \";\", \"!\"])\\\n", - " .setCustomBoundsStrategy(\"append\")\n", - " \n", - "sent_df = sentenceDetector.transform(doc_df)\n", - "sent_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 737, - "status": "ok", - "timestamp": 1664907017689, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "-RHMB4glq5pS", - "outputId": "c67832b4-09d2-4c0f-8e8b-10bf9340f0d2" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['Peter is a very good person.']),\n", - " Row(result=['My life in Russia is very interesting.']),\n", - " Row(result=['John and Peter are brothers.', 'However;', \"they don't support each other that much.\"]),\n", - " Row(result=['Lucas Nogal Dunbercker is no longer happy.', 'He has a good car though.']),\n", - " Row(result=['Europe is very culture rich.', 'There are huge churches!', 'and big houses!'])]" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sent_df.select('sentences.result').take(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bg9a63CTv51L" - }, - "source": [ - "**`.setCustomBoundsStrategy(\"prepend\")`**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 472, - "status": "ok", - "timestamp": 1664907019385, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "YW8bMUNxszaF", - "outputId": "db78ae9d-9594-49d0-aa4b-45bbedad9e20" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|text |document |sentences |\n", - "+------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|Peter is a very good person. |[{document, 0, 27, Peter is a very good person., {sentence -> 0}, []}] |[{document, 0, 26, Peter is a very good person, {sentence -> 0}, []}, {document, 27, 27, ., {sentence -> 1}, []}] |\n", - "|My life in Russia is very interesting. |[{document, 0, 37, My life in Russia is very interesting., {sentence -> 0}, []}] |[{document, 0, 36, My life in Russia is very interesting, {sentence -> 0}, []}, {document, 37, 37, ., {sentence -> 1}, []}] |\n", - "|John and Peter are brothers. However; they don't support each other that much.|[{document, 0, 77, John and Peter are brothers. However; they don't support each other that much., {sentence -> 0}, []}]|[{document, 0, 26, John and Peter are brothers, {sentence -> 0}, []}, {document, 27, 27, ., {sentence -> 1}, []}, {document, 29, 35, However, {sentence -> 2}, []}, {document, 36, 36, ;, {sentence -> 3}, []}, {document, 38, 76, they don't support each other that much, {sentence -> 4}, []}, {document, 77, 77, ., {sentence -> 5}, []}]|\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |[{document, 0, 67, Lucas Nogal Dunbercker is no longer happy. He has a good car though., {sentence -> 0}, []}] |[{document, 0, 40, Lucas Nogal Dunbercker is no longer happy, {sentence -> 0}, []}, {document, 41, 41, ., {sentence -> 1}, []}, {document, 43, 66, He has a good car though, {sentence -> 2}, []}, {document, 67, 67, ., {sentence -> 3}, []}] |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |[{document, 0, 68, Europe is very culture rich. There are huge churches! and big houses!, {sentence -> 0}, []}] |[{document, 0, 26, Europe is very culture rich, {sentence -> 0}, []}, {document, 27, 27, ., {sentence -> 1}, []}, {document, 29, 51, There are huge churches, {sentence -> 2}, []}, {document, 52, 52, !, {sentence -> 3}, []}, {document, 54, 67, and big houses, {sentence -> 4}, []}, {document, 68, 68, !, {sentence -> 5}, []}] |\n", - "+------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "sentenceDetector = SentenceDetector()\\\n", - " .setInputCols(['document'])\\\n", - " .setOutputCol('sentences')\\\n", - " .setCustomBounds([r\"\\.\", \";\", \"!\"])\\\n", - " .setCustomBoundsStrategy(\"prepend\")\n", - "\n", - "sent_df = sentenceDetector.transform(doc_df)\n", - "sent_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 315, - "status": "ok", - "timestamp": 1664907021159, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "IT4E13iooMXA", - "outputId": "85fdccd2-94b4-4b6a-f922-8365f1e09fdd" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['Peter is a very good person', '.']),\n", - " Row(result=['My life in Russia is very interesting', '.']),\n", - " Row(result=['John and Peter are brothers', '.', 'However', ';', \"they don't support each other that much\", '.']),\n", - " Row(result=['Lucas Nogal Dunbercker is no longer happy', '.', 'He has a good car though', '.']),\n", - " Row(result=['Europe is very culture rich', '.', 'There are huge churches', '!', 'and big houses', '!'])]" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sent_df.select('sentences.result').take(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "sk-r3ZiTxrAM" - }, - "source": [ - "The separation of the sentences is determined according to the characters we set with custom bound. When we use `append`, sentences are differentiated according to the characters, if `prepend` is used, it also determines the characters as separate sentences." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pRiC65UdZ7LC" - }, - "source": [ - "### **Sentence Detector DL**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "YIlgqqgLzZLl" - }, - "outputs": [], - "source": [ - "text ='The patient was prescribed 1 capsule of Advil for 5 days. He was seen by the endocrinology service and she was discharged on 40 units of insulin glargine at night, 12 units of insulin lispro with meals, and metformin 1000 mg two times a day. It was determined that all SGLT2 inhibitors should be discontinued indefinitely fro 3 months.'\n", - "\n", - "spark_df = spark.createDataFrame([[text]]).toDF(\"text\")\n", - "\n", - "doc_df = documentAssembler.transform(spark_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 16870, - "status": "ok", - "timestamp": 1664907042811, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Vsesd8t4aA0W", - "outputId": "61b225ef-6043-4d78-c2e7-f5340b607d57" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sentence_detector_dl download started this may take some time.\n", - "Approximate size to download 354.6 KB\n", - "[OK!]\n", - "+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|col |\n", - "+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|The patient was prescribed 1 capsule of Advil for 5 days. |\n", - "|He was seen by the endocrinology service and she was discharged on 40 units of insulin glargine at night, 12 units of insulin lispro with meals, and metformin 1000 mg two times a day.|\n", - "|It was determined that all SGLT2 inhibitors should be discontinued indefinitely fro 3 months. |\n", - "+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "sentencerDL = SentenceDetectorDLModel\\\n", - " .pretrained(\"sentence_detector_dl\", \"en\") \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"sentences\")\\\n", - "\n", - "sent_dl_df = sentencerDL.transform(doc_df)\n", - "\n", - "sent_dl_df.select(F.explode('sentences.result')).show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 4186, - "status": "ok", - "timestamp": 1664907046986, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "kKZ6YKJebE_0", - "outputId": "5b8f6f81-7a05-4c5b-db87-41837fe174a4" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sentence_detector_dl download started this may take some time.\n", - "Approximate size to download 354.6 KB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documenter = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "sentenceDetector = SentenceDetector()\\\n", - " .setInputCols(['document'])\\\n", - " .setOutputCol('sentences')\\\n", - " \n", - "sentencerDL = SentenceDetectorDLModel\\\n", - " .pretrained(\"sentence_detector_dl\", \"en\") \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"sentences\")\n", - "\n", - "\n", - "sd_pipeline = PipelineModel(stages=[documenter, sentenceDetector])\n", - "sd_model = LightPipeline(sd_pipeline)\n", - "\n", - "\n", - "# DL version\n", - "sd_dl_pipeline = PipelineModel(stages=[documenter, sentencerDL])\n", - "sd_dl_model = LightPipeline(sd_dl_pipeline)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 28, - "status": "ok", - "timestamp": 1664907046986, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ylVTYULea6B-", - "outputId": "4c408635-70df-4488-8f9d-65f3f27e1dd1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\t0\t51\tJohn loves Mary.Mary loves Peter\n", - "Peter loves Helen .\n", - "1\t52\t68\tHelen loves John;\n", - "2\t71\t98\tTotal: four people involved.\n" - ] - } - ], - "source": [ - "text = \"\"\"John loves Mary.Mary loves Peter\n", - "Peter loves Helen .Helen loves John; \n", - "Total: four people involved.\"\"\"\n", - "\n", - "# sd_model\n", - "for anno in sd_model.fullAnnotate(text)[0][\"sentences\"]:\n", - " print(\"{}\\t{}\\t{}\\t{}\".format(\n", - " anno.metadata[\"sentence\"], anno.begin, anno.end, anno.result))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 437, - "status": "ok", - "timestamp": 1664907047402, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "SlSnXKZ3bmjR", - "outputId": "831e2ce0-923b-4e8d-f38d-9979b8aa6e73" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\t0\t15\tJohn loves Mary.\n", - "1\t16\t31\tMary loves Peter\n", - "2\t33\t51\tPeter loves Helen .\n", - "3\t52\t68\tHelen loves John;\n", - "4\t71\t98\tTotal: four people involved.\n" - ] - } - ], - "source": [ - "# sd_dl_model\n", - "for anno in sd_dl_model.fullAnnotate(text)[0][\"sentences\"]:\n", - " print(\"{}\\t{}\\t{}\\t{}\".format(\n", - " anno.metadata[\"sentence\"], anno.begin, anno.end, anno.result))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ELZyacNqbgeq" - }, - "source": [ - "## Tokenizer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "tnkBJxAqbu2b" - }, - "source": [ - "Identifies tokens with tokenization open standards. It is an **Annotator Approach, so it requires .fit()**.\n", - "\n", - "A few rules will help customizing it if defaults do not fit user needs.\n", - "\n", - "setExceptions(StringArray): List of tokens to not alter at all. Allows composite tokens like two worded tokens that the user may not want to split.\n", - "\n", - "| Parametre | Value | Description |\n", - "| - | - | - |\n", - "|**addException()*** |String |Add a single exception.|\n", - "|**setExceptionsPath()*** |String|Path to txt file with list of token exceptions.|\n", - "|**caseSensitiveExceptions*** |Bool| Whether to follow case sensitiveness for matching exceptions in text.|\n", - "|**contextChars()*** |StringArray|List of 1 character string to rip off from tokens, such as parenthesis or question marks. Ignored if using prefix, infix or suffix patterns.|\n", - "|**splitChars()*** |StringArray|List of 1 character string to split tokens inside, such as hyphens. Ignored if using infix, prefix or suffix patterns.|\n", - "|**splitPattern()*** |String|pattern to separate from the inside of tokens. takes priority over splitChars. setTargetPattern: Basic regex rule to identify a candidate for tokenization. Defaults to \\S+ which means anything not a space.|\n", - "|**setSuffixPattern()*** ||Regex to identify subtokens that are in the end of the token. Regex has to end with \\z and must contain groups (). Each group will become a separate token within the prefix. Defaults to non-letter characters. e.g. quotes or parenthesis|\n", - "|**setPrefixPattern()*** ||Regex to identify subtokens that come in the beginning of the token. Regex has to start with \\A and must contain groups (). Each group will become a separate token within the prefix. Defaults to non-letter characters. e.g. quotes or parenthesis.|\n", - "|**addInfixPattern()*** ||Add an extension pattern regex with groups to the top of the rules (will target first, from more specific to the more general).|\n", - "|**minLength()*** ||Set the minimum allowed legth for each token.|\n", - "|**maxLength()*** ||Set the maximum allowed legth for each token.|\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "AyfeGRPKNrDF" - }, - "outputs": [], - "source": [ - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 10, - "status": "ok", - "timestamp": 1664907115890, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "XKIVvy07J-8F", - "outputId": "4d849602-6021-4bd7-d3e5-ac5367bfaa83" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{Param(parent='Tokenizer_6d8479c7cd62', name='lazyAnnotator', doc='Whether this AnnotatorModel acts as lazy in RecursivePipelines'): False,\n", - " Param(parent='Tokenizer_6d8479c7cd62', name='targetPattern', doc='pattern to grab from text as token candidates. Defaults \\\\S+'): '\\\\S+',\n", - " Param(parent='Tokenizer_6d8479c7cd62', name='contextChars', doc='character list used to separate from token boundaries'): ['.',\n", - " ',',\n", - " ';',\n", - " ':',\n", - " '!',\n", - " '?',\n", - " '*',\n", - " '-',\n", - " '(',\n", - " ')',\n", - " '\"',\n", - " \"'\"],\n", - " Param(parent='Tokenizer_6d8479c7cd62', name='caseSensitiveExceptions', doc='Whether to care for case sensitiveness in exceptions'): True,\n", - " Param(parent='Tokenizer_6d8479c7cd62', name='minLength', doc='Set the minimum allowed length for each token'): 0,\n", - " Param(parent='Tokenizer_6d8479c7cd62', name='maxLength', doc='Set the maximum allowed length for each token'): 99999,\n", - " Param(parent='Tokenizer_6d8479c7cd62', name='inputCols', doc='previous annotations columns, if renamed'): ['document'],\n", - " Param(parent='Tokenizer_6d8479c7cd62', name='outputCol', doc='output annotation column. can be left default.'): 'token'}" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tokenizer.extractParamMap()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "v-GQJmCWcYsL" - }, - "outputs": [], - "source": [ - "text = 'Peter Parker (Spiderman) is a nice guy and lives in New York but has no e-mail!'\n", - "\n", - "spark_df = spark.createDataFrame([[text]]).toDF(\"text\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 769, - "status": "ok", - "timestamp": 1664907129360, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "iAgf0v4ucraf", - "outputId": "ebfd89b0-6b4b-4931-ab85-4ce6e2457944" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "| text| document| token|\n", - "+-------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "|Peter Parker (Spiderman) is a nice guy and lives in New York but has no e-mail!|[{document, 0, 78, Peter Parker (Spiderman) is a nice guy and lives in New York but has no e-mail...|[{token, 0, 4, Peter, {sentence -> 0}, []}, {token, 6, 11, Parker, {sentence -> 0}, []}, {token, ...|\n", - "+-------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "doc_df = documentAssembler.transform(spark_df)\n", - "\n", - "token_df = tokenizer.fit(doc_df).transform(doc_df)\n", - "\n", - "token_df.show(truncate=100)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 408, - "status": "ok", - "timestamp": 1664907134196, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "sQ8eoN1mdEn-", - "outputId": "9be8ca18-b29c-46b5-92bd-45b5d38bb670" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['Peter', 'Parker', '(', 'Spiderman', ')', 'is', 'a', 'nice', 'guy', 'and', 'lives', 'in', 'New', 'York', 'but', 'has', 'no', 'e-mail', '!'])]" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "token_df.select('token.result').take(1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "JTlinLhmfKTw" - }, - "outputs": [], - "source": [ - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\") \\\n", - " .setSplitChars(['-']) \\\n", - " .setContextChars(['?', '!']) \\\n", - " .addException(\"New York\") \\" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 431, - "status": "ok", - "timestamp": 1664907145292, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "KY5V7FcXfSrs", - "outputId": "bc00da7c-b9ae-45e4-8bfa-e18358139fa1" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['Peter', 'Parker', '(Spiderman)', 'is', 'a', 'nice', 'guy', 'and', 'lives', 'in', 'New York', 'but', 'has', 'no', 'e', 'mail', '!'])]" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "token_df = tokenizer.fit(doc_df).transform(doc_df)\n", - "\n", - "token_df.select('token.result').take(1)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "AOn8d1tcBkK3" - }, - "source": [ - "## Regex Tokenizer" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 800, - "status": "ok", - "timestamp": 1664907175605, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Y4ruucl4BnLJ", - "outputId": "2fc56369-51c5-4aa7-c1db-2126fa4585bb" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+---------------------------------------------------+---------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|text |document |sentence |regexToken |\n", - "+---------------------------------------------------+---------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|1. T1-T2 DATE**[12/24/13] $1.99 () (10/12), ph+ 90%|[{document, 0, 50, 1. T1-T2 DATE**[12/24/13] $1.99 () (10/12), ph+ 90%, {sentence -> 0}, []}]|[{document, 0, 50, 1. T1-T2 DATE**[12/24/13] $1.99 () (10/12), ph+ 90%, {sentence -> 0}, []}]|[{token, 0, 0, 1, {sentence -> 0}, []}, {token, 2, 2, ., {sentence -> 0}, []}, {token, 4, 5, T1, {sentence -> 0}, []}, {token, 7, 7, -, {sentence -> 0}, []}, {token, 9, 10, T2, {sentence -> 0}, []}, {token, 12, 15, DATE, {sentence -> 0}, []}, {token, 17, 17, *, {sentence -> 0}, []}, {token, 19, 19, *, {sentence -> 0}, []}, {token, 21, 21, [, {sentence -> 0}, []}, {token, 23, 30, 12/24/13, {sentence -> 0}, []}, {token, 32, 32, ], {sentence -> 0}, []}, {token, 35, 35, $, {sentence -> 0}, []}, {token, 37, 37, 1, {sentence -> 0}, []}, {token, 39, 39, ., {sentence -> 0}, []}, {token, 41, 42, 99, {sentence -> 0}, []}, {token, 44, 45, (), {sentence -> 0}, []}, {token, 47, 53, (10/12), {sentence -> 0}, []}, {token, 55, 55, ,, {sentence -> 0}, []}, {token, 57, 58, ph, {sentence -> 0}, []}, {token, 60, 60, +, {sentence -> 0}, []}, {token, 62, 63, 90, {sentence -> 0}, []}, {token, 65, 65, %, {sentence -> 0}, []}]|\n", - "+---------------------------------------------------+---------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "from pyspark.sql.types import StringType\n", - "\n", - "content = \"1. T1-T2 DATE**[12/24/13] $1.99 () (10/12), ph+ 90%\"\n", - "pattern = \"\\\\s+|(?=[-.:;*+,$&%\\\\[\\\\]])|(?<=[-.:;*+,$&%\\\\[\\\\]])\"\n", - "\n", - "df = spark.createDataFrame([content], StringType()).withColumnRenamed(\"value\", \"text\")\n", - "\n", - "documenter = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "sentenceDetector = SentenceDetector()\\\n", - " .setInputCols(['document'])\\\n", - " .setOutputCol('sentence')\n", - "\n", - "regexTokenizer = RegexTokenizer() \\\n", - " .setInputCols([\"sentence\"]) \\\n", - " .setOutputCol(\"regexToken\") \\\n", - " .setPattern(pattern) \\\n", - " .setPositionalMask(False)\n", - "\n", - "docPatternRemoverPipeline = Pipeline().setStages([documenter,\n", - " sentenceDetector,\n", - " regexTokenizer])\n", - "\n", - "result = docPatternRemoverPipeline.fit(df).transform(df)\n", - "result.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 739 - }, - "executionInfo": { - "elapsed": 800, - "status": "ok", - "timestamp": 1664907181497, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "APA8zhR-F1WB", - "outputId": "dd8ef1a3-f06b-4614-d96c-3307893a7b2e" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
regexToken
01
1.
2T1
3-
4T2
5DATE
6*
7*
8[
912/24/13
10]
11$
121
13.
1499
15()
16(10/12)
17,
18ph
19+
2090
21%
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " regexToken\n", - "0 1\n", - "1 .\n", - "2 T1\n", - "3 -\n", - "4 T2\n", - "5 DATE\n", - "6 *\n", - "7 *\n", - "8 [\n", - "9 12/24/13\n", - "10 ]\n", - "11 $\n", - "12 1\n", - "13 .\n", - "14 99\n", - "15 ()\n", - "16 (10/12)\n", - "17 ,\n", - "18 ph\n", - "19 +\n", - "20 90\n", - "21 %" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pyspark.sql.functions as F\n", - "\n", - "result_df = result.select(F.explode(result.regexToken.result).alias('regexToken')).toPandas()\n", - "result_df" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "l_LM44ZzgYhs" - }, - "source": [ - "## Stacking Spark NLP Annotators in Spark ML Pipeline" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bm0mUMQMhFPU" - }, - "source": [ - "Spark NLP provides an easy API to integrate with Spark ML Pipelines and all the Spark NLP annotators and transformers can be used within Spark ML Pipelines. So, it’s better to explain Pipeline concept through Spark ML official documentation.\n", - "\n", - "What is a Pipeline anyway? In machine learning, it is common to run a sequence of algorithms to process and learn from data. \n", - "\n", - "Apache Spark ML represents such a workflow as a Pipeline, which consists of a sequence of PipelineStages (Transformers and Estimators) to be run in a specific order.\n", - "\n", - "In simple terms, a pipeline chains multiple Transformers and Estimators together to specify an ML workflow. We use Pipeline to chain multiple Transformers and Estimators together to specify our machine learning workflow.\n", - "\n", - "The figure below is for the training time usage of a Pipeline." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "jK5AAYQqhRlG" - }, - "source": [ - "![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtUAAADxCAYAAAAEEUtiAAAgAElEQVR4AeydB1RUVxuu7/3vX5M/McmviaZoLFGxYMcIogioWFAELDQVu9jFAvaGiL13sbfYe8Xee0GNienVAlaKCL53vfvMgQGBIDNUv1lr1gAz58zw7He+/e5vf2fv/wO5CQEhIASEgBAQAkJACAgBIWASgf9j0tFysBAQAkJACAgBISAEhIAQEAIQUy0iEAJCQAgIASEgBISAEBACJhIQU20iQDlcCAgBISAEhIAQEAJCQAiIqRYNCAEhIASEgBAQAkJACAgBEwmIqTYRoBwuBISAEBACQkAICAEhIATEVIsGhIAQEAJCQAgIASEgBISAiQTEVJsIUA4XAkJACAgBISAEhIAQEAJiqkUDQkAICAEhIASEgBAQAkLARAJiqk0EKIcLASEgBISAEBACQkAICAEx1aIBISAEhIAQEAJCQAgIASFgIgEx1SYClMOFgBAQAkJACAgBISAEhICYatGAEBACQkAICAEhIASEgBAwkYCYahMByuFCQAgIASEgBISAEBACQkBMtWhACAgBISAEhIAQEAJCQAiYSEBMtYkA5XAhIASEgBAQAkJACAgBISCmWjQgBISAEBACQkAICAEhIARMJCCm2kSAcrgQEAJCQAgIASEgBISAEBBTLRoQAkJACAgBISAEhIAQEAImEhBTbSJAOVwICAEhIASEgBAQAkJACIipFg0IASEgBISAEBACQkAICAETCYipNhGgHC4EhIAQEAJCQAgIASEgBMRUiwaEgBAQAkJACAgBISAEhICJBMRUmwhQDhcCQkAICAEhIASEgBAQAmKqRQNCQAgIASEgBISAEBACQsBEAmKqTQQohwsBISAEhIAQEAJCQAgIATHVogEhIASEgBAQAkJACAgBIWAiATHVJgKUw4WAEBACQkAICAEhIASEgJhq0YAQEAJCQAgIASEgBISAEDCRgJhqEwHK4UJACAgBISAEhIAQEAJCQEy1aEAICAEhIASEgBAQAkJACJhIQEy1iQDlcCEgBISAEBACQkAICAEhIKZaNCAEhIAQEAJCQAgIASEgBEwkIKbaRIByuBAQAkJACAgBISAEhIAQEFMtGhACQkAICAEhIASEgBAQAiYSEFNtIkA5XAgIASEgBISAEBACQkAIiKkWDQgBISAEhIAQEAJCQAgIARMJiKk2EaAcLgSEgBAQAkJACAgBISAExFSLBoSAEBACQkAICAEhIASEgIkExFSbCFAOFwJCQAgIASEgBISAEBACYqpFA0JACAgBISAEhIAQEAJCwEQCYqpNBCiHCwEhIASEgBAQAkJACAgBMdWiASEgBISAEBACQkAICAEhYCIBMdUmApTDhYAQEAJCQAgIASEgBISAmGrRgBAQAkJACAgBISAEhIAQMJGAmGoTAcrhQkAICAEhIASEgBAQAkJATLVoQAgIASEgBISAEBACQkAImEhATLWJAOVwISAEhIAQEAJCQAgIASEgplo0IASEgBAQAkJACAgBISAETCQgptpEgHK4EBACQkAICAEhIASEgBAQUy0aEAJCQAgIASEgBISAEBACJhIQU20iQDlcCAgBISAEhIAQEAJCQAiIqRYNCAEhIASEgBAQAkJACAgBEwmIqTYRoBwuBISAEBACQkAICAEhIATEVIsGhIAQEAJCQAgIASEgBISAiQTEVJsIUA4XAkJACAgBISAEhIAQEAJiqkUDQkAICAEhIASEgBAQAkLARAJiqk0EKIcLASEgBISAEBACQkAICAEx1aIBISAEhIAQEAJCQAgIASFgIgEx1SYClMOFgBAQAkJACAgBISAEhICYatGAEBACQkAICAEhIASEgBAwkYCYahMByuFCQAgIASEgBISAEBACQkBMtWhACAgBISAEhIAQEAJCQAiYSEBMtYkA5XAhIASEgBAQAkJACAgBISCmWjQgBISAEBACQkAICAEhIARMJCCm2kSAcrgQEAJCQAgIASEgBISAEBBTLRoQAkJACAgBISAEhIAQEAImEhBTbSJAOVwICAEhIASEgBAQAkJACIipFg0IASEgBISAEBACQkAICAETCYipNhGgHC4EhIAQEAJCQAgIASEgBMRU56AGXr4EEhKA+Hi5ZwcDss6LN9FIxr4f5MTvVF678TNnh/7lPTTOeVEjf6VpiRHZ9x3Kq/3IX2lInjcPATHV5uH42md5EQ9EPEzAuUux2L43Clt3yz0rGWzfE4XzV2IVc7LPCzeaoCdPExB+Ow67DkSLRtL5jvA7dPZiLO7eT8DzuJd5wlzT3D199hK3vo3DnoPSvln5/ee5t+2OwpGTMfj51xeIjnmJhDw4AEsZtxgjHkTGK+1nNT85fxS2743GhataP0L2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)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "dwLlY7i4hhq1" - }, - "source": [ - "A Pipeline is specified as a sequence of stages, and each stage is either a Transformer or an Estimator. These stages are run in order, and the input DataFrame is transformed as it passes through each stage. That is, the data are passed through the fitted pipeline in order. Each stage’s transform() method updates the dataset and passes it to the next stage. With the help of Pipelines, we can ensure that training and test data go through identical feature processing steps.\n", - "\n", - "Now let’s see how this can be done in Spark NLP using Annotators and Transformers. Assume that we have the following steps that need to be applied one by one on a data frame.\n", - "\n", - "- Split text into sentences\n", - "- Tokenize\n", - "\n", - "And here is how we code this pipeline up in Spark NLP." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "_2mZXDVehhDU" - }, - "outputs": [], - "source": [ - "from pyspark.ml import Pipeline\n", - "\n", - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "sentenceDetector = SentenceDetector()\\\n", - " .setInputCols(['document'])\\\n", - " .setOutputCol('sentences')\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"sentences\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " sentenceDetector,\n", - " tokenizer])\n", - "\n", - "spark_df = spark.read.text('./sample-sentences-en.txt').toDF('text')\n", - "\n", - "pipelineModel = nlpPipeline.fit(spark_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 374, - "status": "ok", - "timestamp": 1664907213434, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "9Rq_CRWN6Zge", - "outputId": "22f861c9-ea47-4f60-9817-acb0e9c8cd53" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------------------------------------------+\n", - "|text |\n", - "+-----------------------------------------------------------------------------+\n", - "|Peter is a very good person. |\n", - "|My life in Russia is very interesting. |\n", - "|John and Peter are brothers. However they don't support each other that much.|\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |\n", - "+-----------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "spark_df = spark.read.text('./sample-sentences-en.txt').toDF('text')\n", - "\n", - "spark_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "JuhTX4-Vk-cd" - }, - "outputs": [], - "source": [ - "result = pipelineModel.transform(spark_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 448, - "status": "ok", - "timestamp": 1664907217901, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "iaWf94QPlT51", - "outputId": "7a44f67b-af29-48c5-f830-203b51459e6e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "| text| document| sentences| token|\n", - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "| Peter is a very good person.|[{document, 0, 27, Peter is a very go...|[{document, 0, 27, Peter is a very go...|[{token, 0, 4, Peter, {sentence -> 0}...|\n", - "| My life in Russia is very interesting.|[{document, 0, 37, My life in Russia ...|[{document, 0, 37, My life in Russia ...|[{token, 0, 1, My, {sentence -> 0}, [...|\n", - "|John and Peter are brothers. However ...|[{document, 0, 76, John and Peter are...|[{document, 0, 27, John and Peter are...|[{token, 0, 3, John, {sentence -> 0},...|\n", - "|Lucas Nogal Dunbercker is no longer h...|[{document, 0, 67, Lucas Nogal Dunber...|[{document, 0, 41, Lucas Nogal Dunber...|[{token, 0, 4, Lucas, {sentence -> 0}...|\n", - "|Europe is very culture rich. There ar...|[{document, 0, 68, Europe is very cul...|[{document, 0, 27, Europe is very cul...|[{token, 0, 5, Europe, {sentence -> 0...|\n", - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "result.show(truncate=40)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 4, - "status": "ok", - "timestamp": 1664907219318, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "zfz0_-eFlXzk", - "outputId": "13fe22c1-11a7-451b-dfc3-2bc50a653bd8" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "root\n", - " |-- text: string (nullable = true)\n", - " |-- document: array (nullable = true)\n", - " | |-- element: struct (containsNull = true)\n", - " | | |-- annotatorType: string (nullable = true)\n", - " | | |-- begin: integer (nullable = false)\n", - " | | |-- end: integer (nullable = false)\n", - " | | |-- result: string (nullable = true)\n", - " | | |-- metadata: map (nullable = true)\n", - " | | | |-- key: string\n", - " | | | |-- value: string (valueContainsNull = true)\n", - " | | |-- embeddings: array (nullable = true)\n", - " | | | |-- element: float (containsNull = false)\n", - " |-- sentences: array (nullable = true)\n", - " | |-- element: struct (containsNull = true)\n", - " | | |-- annotatorType: string (nullable = true)\n", - " | | |-- begin: integer (nullable = false)\n", - " | | |-- end: integer (nullable = false)\n", - " | | |-- result: string (nullable = true)\n", - " | | |-- metadata: map (nullable = true)\n", - " | | | |-- key: string\n", - " | | | |-- value: string (valueContainsNull = true)\n", - " | | |-- embeddings: array (nullable = true)\n", - " | | | |-- element: float (containsNull = false)\n", - " |-- token: array (nullable = true)\n", - " | |-- element: struct (containsNull = true)\n", - " | | |-- annotatorType: string (nullable = true)\n", - " | | |-- begin: integer (nullable = false)\n", - " | | |-- end: integer (nullable = false)\n", - " | | |-- result: string (nullable = true)\n", - " | | |-- metadata: map (nullable = true)\n", - " | | | |-- key: string\n", - " | | | |-- value: string (valueContainsNull = true)\n", - " | | |-- embeddings: array (nullable = true)\n", - " | | | |-- element: float (containsNull = false)\n", - "\n" - ] - } - ], - "source": [ - "result.printSchema()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 323, - "status": "ok", - "timestamp": 1664907221583, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "599Y4hQsl_mF", - "outputId": "a64afdac-956c-43f9-a386-f27fc17f0dc9" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['Peter is a very good person.']),\n", - " Row(result=['My life in Russia is very interesting.']),\n", - " Row(result=['John and Peter are brothers.', \"However they don't support each other that much.\"])]" - ] - }, - "execution_count": 63, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result.select('sentences.result').take(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 8, - "status": "ok", - "timestamp": 1664907223220, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ehzhHXu6luaF", - "outputId": "b79b06aa-3f1a-47c4-d688-f1c78052f2c5" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Row(token=[Row(annotatorType='token', begin=0, end=3, result='John', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=5, end=7, result='and', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=9, end=13, result='Peter', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=15, end=17, result='are', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=19, end=26, result='brothers', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=27, end=27, result='.', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=29, end=35, result='However', metadata={'sentence': '1'}, embeddings=[]), Row(annotatorType='token', begin=37, end=40, result='they', metadata={'sentence': '1'}, embeddings=[]), Row(annotatorType='token', begin=42, end=46, result=\"don't\", metadata={'sentence': '1'}, embeddings=[]), Row(annotatorType='token', begin=48, end=54, result='support', metadata={'sentence': '1'}, embeddings=[]), Row(annotatorType='token', begin=56, end=59, result='each', metadata={'sentence': '1'}, embeddings=[]), Row(annotatorType='token', begin=61, end=65, result='other', metadata={'sentence': '1'}, embeddings=[]), Row(annotatorType='token', begin=67, end=70, result='that', metadata={'sentence': '1'}, embeddings=[]), Row(annotatorType='token', begin=72, end=75, result='much', metadata={'sentence': '1'}, embeddings=[]), Row(annotatorType='token', begin=76, end=76, result='.', metadata={'sentence': '1'}, embeddings=[])])" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result.select('token').take(3)[2]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "42dSp9dGmtmr" - }, - "source": [ - "## Normalizer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "spOjcducnAsR" - }, - "source": [ - "Removes all dirty characters from text following a regex pattern and transforms words based on a provided dictionary\n", - "\n", - "`setCleanupPatterns(patterns)`: Regular expressions list for normalization, defaults [^A-Za-z]\n", - "\n", - "`setLowercase(value)`: lowercase tokens, default false\n", - "\n", - "`setSlangDictionary(path)`: txt file with delimited words to be transformed into something else\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 35 - }, - "executionInfo": { - "elapsed": 523, - "status": "ok", - "timestamp": 1664907226445, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "h6XKX2l7_Jqk", - "outputId": "49463712-e54d-4651-ca8e-5686901f2c7c" - }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "'!\"#$%&\\'()*+,-./:;<=>?@[\\\\]^_`{|}~'" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import string\n", - "string.punctuation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "6hq2ZBWl_WMu" - }, - "outputs": [], - "source": [ - "from sparknlp.base import *\n", - "from sparknlp.annotator import *\n", - "\n", - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n", - " \n", - "normalizer = Normalizer() \\\n", - " .setInputCols([\"token\"]) \\\n", - " .setOutputCol(\"normalized\")\\\n", - " .setLowercase(True)\\\n", - " .setCleanupPatterns([\"[^\\w\\d\\s]\"]) # remove punctuations (keep alphanumeric chars)\n", - " # if we don't set CleanupPatterns, it will only keep alphabet letters ([^A-Za-z])\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " normalizer])\n", - "\n", - "result = nlpPipeline.fit(spark_df).transform(spark_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 358, - "status": "ok", - "timestamp": 1664907247428, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "25YyJJYXppji", - "outputId": "6de6f1d5-668e-44d2-ea63-0245d72f5902" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[DocumentAssembler_d4926309c3ee,\n", - " REGEX_TOKENIZER_a4789e51e51c,\n", - " NORMALIZER_81bbdb7b0bdb]" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nlpPipeline.fit(spark_df).stages" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 795, - "status": "ok", - "timestamp": 1664907249847, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "oUp4au5eoYrw", - "outputId": "fc0588b5-3e3f-4895-f9ab-2800eaf253ce" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "| text| document| token| normalized|\n", - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "| Peter is a very good person.|[{document, 0, 27, Peter is a very go...|[{token, 0, 4, Peter, {sentence -> 0}...|[{token, 0, 4, peter, {sentence -> 0}...|\n", - "| My life in Russia is very interesting.|[{document, 0, 37, My life in Russia ...|[{token, 0, 1, My, {sentence -> 0}, [...|[{token, 0, 1, my, {sentence -> 0}, [...|\n", - "|John and Peter are brothers. However ...|[{document, 0, 76, John and Peter are...|[{token, 0, 3, John, {sentence -> 0},...|[{token, 0, 3, john, {sentence -> 0},...|\n", - "|Lucas Nogal Dunbercker is no longer h...|[{document, 0, 67, Lucas Nogal Dunber...|[{token, 0, 4, Lucas, {sentence -> 0}...|[{token, 0, 4, lucas, {sentence -> 0}...|\n", - "|Europe is very culture rich. There ar...|[{document, 0, 68, Europe is very cul...|[{token, 0, 5, Europe, {sentence -> 0...|[{token, 0, 5, europe, {sentence -> 0...|\n", - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "result.show(truncate=40)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 7, - "status": "ok", - "timestamp": 1664907250848, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "zxS0MEoM02wl", - "outputId": "c24602d7-feda-425a-c138-fee038f592cf" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(token=[Row(annotatorType='token', begin=0, end=4, result='Peter', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=6, end=7, result='is', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=9, end=9, result='a', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=11, end=14, result='very', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=16, end=19, result='good', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=21, end=26, result='person', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=27, end=27, result='.', metadata={'sentence': '0'}, embeddings=[])]),\n", - " Row(token=[Row(annotatorType='token', begin=0, end=1, result='My', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=3, end=6, result='life', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=8, end=9, result='in', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=11, end=16, result='Russia', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=18, end=19, result='is', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=21, end=24, result='very', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=26, end=36, result='interesting', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=37, end=37, result='.', metadata={'sentence': '0'}, embeddings=[])])]" - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result.select('token').take(2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 542, - "status": "ok", - "timestamp": 1664907252725, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "xYQcnFVloa8R", - "outputId": "ff7780a5-bfc7-4523-8820-b6577918bb5f" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['peter', 'is', 'a', 'very', 'good', 'person']),\n", - " Row(result=['my', 'life', 'in', 'russia', 'is', 'very', 'interesting'])]" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result.select('normalized.result').take(2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 9, - "status": "ok", - "timestamp": 1664907253166, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "dy6TLD9c1LTg", - "outputId": "ad940727-807d-42c5-e9ca-a415d419e080" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(normalized=[Row(annotatorType='token', begin=0, end=4, result='peter', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=6, end=7, result='is', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=9, end=9, result='a', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=11, end=14, result='very', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=16, end=19, result='good', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=21, end=26, result='person', metadata={'sentence': '0'}, embeddings=[])]),\n", - " Row(normalized=[Row(annotatorType='token', begin=0, end=1, result='my', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=3, end=6, result='life', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=8, end=9, result='in', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=11, end=16, result='russia', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=18, end=19, result='is', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=21, end=24, result='very', metadata={'sentence': '0'}, embeddings=[]), Row(annotatorType='token', begin=26, end=36, result='interesting', metadata={'sentence': '0'}, embeddings=[])])]" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result.select('normalized').take(2)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "__iJ4EMeVb3n" - }, - "source": [ - "## Document Normalizer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wfLIupJFZi3c" - }, - "source": [ - "The DocumentNormalizer is an annotator that can be used after the DocumentAssembler to narmalize documents once that they have been processed and indexed .\n", - "It takes in input annotated documents of type Array AnnotatorType.DOCUMENT and gives as output annotated document of type AnnotatorType.DOCUMENT .\n", - "\n", - "Parameters are: \n", - "\n", - "| Parametre | Description |\n", - "| - | - |\n", - "|**inputCol** |input column name string which targets a column of type Array(AnnotatorType.DOCUMENT).|\n", - "|**outputCol** |output column name string which targets a column of type AnnotatorType.DOCUMENT.|\n", - "|**action** |action string to perform applying regex patterns, i.e. (clean | extract). Default is \"clean\".|\n", - "|**cleanupPatterns** |normalization regex patterns which match will be removed from document. Default is \"<[^>]*>\" (e.g., it removes all HTML tags).|\n", - "|**replacement** |replacement string to apply when regexes match. Default is \" \".|\n", - "|**lowercase** |whether to convert strings to lowercase. Default is False.|\n", - "|**removalPolicy** |removalPolicy to remove patterns from text with a given policy. Valid policy values are: \"all\", \"pretty_all\", \"first\", \"pretty_first\". Defaults is \"pretty_all\". |\n", - "|**encoding** |file encoding to apply on normalized documents. Supported encodings are: UTF_8, UTF_16, US_ASCII, ISO-8859-1, UTF-16BE, UTF-16LE. Default is \"UTF-8\".|\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "8Tj1c6UYhSzK" - }, - "outputs": [], - "source": [ - "text = '''\n", - "
\n", - " THE WORLD'S LARGEST WEB DEVELOPER SITE\n", - "

THE WORLD'S LARGEST WEB DEVELOPER SITE

\n", - "

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum..

\n", - "
\n", - "\n", - "'''" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 407, - "status": "ok", - "timestamp": 1664907258361, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "vB6CgjLlhi63", - "outputId": "2de6c8cf-9575-43f1-ef9f-b7108b254796" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|text |\n", - "+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|\\n
\\n THE WORLD'S LARGEST WEB DEVELOPER SITE\\n

THE WORLD'S LARGEST WEB DEVELOPER SITE

\\n

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum..

\\n
\\n\\n|\n", - "+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "spark_df = spark.createDataFrame([[text]]).toDF(\"text\")\n", - "\n", - "spark_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 10, - "status": "ok", - "timestamp": 1664907261003, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "y0nOIC0GKEqX", - "outputId": "56dad3ba-7104-49c6-ac13-f1b807497d11" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{Param(parent='DocumentNormalizer_99e443833d62', name='lazyAnnotator', doc='Whether this AnnotatorModel acts as lazy in RecursivePipelines'): False,\n", - " Param(parent='DocumentNormalizer_99e443833d62', name='action', doc='action to perform applying regex patterns on text'): 'clean',\n", - " Param(parent='DocumentNormalizer_99e443833d62', name='patterns', doc='normalization regex patterns which match will be removed from document. Defaults is <[^>]*>'): ['<[^>]*>'],\n", - " Param(parent='DocumentNormalizer_99e443833d62', name='replacement', doc='replacement string to apply when regexes match'): ' ',\n", - " Param(parent='DocumentNormalizer_99e443833d62', name='lowercase', doc='whether to convert strings to lowercase'): False,\n", - " Param(parent='DocumentNormalizer_99e443833d62', name='policy', doc='policy to remove pattern from text'): 'pretty_all',\n", - " Param(parent='DocumentNormalizer_99e443833d62', name='encoding', doc='file encoding to apply on normalized documents'): 'UTF-8',\n", - " Param(parent='DocumentNormalizer_99e443833d62', name='inputCols', doc='previous annotations columns, if renamed'): ['document'],\n", - " Param(parent='DocumentNormalizer_99e443833d62', name='outputCol', doc='output annotation column. can be left default.'): 'normalizedDocument'}" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "documentNormalizer = DocumentNormalizer() \\\n", - " .setInputCols(\"document\") \\\n", - " .setOutputCol(\"normalizedDocument\")\n", - "\n", - "documentNormalizer.extractParamMap()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "UA3tF3AOVZyY" - }, - "outputs": [], - "source": [ - "documentAssembler = DocumentAssembler() \\\n", - " .setInputCol('text') \\\n", - " .setOutputCol('document')\n", - "\n", - "#default\n", - "cleanUpPatterns = [\"<[^>]*>\"]\n", - "\n", - "documentNormalizer = DocumentNormalizer() \\\n", - " .setInputCols(\"document\") \\\n", - " .setOutputCol(\"normalizedDocument\") \\\n", - " .setAction(\"clean\") \\\n", - " .setPatterns(cleanUpPatterns) \\\n", - " .setReplacement(\" \") \\\n", - " .setPolicy(\"pretty_all\") \\\n", - " .setLowercase(True)\n", - "\n", - "docPatternRemoverPipeline = Pipeline() \\\n", - " .setStages([documentAssembler,\n", - " documentNormalizer])\n", - " \n", - "pipelineModel = docPatternRemoverPipeline.fit(spark_df).transform(spark_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 13, - "status": "ok", - "timestamp": 1664907283933, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "BMxU26nTgiEU", - "outputId": "b843aad4-596a-4cc5-a34f-bc548bc047d4" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|result |\n", - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|[ the world's largest web developer site the world's largest web developer site lorem ipsum is simply dummy text of the printing and typesetting industry. lorem ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. it has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. it was popularised in the 1960s with the release of letraset sheets containing lorem ipsum passages, and more recently with desktop publishing software like aldus pagemaker including versions of lorem ipsum..]|\n", - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "pipelineModel.select('normalizedDocument.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "_Kxd4cCegROX" - }, - "source": [ - " for more examples : https://github.com/JohnSnowLabs/spark-nlp-workshop/blob/master/jupyter/annotation/english/document-normalizer/document_normalizer_notebook.ipynb" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "g4jmmGZRwdwo" - }, - "source": [ - "## Stopwords Cleaner" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7fgcop89yIT-" - }, - "source": [ - "This annotator excludes from a sequence of strings (e.g. the output of a Tokenizer, Normalizer, Lemmatizer, and Stemmer) and drops all the stop words from the input sequences.\n", - "\n", - "**Functions**:\n", - "\n", - "| Parametre | Description |\n", - "| - | - |\n", - "|**setStopWords** |The words to be filtered out. Array[String]|\n", - "|**setCaseSensitive** |Whether to do a case sensitive comparison over the stop words.|\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "E7pS3jUcoedG" - }, - "outputs": [], - "source": [ - "stopwords_cleaner = StopWordsCleaner()\\\n", - " .setInputCols(\"token\")\\\n", - " .setOutputCol(\"cleanTokens\")\\\n", - " .setCaseSensitive(False)\\\n", - " #.setStopWords([\"no\", \"without\"]) (e.g. read a list of words from a txt)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 20, - "status": "ok", - "timestamp": 1664907288522, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "2mGt9RoD1ezP", - "outputId": "26b8d459-a014-45bf-f895-bdc1f9d60249" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['i',\n", - " 'me',\n", - " 'my',\n", - " 'myself',\n", - " 'we',\n", - " 'our',\n", - " 'ours',\n", - " 'ourselves',\n", - " 'you',\n", - " 'your',\n", - " 'yours',\n", - " 'yourself',\n", - " 'yourselves',\n", - " 'he',\n", - " 'him',\n", - " 'his',\n", - " 'himself',\n", - " 'she',\n", - " 'her',\n", - " 'hers',\n", - " 'herself',\n", - " 'it',\n", - " 'its',\n", - " 'itself',\n", - " 'they',\n", - " 'them',\n", - " 'their',\n", - " 'theirs',\n", - " 'themselves',\n", - " 'what',\n", - " 'which',\n", - " 'who',\n", - " 'whom',\n", - " 'this',\n", - " 'that',\n", - " 'these',\n", - " 'those',\n", - " 'am',\n", - " 'is',\n", - " 'are',\n", - " 'was',\n", - " 'were',\n", - " 'be',\n", - " 'been',\n", - " 'being',\n", - " 'have',\n", - " 'has',\n", - " 'had',\n", - " 'having',\n", - " 'do',\n", - " 'does',\n", - " 'did',\n", - " 'doing',\n", - " 'a',\n", - " 'an',\n", - " 'the',\n", - " 'and',\n", - " 'but',\n", - " 'if',\n", - " 'or',\n", - " 'because',\n", - " 'as',\n", - " 'until',\n", - " 'while',\n", - " 'of',\n", - " 'at',\n", - " 'by',\n", - " 'for',\n", - " 'with',\n", - " 'about',\n", - " 'against',\n", - " 'between',\n", - " 'into',\n", - " 'through',\n", - " 'during',\n", - " 'before',\n", - " 'after',\n", - " 'above',\n", - " 'below',\n", - " 'to',\n", - " 'from',\n", - " 'up',\n", - " 'down',\n", - " 'in',\n", - " 'out',\n", - " 'on',\n", - " 'off',\n", - " 'over',\n", - " 'under',\n", - " 'again',\n", - " 'further',\n", - " 'then',\n", - " 'once',\n", - " 'here',\n", - " 'there',\n", - " 'when',\n", - " 'where',\n", - " 'why',\n", - " 'how',\n", - " 'all',\n", - " 'any',\n", - " 'both',\n", - " 'each',\n", - " 'few',\n", - " 'more',\n", - " 'most',\n", - " 'other',\n", - " 'some',\n", - " 'such',\n", - " 'no',\n", - " 'nor',\n", - " 'not',\n", - " 'only',\n", - " 'own',\n", - " 'same',\n", - " 'so',\n", - " 'than',\n", - " 'too',\n", - " 'very',\n", - " 's',\n", - " 't',\n", - " 'can',\n", - " 'will',\n", - " 'just',\n", - " 'don',\n", - " 'should',\n", - " 'now',\n", - " \"i'll\",\n", - " \"you'll\",\n", - " \"he'll\",\n", - " \"she'll\",\n", - " \"we'll\",\n", - " \"they'll\",\n", - " \"i'd\",\n", - " \"you'd\",\n", - " \"he'd\",\n", - " \"she'd\",\n", - " \"we'd\",\n", - " \"they'd\",\n", - " \"i'm\",\n", - " \"you're\",\n", - " \"he's\",\n", - " \"she's\",\n", - " \"it's\",\n", - " \"we're\",\n", - " \"they're\",\n", - " \"i've\",\n", - " \"we've\",\n", - " \"you've\",\n", - " \"they've\",\n", - " \"isn't\",\n", - " \"aren't\",\n", - " \"wasn't\",\n", - " \"weren't\",\n", - " \"haven't\",\n", - " \"hasn't\",\n", - " \"hadn't\",\n", - " \"don't\",\n", - " \"doesn't\",\n", - " \"didn't\",\n", - " \"won't\",\n", - " \"wouldn't\",\n", - " \"shan't\",\n", - " \"shouldn't\",\n", - " \"mustn't\",\n", - " \"can't\",\n", - " \"couldn't\",\n", - " 'cannot',\n", - " 'could',\n", - " \"here's\",\n", - " \"how's\",\n", - " \"let's\",\n", - " 'ought',\n", - " \"that's\",\n", - " \"there's\",\n", - " \"what's\",\n", - " \"when's\",\n", - " \"where's\",\n", - " \"who's\",\n", - " \"why's\",\n", - " 'would']" - ] - }, - "execution_count": 79, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "stopwords_cleaner.getStopWords()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 691, - "status": "ok", - "timestamp": 1664907306395, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "i7-YZcLRv8Y7", - "outputId": "8e3d241a-f173-4303-c78c-2bbbf93816f1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "| text| document| token| cleanTokens|\n", - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "| Peter is a very good person.|[{document, 0, 27, Peter is a very go...|[{token, 0, 4, Peter, {sentence -> 0}...|[{token, 0, 4, Peter, {sentence -> 0}...|\n", - "| My life in Russia is very interesting.|[{document, 0, 37, My life in Russia ...|[{token, 0, 1, My, {sentence -> 0}, [...|[{token, 3, 6, life, {sentence -> 0},...|\n", - "|John and Peter are brothers. However ...|[{document, 0, 76, John and Peter are...|[{token, 0, 3, John, {sentence -> 0},...|[{token, 0, 3, John, {sentence -> 0},...|\n", - "|Lucas Nogal Dunbercker is no longer h...|[{document, 0, 67, Lucas Nogal Dunber...|[{token, 0, 4, Lucas, {sentence -> 0}...|[{token, 0, 4, Lucas, {sentence -> 0}...|\n", - "|Europe is very culture rich. There ar...|[{document, 0, 68, Europe is very cul...|[{token, 0, 5, Europe, {sentence -> 0...|[{token, 0, 5, Europe, {sentence -> 0...|\n", - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " stopwords_cleaner])\n", - " \n", - "spark_df = spark.read.text('./sample-sentences-en.txt').toDF('text')\n", - "\n", - "result = nlpPipeline.fit(spark_df).transform(spark_df)\n", - "\n", - "result.show(truncate=40)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 353, - "status": "ok", - "timestamp": 1664907309735, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "lp_oGHvt1waL", - "outputId": "3fc17681-9c6f-40ef-ed7c-4dad19438263" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['Peter', 'good', 'person', '.'])]" - ] - }, - "execution_count": 81, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result.select('cleanTokens.result').take(1)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "zN9HpW_Lix7_" - }, - "source": [ - "## Token Assembler" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1332, - "status": "ok", - "timestamp": 1664907330120, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "V1wMkz9cix7_", - "outputId": "73c0099d-7d2d-4b83-f91c-470d39120c34" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "| text| document| sentences| token| normalized| cleanTokens| clean_text|\n", - "+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "|Peter is a very g...|[{document, 0, 27...|[{document, 0, 27...|[{token, 0, 4, Pe...|[{token, 0, 4, Pe...|[{token, 0, 4, Pe...|[{document, 0, 16...|\n", - "|My life in Russia...|[{document, 0, 37...|[{document, 0, 37...|[{token, 0, 1, My...|[{token, 0, 1, My...|[{token, 3, 6, li...|[{document, 0, 22...|\n", - "|John and Peter ar...|[{document, 0, 76...|[{document, 0, 27...|[{token, 0, 3, Jo...|[{token, 0, 3, Jo...|[{token, 0, 3, Jo...|[{document, 0, 18...|\n", - "|Lucas Nogal Dunbe...|[{document, 0, 67...|[{document, 0, 41...|[{token, 0, 4, Lu...|[{token, 0, 4, Lu...|[{token, 0, 4, Lu...|[{document, 0, 34...|\n", - "|Europe is very cu...|[{document, 0, 68...|[{document, 0, 27...|[{token, 0, 5, Eu...|[{token, 0, 5, Eu...|[{token, 0, 5, Eu...|[{document, 0, 18...|\n", - "+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "sentenceDetector = SentenceDetector()\\\n", - " .setInputCols(['document'])\\\n", - " .setOutputCol('sentences')\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"sentences\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "normalizer = Normalizer() \\\n", - " .setInputCols([\"token\"]) \\\n", - " .setOutputCol(\"normalized\")\\\n", - " .setLowercase(False)\\\n", - "\n", - "stopwords_cleaner = StopWordsCleaner()\\\n", - " .setInputCols(\"normalized\")\\\n", - " .setOutputCol(\"cleanTokens\")\\\n", - " .setCaseSensitive(False)\\\n", - "\n", - "tokenassembler = TokenAssembler()\\\n", - " .setInputCols([\"sentences\", \"cleanTokens\"]) \\\n", - " .setOutputCol(\"clean_text\")\n", - "\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler,\n", - " sentenceDetector,\n", - " tokenizer,\n", - " normalizer,\n", - " stopwords_cleaner,\n", - " tokenassembler])\n", - "\n", - "result = nlpPipeline.fit(spark_df).transform(spark_df)\n", - "result.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 343, - "status": "ok", - "timestamp": 1664907333538, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "eOMngM9y78tp", - "outputId": "0731fa64-683c-48ad-ab5f-a952c9e825cb" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(clean_text=[Row(annotatorType='document', begin=0, end=16, result='Peter good person', metadata={'sentence': '0'}, embeddings=[])])]" - ] - }, - "execution_count": 83, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# if we use TokenAssembler().setPreservePosition(True), the original borders will be preserved (dropped & unwanted chars will be replaced by spaces)\n", - "\n", - "result.select('clean_text').take(1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 445, - "status": "ok", - "timestamp": 1664907335430, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "qEN-vDyQ_AUc", - "outputId": "8b182441-6e9e-4511-ed2c-f23423b4193d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------------------------------------------+-----------------------------------+\n", - "|text |clean_text |\n", - "+-----------------------------------------------------------------------------+-----------------------------------+\n", - "|Peter is a very good person. |Peter good person |\n", - "|My life in Russia is very interesting. |life Russia interesting |\n", - "|John and Peter are brothers. However they don't support each other that much.|John Peter brothers |\n", - "|John and Peter are brothers. However they don't support each other that much.|However dont support much |\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |Lucas Nogal Dunbercker longer happy|\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |good car though |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |Europe culture rich |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |huge churches |\n", - "|Europe is very culture rich. There are huge churches! and big houses! |big houses |\n", - "+-----------------------------------------------------------------------------+-----------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "result.select('text', F.explode(result.clean_text.result).alias('clean_text')).show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 332 - }, - "executionInfo": { - "elapsed": 563, - "status": "ok", - "timestamp": 1664907337458, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "PMS_uxkXqOFu", - "outputId": "6088583c-c781-4fc9-fb67-8a07da21db7e" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
textclean_text
0Peter is a very good person.Peter good person
1My life in Russia is very interesting.life Russia interesting
2John and Peter are brothers. However they don'...John Peter brothers
3John and Peter are brothers. However they don'...However dont support much
4Lucas Nogal Dunbercker is no longer happy. He ...Lucas Nogal Dunbercker longer happy
5Lucas Nogal Dunbercker is no longer happy. He ...good car though
6Europe is very culture rich. There are huge ch...Europe culture rich
7Europe is very culture rich. There are huge ch...huge churches
8Europe is very culture rich. There are huge ch...big houses
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " text \\\n", - "0 Peter is a very good person. \n", - "1 My life in Russia is very interesting. \n", - "2 John and Peter are brothers. However they don'... \n", - "3 John and Peter are brothers. However they don'... \n", - "4 Lucas Nogal Dunbercker is no longer happy. He ... \n", - "5 Lucas Nogal Dunbercker is no longer happy. He ... \n", - "6 Europe is very culture rich. There are huge ch... \n", - "7 Europe is very culture rich. There are huge ch... \n", - "8 Europe is very culture rich. There are huge ch... \n", - "\n", - " clean_text \n", - "0 Peter good person \n", - "1 life Russia interesting \n", - "2 John Peter brothers \n", - "3 However dont support much \n", - "4 Lucas Nogal Dunbercker longer happy \n", - "5 good car though \n", - "6 Europe culture rich \n", - "7 huge churches \n", - "8 big houses " - ] - }, - "execution_count": 85, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result.select('text', F.explode(result.clean_text.result).alias('clean_text')).toPandas()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 809, - "status": "ok", - "timestamp": 1664907340550, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "4NIAZNWcix8D", - "outputId": "37738f86-8c6b-4378-d301-8733fd135f8b" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----+---+-----------------------------------+--------+\n", - "|begin|end|result |sentence|\n", - "+-----+---+-----------------------------------+--------+\n", - "|0 |16 |Peter good person |0 |\n", - "|0 |22 |life Russia interesting |0 |\n", - "|0 |18 |John Peter brothers |0 |\n", - "|29 |53 |However dont support much |1 |\n", - "|0 |34 |Lucas Nogal Dunbercker longer happy|0 |\n", - "|43 |57 |good car though |1 |\n", - "|0 |18 |Europe culture rich |0 |\n", - "|29 |41 |huge churches |1 |\n", - "|54 |63 |big houses |2 |\n", - "+-----+---+-----------------------------------+--------+\n", - "\n" - ] - } - ], - "source": [ - "import pyspark.sql.functions as F\n", - "\n", - "result.withColumn(\n", - " \"tmp\", \n", - " F.explode(\"clean_text\")) \\\n", - " .select(\"tmp.*\").select(\"begin\",\"end\",\"result\",\"metadata.sentence\").show(truncate = False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 847, - "status": "ok", - "timestamp": 1664907366551, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "zJLjfE_Qix8G", - "outputId": "f102695e-561c-48d7-9963-bde2a99c4e32" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------------------------------------------------------------------+-----------------------------------------------------+\n", - "|text |result |\n", - "+-----------------------------------------------------------------------------+-----------------------------------------------------+\n", - "|Peter is a very good person. |[Peter good person] |\n", - "|My life in Russia is very interesting. |[life Russia interesting] |\n", - "|John and Peter are brothers. However they don't support each other that much.|[John Peter brothers However dont support much] |\n", - "|Lucas Nogal Dunbercker is no longer happy. He has a good car though. |[Lucas Nogal Dunbercker longer happy good car though]|\n", - "|Europe is very culture rich. There are huge churches! and big houses! |[Europe culture rich huge churches big houses] |\n", - "+-----------------------------------------------------------------------------+-----------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "# if we hadn't used Sentence Detector, this would be what we got. (tokenizer gets document instead of sentences column)\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "tokenassembler = TokenAssembler()\\\n", - " .setInputCols([\"document\", \"cleanTokens\"]) \\\n", - " .setOutputCol(\"clean_text\")\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler,\n", - " tokenizer,\n", - " normalizer,\n", - " stopwords_cleaner,\n", - " tokenassembler])\n", - "\n", - "result = nlpPipeline.fit(spark_df).transform(spark_df)\n", - "result.select('text', 'clean_text.result').show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 853, - "status": "ok", - "timestamp": 1664907371195, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Pr419bEwix8H", - "outputId": "f638e140-d213-42bc-98a6-5a24c784c1ab" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----+---+---------------------------------------------------+--------+\n", - "|begin|end|result |sentence|\n", - "+-----+---+---------------------------------------------------+--------+\n", - "|0 |16 |Peter good person |0 |\n", - "|0 |22 |life Russia interesting |0 |\n", - "|0 |44 |John Peter brothers However dont support much |0 |\n", - "|0 |50 |Lucas Nogal Dunbercker longer happy good car though|0 |\n", - "|0 |43 |Europe culture rich huge churches big houses |0 |\n", - "+-----+---+---------------------------------------------------+--------+\n", - "\n" - ] - } - ], - "source": [ - "result.withColumn(\n", - " \"tmp\", \n", - " F.explode(\"clean_text\")) \\\n", - " .select(\"tmp.*\").select(\"begin\",\"end\",\"result\",\"metadata.sentence\").show(truncate = False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "iPrXwVA9GCCS" - }, - "source": [ - "**IMPORTANT NOTE:**\n", - "\n", - "If you have some other steps & annotators in your pipeline that will need to use the tokens from cleaned text (assembled tokens), you will need to tokenize the processed text again as the original text is probably changed completely." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "XO_ZWY2z1Ka6" - }, - "source": [ - "## Stemmer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "aE2PEX0x1NgQ" - }, - "source": [ - "Returns hard-stems out of words with the objective of retrieving the meaningful part of the word\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "0sN0gS3ayfHT" - }, - "outputs": [], - "source": [ - "stemmer = Stemmer() \\\n", - " .setInputCols([\"token\"]) \\\n", - " .setOutputCol(\"stem\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 794, - "status": "ok", - "timestamp": 1664907389078, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "VdJ-8aUy1RrC", - "outputId": "15a656ac-2a07-45f4-bd0d-7dcac1ca2fa2" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "| text| document| token| stem|\n", - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "| Peter is a very good person.|[{document, 0, 27, Peter is a very go...|[{token, 0, 4, Peter, {sentence -> 0}...|[{token, 0, 4, peter, {sentence -> 0}...|\n", - "| My life in Russia is very interesting.|[{document, 0, 37, My life in Russia ...|[{token, 0, 1, My, {sentence -> 0}, [...|[{token, 0, 1, my, {sentence -> 0}, [...|\n", - "|John and Peter are brothers. However ...|[{document, 0, 76, John and Peter are...|[{token, 0, 3, John, {sentence -> 0},...|[{token, 0, 3, john, {sentence -> 0},...|\n", - "|Lucas Nogal Dunbercker is no longer h...|[{document, 0, 67, Lucas Nogal Dunber...|[{token, 0, 4, Lucas, {sentence -> 0}...|[{token, 0, 4, luca, {sentence -> 0},...|\n", - "|Europe is very culture rich. There ar...|[{document, 0, 68, Europe is very cul...|[{token, 0, 5, Europe, {sentence -> 0...|[{token, 0, 5, europ, {sentence -> 0}...|\n", - "+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " stemmer])\n", - "\n", - "result = nlpPipeline.fit(spark_df).transform(spark_df)\n", - "\n", - "result.show(truncate=40)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 330, - "status": "ok", - "timestamp": 1664907391472, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "SvapcdcM1fWR", - "outputId": "f4596b57-a019-4344-9f09-561e37d6c020" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-------------------------------------------------------------------------------------------+\n", - "|result |\n", - "+-------------------------------------------------------------------------------------------+\n", - "|[peter, i, a, veri, good, person, .] |\n", - "|[my, life, in, russia, i, veri, interest, .] |\n", - "|[john, and, peter, ar, brother, ., howev, thei, don't, support, each, other, that, much, .]|\n", - "|[luca, nogal, dunberck, i, no, longer, happi, ., he, ha, a, good, car, though, .] |\n", - "|[europ, i, veri, cultur, rich, ., there, ar, huge, church, !, and, big, hous, !] |\n", - "+-------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "result.select('stem.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "CKvKqZx9wtpj" - }, - "source": [ - "If you are using PySpark 3.1.2 or below, You should use this format.\n", - "``` \n", - "import pyspark.sql.functions as F\n", - "\n", - "result_df = result.select(F.explode(F.arrays_zip(\"token.result\", \"stem.result\")).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"stem\")).toPandas()\n", - "\n", - "result_df.head(10)\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "executionInfo": { - "elapsed": 901, - "status": "ok", - "timestamp": 1664907414472, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "wCEPeXr-1iXR", - "outputId": "75616bdc-6018-4e2b-850a-20cfce3c6066" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tokenstem
0Peterpeter
1isi
2aa
3veryveri
4goodgood
5personperson
6..
7Mymy
8lifelife
9inin
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " token stem\n", - "0 Peter peter\n", - "1 is i\n", - "2 a a\n", - "3 very veri\n", - "4 good good\n", - "5 person person\n", - "6 . .\n", - "7 My my\n", - "8 life life\n", - "9 in in" - ] - }, - "execution_count": 92, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pyspark.sql.functions as F\n", - "\n", - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.stem.result)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"stem\")).toPandas()\n", - "\n", - "result_df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "On3UrCoM2RFQ" - }, - "source": [ - "## Lemmatizer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "onCYFXGO2VSk" - }, - "source": [ - "Retrieves lemmas out of words with the objective of returning a base dictionary word " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "gZYXURzi3N2T" - }, - "outputs": [], - "source": [ - "!wget -q https://raw.githubusercontent.com/mahavivo/vocabulary/master/lemmas/AntBNC_lemmas_ver_001.txt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "2y_woCty2QXj" - }, - "outputs": [], - "source": [ - "lemmatizer = Lemmatizer() \\\n", - " .setInputCols([\"token\"]) \\\n", - " .setOutputCol(\"lemma\") \\\n", - " .setDictionary(\"./AntBNC_lemmas_ver_001.txt\", value_delimiter =\"\\t\", key_delimiter = \"->\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 10, - "status": "ok", - "timestamp": 1664907421866, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "eR19i9uCKytw", - "outputId": "89c7af05-0c2f-47ce-ca34-db51ed1d888a" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{Param(parent='Lemmatizer_d115c22dc86c', name='lazyAnnotator', doc='Whether this AnnotatorModel acts as lazy in RecursivePipelines'): False,\n", - " Param(parent='Lemmatizer_d115c22dc86c', name='formCol', doc='Column that correspends to CoNLLU(formCol=) output'): 'form',\n", - " Param(parent='Lemmatizer_d115c22dc86c', name='lemmaCol', doc='Column that correspends to CoNLLU(lemmaCol=) output'): 'lemma',\n", - " Param(parent='Lemmatizer_d115c22dc86c', name='inputCols', doc='previous annotations columns, if renamed'): ['token'],\n", - " Param(parent='Lemmatizer_d115c22dc86c', name='outputCol', doc='output annotation column. can be left default.'): 'lemma',\n", - " Param(parent='Lemmatizer_d115c22dc86c', name='dictionary', doc=\"lemmatizer external dictionary. needs 'keyDelimiter' and 'valueDelimiter' in options for parsing target text\"): JavaObject id=o3141}" - ] - }, - "execution_count": 95, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lemmatizer.extractParamMap()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 3015, - "status": "ok", - "timestamp": 1664907440131, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "dxSeQ0yz16cv", - "outputId": "edd595b7-7f74-4bd6-d451-6472dcecffd8" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "| text| document| token| stem| lemma|\n", - "+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "|Peter is a very g...|[{document, 0, 27...|[{token, 0, 4, Pe...|[{token, 0, 4, pe...|[{token, 0, 4, Pe...|\n", - "|My life in Russia...|[{document, 0, 37...|[{token, 0, 1, My...|[{token, 0, 1, my...|[{token, 0, 1, My...|\n", - "|John and Peter ar...|[{document, 0, 76...|[{token, 0, 3, Jo...|[{token, 0, 3, jo...|[{token, 0, 3, Jo...|\n", - "|Lucas Nogal Dunbe...|[{document, 0, 67...|[{token, 0, 4, Lu...|[{token, 0, 4, lu...|[{token, 0, 4, Lu...|\n", - "|Europe is very cu...|[{document, 0, 68...|[{token, 0, 5, Eu...|[{token, 0, 5, eu...|[{token, 0, 5, Eu...|\n", - "+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "stemmer = Stemmer() \\\n", - " .setInputCols([\"token\"]) \\\n", - " .setOutputCol(\"stem\")\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " stemmer,\n", - " lemmatizer])\n", - "\n", - "result = nlpPipeline.fit(spark_df).transform(spark_df)\n", - "result.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 342, - "status": "ok", - "timestamp": 1664907442014, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "3LVBY-fL3kmv", - "outputId": "1177fe09-c218-47e1-df47-c02eb0f6a238" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+---------------------------------------------------------------------------------------------+\n", - "|result |\n", - "+---------------------------------------------------------------------------------------------+\n", - "|[Peter, be, a, very, good, person, .] |\n", - "|[My, life, in, Russia, be, very, interest, .] |\n", - "|[John, and, Peter, be, brother, ., However, they, don't, support, each, other, that, much, .]|\n", - "|[Lucas, Nogal, Dunbercker, be, no, long, happy, ., He, have, a, good, car, though, .] |\n", - "|[Europe, be, very, culture, rich, ., There, be, huge, church, !, and, big, house, !] |\n", - "+---------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "result.select('lemma.result').show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "executionInfo": { - "elapsed": 445, - "status": "ok", - "timestamp": 1664907445211, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "QAJCpPbW3oZq", - "outputId": "16de8a7f-1e88-44f8-a115-dea1e1cca4da" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tokenstemlemma
0PeterpeterPeter
1isibe
2aaa
3veryverivery
4goodgoodgood
5personpersonperson
6...
7MymyMy
8lifelifelife
9ininin
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " token stem lemma\n", - "0 Peter peter Peter\n", - "1 is i be\n", - "2 a a a\n", - "3 very veri very\n", - "4 good good good\n", - "5 person person person\n", - "6 . . .\n", - "7 My my My\n", - "8 life life life\n", - "9 in in in" - ] - }, - "execution_count": 98, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.stem.result, \n", - " result.lemma.result)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"stem\"),\n", - " F.expr(\"cols['2']\").alias(\"lemma\")).toPandas()\n", - "\n", - "result_df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "EgdWV7yFix8e" - }, - "source": [ - "## NGram Generator" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "TCuzINkOix8f" - }, - "source": [ - "NGramGenerator annotator takes as input a sequence of strings (e.g. the output of a `Tokenizer`, `Normalizer`, `Stemmer`, `Lemmatizer`, and `StopWordsCleaner`). \n", - "\n", - "The parameter n is used to determine the number of terms in each n-gram. The output will consist of a sequence of n-grams where each n-gram is represented by a space-delimited string of n consecutive words with annotatorType `CHUNK` same as the Chunker annotator.\n", - "\n", - "Functions:\n", - "\n", - "`setN:` number elements per n-gram (>=1)\n", - "\n", - "`setEnableCumulative:` whether to calculate just the actual n-grams or all n-grams from 1 through n\n", - "\n", - "`setDelimiter:` Glue character used to join the tokens" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 805, - "status": "ok", - "timestamp": 1664907463529, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "DxhS3L0_ix8f", - "outputId": "1177d632-83cd-468a-c4bd-f1362790595e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "| result|\n", - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "| [Peter, is, a, very, good, person, ., Peter_is, is_a, a_very, very_good, good_person, person_., Peter_is_a, is_a_very, a_very_good, very_good_person, good_person_.]|\n", - "|[My, life, in, Russia, is, very, interesting, ., My_life, life_in, in_Russia, Russia_is, is_very, very_interesting, interesting_., My_life_in, life_in_Russia, in_Russia_is, Russia_is_very, is_very_...|\n", - "|[John, and, Peter, are, brothers, ., However, they, don't, support, each, other, that, much, ., John_and, and_Peter, Peter_are, are_brothers, brothers_., ._However, However_they, they_don't, don't_...|\n", - "|[Lucas, Nogal, Dunbercker, is, no, longer, happy, ., He, has, a, good, car, though, ., Lucas_Nogal, Nogal_Dunbercker, Dunbercker_is, is_no, no_longer, longer_happy, happy_., ._He, He_has, has_a, a_...|\n", - "|[Europe, is, very, culture, rich, ., There, are, huge, churches, !, and, big, houses, !, Europe_is, is_very, very_culture, culture_rich, rich_., ._There, There_are, are_huge, huge_churches, churche...|\n", - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "ngrams_cum = NGramGenerator() \\\n", - " .setInputCols([\"token\"]) \\\n", - " .setOutputCol(\"ngrams\") \\\n", - " .setN(3) \\\n", - " .setEnableCumulative(True)\\\n", - " .setDelimiter(\"_\") # Default is space\n", - " \n", - "# .setN(3) means, take bigrams and trigrams.\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " ngrams_cum])\n", - "\n", - "result = nlpPipeline.fit(spark_df).transform(spark_df)\n", - "result.select('ngrams.result').show(truncate=200)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 319, - "status": "ok", - "timestamp": 1664907467569, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "oCVMPxBGGvXu", - "outputId": "4ccee400-375c-4c24-b38c-81f97a955adc" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "| result|\n", - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "| [Peter_is_a, is_a_very, a_very_good, very_good_person, good_person_.]|\n", - "| [My_life_in, life_in_Russia, in_Russia_is, Russia_is_very, is_very_interesting, very_interesting_.]|\n", - "|[John_and_Peter, and_Peter_are, Peter_are_brothers, are_brothers_., brothers_._However, ._However_they, However_they_don't, they_don't_support, don't_support_each, support_each_other, each_other_th...|\n", - "| [Lucas_Nogal_Dunbercker, Nogal_Dunbercker_is, Dunbercker_is_no, is_no_longer, no_longer_happy, longer_happy_., happy_._He, ._He_has, He_has_a, has_a_good, a_good_car, good_car_though, car_though_.]|\n", - "|[Europe_is_very, is_very_culture, very_culture_rich, culture_rich_., rich_._There, ._There_are, There_are_huge, are_huge_churches, huge_churches_!, churches_!_and, !_and_big, and_big_houses, big_ho...|\n", - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "ngrams_nonCum = NGramGenerator() \\\n", - " .setInputCols([\"token\"]) \\\n", - " .setOutputCol(\"ngrams_v2\") \\\n", - " .setN(3) \\\n", - " .setEnableCumulative(False)\\\n", - " .setDelimiter(\"_\") # Default is space\n", - " \n", - "ngrams_nonCum.transform(result).select('ngrams_v2.result').show(truncate=200)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "C55M47nKCL3E" - }, - "source": [ - "## TextMatcher" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8hLITrkJICKO" - }, - "source": [ - "Annotator to match entire phrases (by token) provided in a file against a Document\n", - "\n", - "Functions:\n", - "\n", - "`setEntities(path, format, options)`: Provides a file with phrases to match. Default: Looks up path in configuration.\n", - "\n", - "`path`: a path to a file that contains the entities in the specified format.\n", - "\n", - "`readAs`: the format of the file, can be one of {ReadAs.LINE_BY_LINE, ReadAs.SPARK_DATASET}. Defaults to LINE_BY_LINE.\n", - "\n", - "`options`: a map of additional parameters. Defaults to {“format”: “text”}.\n", - "\n", - "`entityValue` : Value for the entity metadata field to indicate which chunk comes from which textMatcher when there are multiple textMatchers. \n", - "\n", - "`mergeOverlapping` : whether to merge overlapping matched chunks. Defaults false\n", - "\n", - "`caseSensitive` : whether to match regardless of case. Defaults true\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 327, - "status": "ok", - "timestamp": 1664907471907, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "l_DrFKDqK7_-", - "outputId": "b627733a-cf36-44c9-a6a0-0e4cc309d600" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{Param(parent='TextMatcher_06501f2ac688', name='lazyAnnotator', doc='Whether this AnnotatorModel acts as lazy in RecursivePipelines'): False,\n", - " Param(parent='TextMatcher_06501f2ac688', name='caseSensitive', doc='whether to match regardless of case. Defaults true'): True,\n", - " Param(parent='TextMatcher_06501f2ac688', name='mergeOverlapping', doc='whether to merge overlapping matched chunks. Defaults false'): False,\n", - " Param(parent='TextMatcher_06501f2ac688', name='inputCols', doc='previous annotations columns, if renamed'): ['document',\n", - " 'token'],\n", - " Param(parent='TextMatcher_06501f2ac688', name='outputCol', doc='output annotation column. can be left default.'): 'matched_entities'}" - ] - }, - "execution_count": 101, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "entity_extractor = TextMatcher() \\\n", - " .setInputCols([\"document\",'token'])\\\n", - " .setOutputCol(\"matched_entities\")\\\n", - "\n", - "entity_extractor.extractParamMap()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ZyY6vL-gCOnV" - }, - "outputs": [], - "source": [ - "! wget -q https://raw.githubusercontent.com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Public/data/news_category_train.csv\n", - "\n", - "news_df = spark.read \\\n", - " .option(\"header\", True) \\\n", - " .csv(\"news_category_train.csv\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 8, - "status": "ok", - "timestamp": 1664907474995, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "mY7ZBEpwESzO", - "outputId": "87352d8f-31e8-4035-e9c4-7da39e0c7db8" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------+--------------------------------------------------+\n", - "|category| description|\n", - "+--------+--------------------------------------------------+\n", - "|Business| Short sellers, Wall Street's dwindling band of...|\n", - "|Business| Private investment firm Carlyle Group, which h...|\n", - "|Business| Soaring crude prices plus worries about the ec...|\n", - "|Business| Authorities have halted oil export flows from ...|\n", - "|Business| Tearaway world oil prices, toppling records an...|\n", - "+--------+--------------------------------------------------+\n", - "only showing top 5 rows\n", - "\n" - ] - } - ], - "source": [ - "news_df.show(5, truncate=50)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "it2UjbV_ZRHp" - }, - "outputs": [], - "source": [ - "# write the target entities to txt file \n", - "\n", - "entities = ['Wall Street', 'USD', 'stock', 'NYSE']\n", - "with open ('financial_entities.txt', 'w') as f:\n", - " for i in entities:\n", - " f.write(i+'\\n')\n", - "\n", - "\n", - "entities = ['soccer', 'world cup', 'Messi', 'FC Barcelona']\n", - "with open ('sport_entities.txt', 'w') as f:\n", - " for i in entities:\n", - " f.write(i+'\\n')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "ExRo9nnCCgG3" - }, - "outputs": [], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"description\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "financial_entity_extractor = TextMatcher() \\\n", - " .setInputCols([\"document\",'token'])\\\n", - " .setOutputCol(\"financial_entities\")\\\n", - " .setEntities(\"financial_entities.txt\")\\\n", - " .setCaseSensitive(False)\\\n", - " .setEntityValue('financial_entity')\n", - "\n", - "sport_entity_extractor = TextMatcher() \\\n", - " .setInputCols([\"document\",'token'])\\\n", - " .setOutputCol(\"sport_entities\")\\\n", - " .setEntities(\"sport_entities.txt\")\\\n", - " .setCaseSensitive(False)\\\n", - " .setEntityValue('sport_entity')\n", - "\n", - "nlpPipeline = Pipeline(\n", - " stages=[\n", - " documentAssembler, \n", - " tokenizer,\n", - " financial_entity_extractor,\n", - " sport_entity_extractor\n", - " ])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 313, - "status": "ok", - "timestamp": 1664907514547, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "NctznXrSFb7Y", - "outputId": "01bd2324-1723-460a-ac9e-2915541e152e" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=[], result=[]),\n", - " Row(result=[], result=[]),\n", - " Row(result=['stock'], result=[])]" - ] - }, - "execution_count": 106, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result.select('financial_entities.result','sport_entities.result').take(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 5846, - "status": "ok", - "timestamp": 1664907528802, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "8nm65RMNNBha", - "outputId": "c2d130ff-0837-4076-9f31-049342f9fc03" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------------------------------------+----------------------------------+-------------------+\n", - "| text| financial_matches| sport_matches|\n", - "+----------------------------------------------------------------------+----------------------------------+-------------------+\n", - "|\"Company launched the biggest electronic auction of stock in Wall S...| [stock, Wall Street]| []|\n", - "|Google, Inc. significantly cut the expected share price for its ini...| [stock, stock]| []|\n", - "|Google, Inc. significantly cut the expected share price this mornin...| [stock, stock]| []|\n", - "| Shares of Air Canada (AC.TO) fell by more than half on Wednesday,...| [Stock, stock]| []|\n", - "|Stock prices are lower in moderate trading. The Dow Jones Industria...| [Stock, Stock]| []|\n", - "|The bad news just keeps pouring in for mutual fund manager Janus Ca...| [NYSE, NYSE]| []|\n", - "| Shaun Wright Phillips scored in his international debut as Englan...| []|[soccer, World Cup]|\n", - "|NEWCASTLE, ENGLAND - England deservedly beat Ukraine 3-0 today in t...| []|[soccer, World Cup]|\n", - "|MONTREAL (Reuters) - Shares of Air Canada (AC.TO: Quote, Profile, R...| [Stock, stock]| []|\n", - "|\"SAN JOSE, California - On the cusp of its voyage into public tradi...|[stock, Wall Street, stock, Stock]| []|\n", - "|\"Shortly before noon today, Google Inc. stock began trading under t...| [stock, stock]| []|\n", - "|roundup Plus: EA to take World Cup soccer to Xbox...IBM chalks up t...| []|[World Cup, soccer]|\n", - "|The U.S. Securities and Exchange Commission yesterday approved Goog...| [stock, stock]| []|\n", - "|After a bumpy ride toward becoming a publicly traded company, Googl...| [stock, stock]| []|\n", - "|In the most highly anticipated Wall Street debut since the heady da...| [Wall Street, stock]| []|\n", - "|NEW YORK Despite voluble skepticism among investors, Google #39;s s...| [stock, stock]| []|\n", - "|If only the rest of my investments worked out this way. One week ag...| [stock, stock]| []|\n", - "| U.S. stocks to watch: GOOGLE INC. (GOOG.O) Google shares jumped 18...| [stock, stock]| []|\n", - "|\" U.S. stocks to watch: GOOGLE INC. <A HREF=\"\"http://www.invest...| [stock, stock]| []|\n", - "|roundup Plus: KDE updates Linux desktop...EA to take World Cup socc...| []|[World Cup, soccer]|\n", - "+----------------------------------------------------------------------+----------------------------------+-------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "result.select('description','financial_entities.result','sport_entities.result')\\\n", - " .toDF('text','financial_matches','sport_matches').filter((F.size('financial_matches')>1) | (F.size('sport_matches')>1))\\\n", - " .show(truncate=70)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "executionInfo": { - "elapsed": 35765, - "status": "ok", - "timestamp": 1664907567503, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "-bVEDIblFoL6", - "outputId": "4a67c589-7268-4f09-caa2-e4ec3b558e28" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
clinical_entitiesbeginend
0stock112116
1stock114118
2stock4549
3stock126130
4stock188192
5stock5256
6Wall Street6171
7stock7074
8stock143147
9stock294298
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " clinical_entities begin end\n", - "0 stock 112 116\n", - "1 stock 114 118\n", - "2 stock 45 49\n", - "3 stock 126 130\n", - "4 stock 188 192\n", - "5 stock 52 56\n", - "6 Wall Street 61 71\n", - "7 stock 70 74\n", - "8 stock 143 147\n", - "9 stock 294 298" - ] - }, - "execution_count": 108, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result_df = result.select(F.explode(F.arrays_zip(result.financial_entities.result, \n", - " result.financial_entities.begin, \n", - " result.financial_entities.end)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"clinical_entities\"),\n", - " F.expr(\"cols['1']\").alias(\"begin\"),\n", - " F.expr(\"cols['2']\").alias(\"end\")).toPandas()\n", - "\n", - "result_df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "maNIjBznix8x" - }, - "source": [ - "## RegexMatcher" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1367, - "status": "ok", - "timestamp": 1664907568862, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "1FCcjxSsaeEk", - "outputId": "2fa8bd5d-a2d1-47b1-e912-08caa6d1aa76" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------+\n", - "| text|\n", - "+--------------------------------------------------+\n", - "|The human KCNJ9 (Kir 3.3, GIRK3) is a member of...|\n", - "|BACKGROUND: At present, it is one of the most i...|\n", - "|OBJECTIVE: To investigate the relationship betw...|\n", - "|Combined EEG/fMRI recording has been used to lo...|\n", - "|Kohlschutter syndrome is a rare neurodegenerati...|\n", - "|Statistical analysis of neuroimages is commonly...|\n", - "|The synthetic DOX-LNA conjugate was characteriz...|\n", - "|Our objective was to compare three different me...|\n", - "|We conducted a phase II study to assess the eff...|\n", - "|\"Monomeric sarcosine oxidase (MSOX) is a flavoe...|\n", - "|We presented the tachinid fly Exorista japonica...|\n", - "|The literature dealing with the water conductin...|\n", - "|A novel approach to synthesize chitosan-O-isopr...|\n", - "|An HPLC-ESI-MS-MS method has been developed for...|\n", - "|The localizing and lateralizing values of eye a...|\n", - "|OBJECTIVE: To evaluate the effectiveness and ac...|\n", - "|For the construction of new combinatorial libra...|\n", - "|We report the results of a screen for genetic a...|\n", - "|Intraparenchymal pericatheter cyst is rarely re...|\n", - "|It is known that patients with Klinefelter's sy...|\n", - "+--------------------------------------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "! wget -q\thttps://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/pubmed/pubmed-sample.csv\n", - "\n", - "pubMedDF = spark.read\\\n", - " .option(\"header\", \"true\")\\\n", - " .csv(\"./pubmed-sample.csv\")\\\n", - " .filter(\"AB IS NOT null\")\\\n", - " .withColumnRenamed(\"AB\", \"text\")\\\n", - " .drop(\"TI\")\n", - "\n", - "pubMedDF.show(truncate=50)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "jT2DkSEMix8y" - }, - "outputs": [], - "source": [ - "rules = '''\n", - "renal\\s\\w+, started with 'renal'\n", - "cardiac\\s\\w+, started with 'cardiac'\n", - "\\w*ly\\b, ending with 'ly'\n", - "\\S*\\d+\\S*, match any word that contains numbers\n", - "(\\d+).?(\\d*)\\s*(mg|ml|g), match medication metrics\n", - "'''\n", - "\n", - "with open('regex_rules.txt', 'w') as f:\n", - " \n", - " f.write(rules)\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 9, - "status": "ok", - "timestamp": 1664907568863, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "9xff1kP8LFHr", - "outputId": "9a418bef-a622-4e20-b2ae-953ab4ee75f9" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{Param(parent='RegexMatcher_5f6b3c0b4b06', name='lazyAnnotator', doc='Whether this AnnotatorModel acts as lazy in RecursivePipelines'): False,\n", - " Param(parent='RegexMatcher_5f6b3c0b4b06', name='strategy', doc='MATCH_FIRST|MATCH_ALL|MATCH_COMPLETE'): 'MATCH_ALL'}" - ] - }, - "execution_count": 111, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "RegexMatcher().extractParamMap()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 333, - "status": "ok", - "timestamp": 1664907569192, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ejUrjIGjix8z", - "outputId": "bf33296d-abac-4f3b-d35e-089fdced0b33" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['inwardly', 'family', 'spansapproximately', 'byapproximately', 'approximately', 'respectively', 'poly', 'KCNJ9', '3.3,', 'GIRK3)', 'KCNJ9', '1q21-23', '7.6', '2.2', '2.6', 'identified14', 'aVal366Ala', '8', 'KCNJ9', 'KCNJ9', '9 g']),\n", - " Row(result=['previously', 'previously', 'intravenously', 'previously', '25', 'mg/m(2)', '1', '8', 'a3', '50', '20.0%', '(10', '50;', '95%', 'interval,10.0-33.7%).', '58.0%', '[10', '18', '50].', '(50%', '115.0', '17.3%', '52).', '25 mg']),\n", - " Row(result=['renal failure', 'cardiac surgery', 'cardiac surgery', 'cardiac surgical', 'early', 'statistically', 'analy', '1995', '2005', '=9796).', '2.9', '11years).', '11.3%', '1105),', '7.2%', '30%', '0.0001),', '1.55,95%', '1.42-1.70,', '0.0001).'])]" - ] - }, - "execution_count": 112, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "regex_matcher = RegexMatcher()\\\n", - " .setInputCols('document')\\\n", - " .setStrategy(\"MATCH_ALL\")\\\n", - " .setOutputCol(\"regex_matches\")\\\n", - " .setExternalRules(path='./regex_rules.txt', delimiter=',')\n", - " \n", - "\n", - "nlpPipeline = Pipeline(\n", - " stages=[\n", - " documentAssembler, \n", - " regex_matcher\n", - " ])\n", - "\n", - "match_df = nlpPipeline.fit(pubMedDF).transform(pubMedDF)\n", - "match_df.select('regex_matches.result').take(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 394, - "status": "ok", - "timestamp": 1664907569582, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "3xLGRM6Vix81", - "outputId": "4aa8d560-6a60-4c9d-ebe2-de2ba5f8de32" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------------------------------------+----------------------------------------------------------------------+\n", - "| text| matches|\n", - "+----------------------------------------------------------------------+----------------------------------------------------------------------+\n", - "|The human KCNJ9 (Kir 3.3, GIRK3) is a member of the G-protein-activ...|[inwardly, family, spansapproximately, byapproximately, approximate...|\n", - "|BACKGROUND: At present, it is one of the most important issues for ...|[previously, previously, intravenously, previously, 25, mg/m(2), 1,...|\n", - "|OBJECTIVE: To investigate the relationship between preoperative atr...|[renal failure, cardiac surgery, cardiac surgery, cardiac surgical,...|\n", - "|Combined EEG/fMRI recording has been used to localize the generator...|[normally, significantly, effectively, analy, only, considerably, 2...|\n", - "|Statistical analysis of neuroimages is commonly approached with int...|[analy, commonly, overly, normally, thatsuccessfully, recently, ana...|\n", - "|The synthetic DOX-LNA conjugate was characterized by proton nuclear...| [wasanaly, substantially]|\n", - "|Our objective was to compare three different methods of blood press...|[daily, only, Conversely, Hourly, hourly, Hourly, hourly, hourly, h...|\n", - "|We conducted a phase II study to assess the efficacy and tolerabili...|[analy, respectively, generally, 5-fluorouracil, (5-FU)-, 5-FU-base...|\n", - "|\"Monomeric sarcosine oxidase (MSOX) is a flavoenzyme that catalyzes...|[cataly, methylgly, gly, ethylgly, dimethylgly, spectrally, practic...|\n", - "|We presented the tachinid fly Exorista japonica with moving host mo...| [fly, fly, fly, fly, fly]|\n", - "|The literature dealing with the water conducting properties of sapw...| [generally, mathematically, especially]|\n", - "|A novel approach to synthesize chitosan-O-isopropyl-5'-O-d4T monoph...|[efficiently, poly, chitosan-O-isopropyl-5'-O-d4T, Chitosan-d4T, 1....|\n", - "|An HPLC-ESI-MS-MS method has been developed for the quantitative de...|[chromatographically, respectively, successfully, C18, (n=5), 95.0%...|\n", - "|The localizing and lateralizing values of eye and head ictal deviat...| [early, early]|\n", - "|OBJECTIVE: To evaluate the effectiveness and acceptability of expec...|[weekly, respectively, theanaly, 2006, 2007,, 2, 66, 1), 30patients...|\n", - "|We report the results of a screen for genetic association with urin...|[poly, threepoly, significantly, analy, actually, anextremely, only...|\n", - "|Intraparenchymal pericatheter cyst is rarely reported. Obstruction ...| [rarely, possibly, unusually, Early]|\n", - "|PURPOSE: To compare the effectiveness, potential advantages and com...|[analy, comparatively, wassignificantly, respectively, a7-year, 155...|\n", - "|We have demonstrated a new type of all-optical 2 x 2 switch by usin...|[approximately, fully, approximately, approximately, approximately,...|\n", - "|Physalis peruviana (PP) is a widely used medicinal herb for treatin...|[widely, (20,, 40,, 60,, 80, 95%, 100, 95%, (82.3%), onFeCl2-ascorb...|\n", - "+----------------------------------------------------------------------+----------------------------------------------------------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "match_df.select('text','regex_matches.result')\\\n", - " .toDF('text','matches').filter(F.size('matches')>1)\\\n", - " .show(truncate=70)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "g5tfkArf0XQT" - }, - "source": [ - "## MultiDateMatcher" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "mY7q_7zl9HR5" - }, - "source": [ - "Extract exact & normalize dates from relative date-time phrases. The default anchor date will be the date the code is run." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 13, - "status": "ok", - "timestamp": 1664907569583, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "EBIg8nm0LNaF", - "outputId": "79f85c7e-88ea-417c-fffa-c9de90ffb8f1" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{Param(parent='MultiDateMatcher_45d507efaadb', name='lazyAnnotator', doc='Whether this AnnotatorModel acts as lazy in RecursivePipelines'): False,\n", - " Param(parent='MultiDateMatcher_45d507efaadb', name='inputFormats', doc='input formats list of patterns to match'): [''],\n", - " Param(parent='MultiDateMatcher_45d507efaadb', name='outputFormat', doc='desired output format for dates extracted'): 'yyyy/MM/dd',\n", - " Param(parent='MultiDateMatcher_45d507efaadb', name='readMonthFirst', doc='Whether to parse july 07/05/2015 or as 05/07/2015'): True,\n", - " Param(parent='MultiDateMatcher_45d507efaadb', name='defaultDayWhenMissing', doc='which day to set when it is missing from parsed input'): 1}" - ] - }, - "execution_count": 114, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "MultiDateMatcher().extractParamMap()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 757, - "status": "ok", - "timestamp": 1664907584207, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "QxNprtam9S6Q", - "outputId": "b8ac64ce-88ed-4c29-e86f-c4074db2a81b" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------------------+\n", - "|result |\n", - "+------------------------+\n", - "|[2022/10/11, 2022/10/03]|\n", - "+------------------------+\n", - "\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "date_matcher = MultiDateMatcher() \\\n", - " .setInputCols('document') \\\n", - " .setOutputCol(\"date\")\\\n", - " .setOutputFormat(\"yyyy/MM/dd\")\\\n", - " .setSourceLanguage(\"en\")\n", - "\n", - "\n", - "date_pipeline = PipelineModel(\n", - " stages=[\n", - " documentAssembler, \n", - " date_matcher\n", - " ])\n", - "\n", - "sample_df = spark.createDataFrame([['I saw him yesterday and he told me that he will visit us next week']]).toDF(\"text\")\n", - "\n", - "result = date_pipeline.transform(sample_df)\n", - "result.select('date.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "R0Wd3ZLDqM4K" - }, - "source": [ - "Let's set the Input Format and Output Format to specific format" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 361, - "status": "ok", - "timestamp": 1664907596811, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "VFZSzKMrteHj", - "outputId": "c69914bf-582e-4ac7-e976-9f8f7a2b0b44" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------+\n", - "|result |\n", - "+------------+\n", - "|[2022/05/21]|\n", - "+------------+\n", - "\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "date_matcher = MultiDateMatcher() \\\n", - " .setInputCols('document') \\\n", - " .setOutputCol(\"date\")\\\n", - " .setInputFormats([\"dd/MM/yyyy\"])\\\n", - " .setOutputFormat(\"yyyy/MM/dd\")\\\n", - " .setSourceLanguage(\"en\")\n", - "\n", - "date_pipeline = PipelineModel(\n", - " stages=[\n", - " documentAssembler, \n", - " date_matcher\n", - " ])\n", - "\n", - "sample_df = spark.createDataFrame([[\"the last payment date of this invoice is 21/05/2022\"]]).toDF(\"text\")\n", - "\n", - "result = date_pipeline.transform(sample_df)\n", - "result.select('date.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ZOwrFGd8ix83" - }, - "source": [ - "## Text Cleaning with UDF" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1578, - "status": "ok", - "timestamp": 1664907603877, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "FMGb8oMoix83", - "outputId": "1cf4bbb6-8fb4-4e93-fcf4-5e80c548824f" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------------------------------------------------------------+-----------------------+\n", - "|text |cleaned |\n", - "+----------------------------------------------------------------------------------------------+-----------------------+\n", - "|

Have a great birth day!

|Have a great birth day!|\n", - "+----------------------------------------------------------------------------------------------+-----------------------+\n", - "\n" - ] - } - ], - "source": [ - "text = '

Have a great birth day!

'\n", - "\n", - "text_df = spark.createDataFrame([[text]]).toDF(\"text\")\n", - "\n", - "import re\n", - "from pyspark.sql.functions import udf\n", - "from pyspark.sql.types import StringType, IntegerType\n", - "\n", - "clean_text = lambda s: re.sub(r'<[^>]*>', '', s)\n", - "\n", - "text_df.withColumn('cleaned', udf(clean_text, StringType())('text')).select('text','cleaned').show(truncate= False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 409, - "status": "ok", - "timestamp": 1664907605532, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "2jtfb5TGix86", - "outputId": "312a7d3d-8f42-4a59-94b9-58b8cd17e1f2" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 118, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "find_not_alnum_count = lambda s: len([i for i in s if not i.isalnum() and i!=' '])\n", - "\n", - "find_not_alnum_count(\"it's your birth day!\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 350, - "status": "ok", - "timestamp": 1664907607173, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "5d7DkFK7ix87", - "outputId": "77913e9e-917c-4728-92e8-fb9347f15764" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "23" - ] - }, - "execution_count": 119, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text = '

Have a great birth day!

'\n", - "\n", - "find_not_alnum_count(text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 510, - "status": "ok", - "timestamp": 1664907608242, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "OACwrrToix89", - "outputId": "7158910f-9fe7-492d-fe01-4a0861ee6c7b" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------------------------------------------------------------+-------+\n", - "|text |cleaned|\n", - "+----------------------------------------------------------------------------------------------+-------+\n", - "|

Have a great birth day!

|23 |\n", - "+----------------------------------------------------------------------------------------------+-------+\n", - "\n" - ] - } - ], - "source": [ - "text_df.withColumn('cleaned', udf(find_not_alnum_count, IntegerType())('text')).select('text','cleaned').show(truncate= False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Tj-RyTZaix8-" - }, - "source": [ - "## Finisher" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "czhvgXuHix8-" - }, - "source": [ - "***Finisher:*** Once we have our NLP pipeline ready to go, we might want to use our annotation results somewhere else where it is easy to use. The Finisher outputs annotation(s) values into a string.\n", - "\n", - "If we just want the desired output column in the final dataframe, we can use Finisher to drop previous stages in the final output and get the `result` from the process.\n", - "\n", - "This is very handy when you want to use the output from Spark NLP annotator as an input to another Spark ML transformer.\n", - "\n", - "**Settable parameters are:**\n", - "\n", - "| Parametre | Description |\n", - "| - | - |\n", - "|**setInputCols** |input column name string which targets a column of type Array|\n", - "|**setOutputCols** |output column name string which targets a column of type AnnotatorType|\n", - "|**setCleanAnnotations(True)**|Whether to remove intermediate annotations|\n", - "|**setValueSplitSymbol(“#”)**|split values within an annotation character|\n", - "|**setAnnotationSplitSymbol(“@”)**|split values between annotations character|\n", - "|**setIncludeMetadata(False)**|Whether to include metadata keys. Sometimes useful in some annotations.|\n", - "|**setOutputAsArray(False)**| Whether to output as Array. Useful as input for other Spark transformers.|" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 798, - "status": "ok", - "timestamp": 1664907626571, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "z0aDUU2Fix8-", - "outputId": "1a02acdf-b602-417f-f4f6-7d4df90af320" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------+--------------------------------------------------+\n", - "| text| finished_regex_matches|\n", - "+--------------------------------------------------+--------------------------------------------------+\n", - "|The human KCNJ9 (Kir 3.3, GIRK3) is a member of...|[inwardly, family, spansapproximately, byapprox...|\n", - "|BACKGROUND: At present, it is one of the most i...|[previously, previously, intravenously, previou...|\n", - "|OBJECTIVE: To investigate the relationship betw...|[renal failure, cardiac surgery, cardiac surger...|\n", - "|Combined EEG/fMRI recording has been used to lo...|[normally, significantly, effectively, analy, o...|\n", - "|Kohlschutter syndrome is a rare neurodegenerati...| [family]|\n", - "|Statistical analysis of neuroimages is commonly...|[analy, commonly, overly, normally, thatsuccess...|\n", - "|The synthetic DOX-LNA conjugate was characteriz...| [wasanaly, substantially]|\n", - "|Our objective was to compare three different me...|[daily, only, Conversely, Hourly, hourly, Hourl...|\n", - "|We conducted a phase II study to assess the eff...|[analy, respectively, generally, 5-fluorouracil...|\n", - "|\"Monomeric sarcosine oxidase (MSOX) is a flavoe...|[cataly, methylgly, gly, ethylgly, dimethylgly,...|\n", - "|We presented the tachinid fly Exorista japonica...| [fly, fly, fly, fly, fly]|\n", - "|The literature dealing with the water conductin...| [generally, mathematically, especially]|\n", - "|A novel approach to synthesize chitosan-O-isopr...|[efficiently, poly, chitosan-O-isopropyl-5'-O-d...|\n", - "|An HPLC-ESI-MS-MS method has been developed for...|[chromatographically, respectively, successfull...|\n", - "|The localizing and lateralizing values of eye a...| [early, early]|\n", - "|OBJECTIVE: To evaluate the effectiveness and ac...|[weekly, respectively, theanaly, 2006, 2007,, 2...|\n", - "|For the construction of new combinatorial libra...| [newly]|\n", - "|We report the results of a screen for genetic a...|[poly, threepoly, significantly, analy, actuall...|\n", - "|Intraparenchymal pericatheter cyst is rarely re...| [rarely, possibly, unusually, Early]|\n", - "|It is known that patients with Klinefelter's sy...| []|\n", - "+--------------------------------------------------+--------------------------------------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "finisher = Finisher() \\\n", - " .setInputCols([\"regex_matches\"]) \\\n", - " .setIncludeMetadata(False) # set to False to remove metadata\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " regex_matcher,\n", - " finisher])\n", - "\n", - "match_df = nlpPipeline.fit(pubMedDF).transform(pubMedDF)\n", - "match_df.show(truncate = 50)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 414, - "status": "ok", - "timestamp": 1664907628746, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "f9Yy-yUgix9A", - "outputId": "c7970d20-5cb3-4311-c3b8-27150962d539" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "root\n", - " |-- text: string (nullable = true)\n", - " |-- finished_regex_matches: array (nullable = true)\n", - " | |-- element: string (containsNull = true)\n", - "\n" - ] - } - ], - "source": [ - "match_df.printSchema()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 377, - "status": "ok", - "timestamp": 1664907629451, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "gZCd2KSfix9C", - "outputId": "dfaef820-bf99-45d2-b634-ad18dad8e9ab" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------+--------------------------------------------------+\n", - "| text| finished_regex_matches|\n", - "+--------------------------------------------------+--------------------------------------------------+\n", - "|The human KCNJ9 (Kir 3.3, GIRK3) is a member of...|[inwardly, family, spansapproximately, byapprox...|\n", - "|BACKGROUND: At present, it is one of the most i...|[previously, previously, intravenously, previou...|\n", - "|OBJECTIVE: To investigate the relationship betw...|[renal failure, cardiac surgery, cardiac surger...|\n", - "|Combined EEG/fMRI recording has been used to lo...|[normally, significantly, effectively, analy, o...|\n", - "|Statistical analysis of neuroimages is commonly...|[analy, commonly, overly, normally, thatsuccess...|\n", - "|Our objective was to compare three different me...|[daily, only, Conversely, Hourly, hourly, Hourl...|\n", - "|We conducted a phase II study to assess the eff...|[analy, respectively, generally, 5-fluorouracil...|\n", - "|\"Monomeric sarcosine oxidase (MSOX) is a flavoe...|[cataly, methylgly, gly, ethylgly, dimethylgly,...|\n", - "|We presented the tachinid fly Exorista japonica...| [fly, fly, fly, fly, fly]|\n", - "|The literature dealing with the water conductin...| [generally, mathematically, especially]|\n", - "|A novel approach to synthesize chitosan-O-isopr...|[efficiently, poly, chitosan-O-isopropyl-5'-O-d...|\n", - "|An HPLC-ESI-MS-MS method has been developed for...|[chromatographically, respectively, successfull...|\n", - "|OBJECTIVE: To evaluate the effectiveness and ac...|[weekly, respectively, theanaly, 2006, 2007,, 2...|\n", - "|We report the results of a screen for genetic a...|[poly, threepoly, significantly, analy, actuall...|\n", - "|Intraparenchymal pericatheter cyst is rarely re...| [rarely, possibly, unusually, Early]|\n", - "|PURPOSE: To compare the effectiveness, potentia...|[analy, comparatively, wassignificantly, respec...|\n", - "|We have demonstrated a new type of all-optical ...|[approximately, fully, approximately, approxima...|\n", - "|Physalis peruviana (PP) is a widely used medici...|[widely, (20,, 40,, 60,, 80, 95%, 100, 95%, (82...|\n", - "|We report the discovery of a series of substitu...|[highly, potentially, highly, respectively, tub...|\n", - "|The purpose of this study was to identify and c...|[family, Nearly, only, 43, 10, 44%, 32%, 64%, 4...|\n", - "+--------------------------------------------------+--------------------------------------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "match_df.filter(F.size('finished_regex_matches')>2).show(truncate = 50)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "RBeh9Yv44elz" - }, - "source": [ - "## LightPipeline\n", - "\n", - "https://medium.com/spark-nlp/spark-nlp-101-lightpipeline-a544e93f20f1" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "eaANY-Bg4paN" - }, - "source": [ - "LightPipelines are Spark NLP specific Pipelines, equivalent to Spark ML Pipeline, but meant to deal with smaller amounts of data. They’re useful working with small datasets, debugging results, or when running either training or prediction from an API that serves one-off requests.\n", - "\n", - "Spark NLP LightPipelines are Spark ML pipelines converted into a single machine but the multi-threaded task, becoming more than 10x times faster for smaller amounts of data (small is relative, but 50k sentences are roughly a good maximum). To use them, we simply plug in a trained (fitted) pipeline and then annotate a plain text. We don't even need to convert the input text to DataFrame in order to feed it into a pipeline that's accepting DataFrame as an input in the first place. This feature would be quite useful when it comes to getting a prediction for a few lines of text from a trained ML model.\n", - "\n", - " **It is nearly 10x faster than using Spark ML Pipeline**\n", - "\n", - "`LightPipeline(someTrainedPipeline).annotate(someStringOrArray)`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 4053, - "status": "ok", - "timestamp": 1664907656865, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "D5DwGaT4oTyu", - "outputId": "ffa33dfb-23ab-47fc-d413-051d76318cb9" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "| text| document| token| stem| lemma|\n", - "+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "|Peter is a very g...|[{document, 0, 27...|[{token, 0, 4, Pe...|[{token, 0, 4, pe...|[{token, 0, 4, Pe...|\n", - "|My life in Russia...|[{document, 0, 37...|[{token, 0, 1, My...|[{token, 0, 1, my...|[{token, 0, 1, My...|\n", - "|John and Peter ar...|[{document, 0, 76...|[{token, 0, 3, Jo...|[{token, 0, 3, jo...|[{token, 0, 3, Jo...|\n", - "|Lucas Nogal Dunbe...|[{document, 0, 67...|[{token, 0, 4, Lu...|[{token, 0, 4, lu...|[{token, 0, 4, Lu...|\n", - "|Europe is very cu...|[{document, 0, 68...|[{token, 0, 5, Eu...|[{token, 0, 5, eu...|[{token, 0, 5, Eu...|\n", - "+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "stemmer = Stemmer() \\\n", - " .setInputCols([\"token\"]) \\\n", - " .setOutputCol(\"stem\")\n", - "\n", - "nlpPipeline = Pipeline(\n", - " stages=[\n", - " documentAssembler, \n", - " tokenizer,\n", - " stemmer,\n", - " lemmatizer\n", - " ])\n", - "\n", - "empty_df = spark.createDataFrame([['']]).toDF(\"text\")\n", - "\n", - "pipelineModel = nlpPipeline.fit(empty_df)\n", - "nlpPipeline.fit(empty_df).transform(spark_df).show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "kilQL1ps4kXh" - }, - "outputs": [], - "source": [ - "from sparknlp.base import LightPipeline\n", - "\n", - "light_model = LightPipeline(pipelineModel)\n", - "light_result = light_model.annotate(\"John and Peter are brothers. However they don't support each other that much.\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 15, - "status": "ok", - "timestamp": 1664907657454, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Sw9Z5q_H49M_", - "outputId": "ca407fb9-bb67-47f9-9005-4e0094a5dd14" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "dict_keys(['document', 'token', 'stem', 'lemma'])" - ] - }, - "execution_count": 126, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "light_result.keys()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 14, - "status": "ok", - "timestamp": 1664907657455, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "3x4u11yQ5CxR", - "outputId": "069b4820-308b-459a-e8c2-d8162413d0b2" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[('John', 'john', 'John'),\n", - " ('and', 'and', 'and'),\n", - " ('Peter', 'peter', 'Peter'),\n", - " ('are', 'ar', 'be'),\n", - " ('brothers', 'brother', 'brother'),\n", - " ('.', '.', '.'),\n", - " ('However', 'howev', 'However'),\n", - " ('they', 'thei', 'they'),\n", - " (\"don't\", \"don't\", \"don't\"),\n", - " ('support', 'support', 'support'),\n", - " ('each', 'each', 'each'),\n", - " ('other', 'other', 'other'),\n", - " ('that', 'that', 'that'),\n", - " ('much', 'much', 'much'),\n", - " ('.', '.', '.')]" - ] - }, - "execution_count": 127, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "list(zip(light_result['token'], light_result['stem'], light_result['lemma']))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "cOe6aYzn5NXG" - }, - "outputs": [], - "source": [ - "light_result = light_model.fullAnnotate(\"John and Peter are brothers. However they don't support each other that much.\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 9, - "status": "ok", - "timestamp": 1664907658672, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "nObeWNkt55pS", - "outputId": "c82c79a2-398e-4523-e6b1-36cfdc9a1093" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'document': [Annotation(document, 0, 76, John and Peter are brothers. However they don't support each other that much., {})],\n", - " 'token': [Annotation(token, 0, 3, John, {'sentence': '0'}),\n", - " Annotation(token, 5, 7, and, {'sentence': '0'}),\n", - " Annotation(token, 9, 13, Peter, {'sentence': '0'}),\n", - " Annotation(token, 15, 17, are, {'sentence': '0'}),\n", - " Annotation(token, 19, 26, brothers, {'sentence': '0'}),\n", - " Annotation(token, 27, 27, ., {'sentence': '0'}),\n", - " Annotation(token, 29, 35, However, {'sentence': '0'}),\n", - " Annotation(token, 37, 40, they, {'sentence': '0'}),\n", - " Annotation(token, 42, 46, don't, {'sentence': '0'}),\n", - " Annotation(token, 48, 54, support, {'sentence': '0'}),\n", - " Annotation(token, 56, 59, each, {'sentence': '0'}),\n", - " Annotation(token, 61, 65, other, {'sentence': '0'}),\n", - " Annotation(token, 67, 70, that, {'sentence': '0'}),\n", - " Annotation(token, 72, 75, much, {'sentence': '0'}),\n", - " Annotation(token, 76, 76, ., {'sentence': '0'})],\n", - " 'stem': [Annotation(token, 0, 3, john, {'sentence': '0'}),\n", - " Annotation(token, 5, 7, and, {'sentence': '0'}),\n", - " Annotation(token, 9, 13, peter, {'sentence': '0'}),\n", - " Annotation(token, 15, 17, ar, {'sentence': '0'}),\n", - " Annotation(token, 19, 26, brother, {'sentence': '0'}),\n", - " Annotation(token, 27, 27, ., {'sentence': '0'}),\n", - " Annotation(token, 29, 35, howev, {'sentence': '0'}),\n", - " Annotation(token, 37, 40, thei, {'sentence': '0'}),\n", - " Annotation(token, 42, 46, don't, {'sentence': '0'}),\n", - " Annotation(token, 48, 54, support, {'sentence': '0'}),\n", - " Annotation(token, 56, 59, each, {'sentence': '0'}),\n", - " Annotation(token, 61, 65, other, {'sentence': '0'}),\n", - " Annotation(token, 67, 70, that, {'sentence': '0'}),\n", - " Annotation(token, 72, 75, much, {'sentence': '0'}),\n", - " Annotation(token, 76, 76, ., {'sentence': '0'})],\n", - " 'lemma': [Annotation(token, 0, 3, John, {'sentence': '0'}),\n", - " Annotation(token, 5, 7, and, {'sentence': '0'}),\n", - " Annotation(token, 9, 13, Peter, {'sentence': '0'}),\n", - " Annotation(token, 15, 17, be, {'sentence': '0'}),\n", - " Annotation(token, 19, 26, brother, {'sentence': '0'}),\n", - " Annotation(token, 27, 27, ., {'sentence': '0'}),\n", - " Annotation(token, 29, 35, However, {'sentence': '0'}),\n", - " Annotation(token, 37, 40, they, {'sentence': '0'}),\n", - " Annotation(token, 42, 46, don't, {'sentence': '0'}),\n", - " Annotation(token, 48, 54, support, {'sentence': '0'}),\n", - " Annotation(token, 56, 59, each, {'sentence': '0'}),\n", - " Annotation(token, 61, 65, other, {'sentence': '0'}),\n", - " Annotation(token, 67, 70, that, {'sentence': '0'}),\n", - " Annotation(token, 72, 75, much, {'sentence': '0'}),\n", - " Annotation(token, 76, 76, ., {'sentence': '0'})]}]" - ] - }, - "execution_count": 129, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "light_result" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 437, - "status": "ok", - "timestamp": 1664907660277, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "uEgemHyB57LJ", - "outputId": "5b8cb4b6-84f1-4e4b-e273-ce143c17a126" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'document': ['How did serfdom develop in and then leave Russia ?'],\n", - " 'token': ['How',\n", - " 'did',\n", - " 'serfdom',\n", - " 'develop',\n", - " 'in',\n", - " 'and',\n", - " 'then',\n", - " 'leave',\n", - " 'Russia',\n", - " '?'],\n", - " 'stem': ['how',\n", - " 'did',\n", - " 'serfdom',\n", - " 'develop',\n", - " 'in',\n", - " 'and',\n", - " 'then',\n", - " 'leav',\n", - " 'russia',\n", - " '?'],\n", - " 'lemma': ['How',\n", - " 'do',\n", - " 'serfdom',\n", - " 'develop',\n", - " 'in',\n", - " 'and',\n", - " 'then',\n", - " 'leave',\n", - " 'Russia',\n", - " '?']},\n", - " {'document': ['There will be some exciting breakthroughs in NLP this year.'],\n", - " 'token': ['There',\n", - " 'will',\n", - " 'be',\n", - " 'some',\n", - " 'exciting',\n", - " 'breakthroughs',\n", - " 'in',\n", - " 'NLP',\n", - " 'this',\n", - " 'year',\n", - " '.'],\n", - " 'stem': ['there',\n", - " 'will',\n", - " 'be',\n", - " 'some',\n", - " 'excit',\n", - " 'breakthrough',\n", - " 'in',\n", - " 'nlp',\n", - " 'thi',\n", - " 'year',\n", - " '.'],\n", - " 'lemma': ['There',\n", - " 'will',\n", - " 'be',\n", - " 'some',\n", - " 'exciting',\n", - " 'breakthrough',\n", - " 'in',\n", - " 'NLP',\n", - " 'this',\n", - " 'year',\n", - " '.']}]" - ] - }, - "execution_count": 130, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text_list= [\"How did serfdom develop in and then leave Russia ?\",\n", - "\"There will be some exciting breakthroughs in NLP this year.\"]\n", - "\n", - "light_model.annotate(text_list)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-44fmATEqrL_" - }, - "source": [ - "**important note:** When you use Finisher in your pipeline, regardless of setting `cleanAnnotations` to False or True, LigtPipeline will only return the finished columns." - ] - } - ], - "metadata": { - "colab": { - "collapsed_sections": [], - "machine_shape": "hm", - "provenance": [] - }, - "gpuClass": "standard", - "kernelspec": { - "display_name": "base", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.12 (main, Apr 5 2022, 06:56:58) \n[GCC 7.5.0]" - }, - "vscode": { - "interpreter": { - "hash": "3d597f4c481aa0f25dceb95d2a0067e73c0966dcbd003d741d821a7208527ecf" - } - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/examples/bak3.SparkNLP_Pretrained_Models.ipynb b/examples/bak3.SparkNLP_Pretrained_Models.ipynb deleted file mode 100644 index 899519bf610023..00000000000000 --- a/examples/bak3.SparkNLP_Pretrained_Models.ipynb +++ /dev/null @@ -1,9011 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "sXatvRX899i0" - }, - "source": [ - "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JhpTOc_Ox8P8" - }, - "source": [ - "\n", - "\n", - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/spark-nlp-workshop/blob/master/tutorials/Certification_Trainings/Public/3.SparkNLP_Pretrained_Models.ipynb)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uzDYtrcEe0Ig" - }, - "source": [ - "# 3. Spark NLP Pretrained Models" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "RcOCaLKoIwow" - }, - "source": [ - "Spark NLP offers the following pre-trained models in 200+ languages and all you need to do is to load the pre-trained model into your disk by specifying the model name and then configuring the model parameters as per your use case and dataset. Then you will not need to worry about training a new model from scratch and will be able to enjoy the pre-trained SOTA algorithms directly applied to your own data with transform().\n", - "\n", - "In the official documentation, you can find detailed information regarding how these models are trained by using which algorithms and datasets.\n", - "\n", - "https://github.com/JohnSnowLabs/spark-nlp-models\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "uKCBqmQKUzPc" - }, - "source": [ - "![JohnSnowLabs](https://www.johnsnowlabs.com/wp-content/uploads/2021/06/spark_npl_06_2021.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lYYRQmIKIZ-1" - }, - "source": [ - "## Colab Setup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "bG6E9KhzIatv" - }, - "outputs": [], - "source": [ - "!pip install -q pyspark==3.3.0 spark-nlp==4.3.0" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 254 - }, - "executionInfo": { - "elapsed": 19647, - "status": "ok", - "timestamp": 1664911118555, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "E1PhbeBKKYyT", - "outputId": "5f4215bc-5c77-40b9-dc42-18e4bb8a9c3f" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Spark NLP version 4.3.0\n", - "Apache Spark version: 3.3.0\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "

SparkSession - in-memory

\n", - " \n", - "
\n", - "

SparkContext

\n", - "\n", - "

Spark UI

\n", - "\n", - "
\n", - "
Version
\n", - "
v3.3.0
\n", - "
Master
\n", - "
local[*]
\n", - "
AppName
\n", - "
Spark NLP
\n", - "
\n", - "
\n", - " \n", - "
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import sparknlp\n", - "\n", - "spark = sparknlp.start()\n", - "\n", - "from sparknlp.base import *\n", - "from sparknlp.annotator import *\n", - "\n", - "print(\"Spark NLP version\", sparknlp.version())\n", - "print(\"Apache Spark version:\", spark.version)\n", - "\n", - "spark" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "09BYgkOkIsV4" - }, - "source": [ - "## LemmatizerModel" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "HbYUnHwPoFq2" - }, - "outputs": [], - "source": [ - "from pyspark.ml import Pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "1zuJoZq-Saer" - }, - "outputs": [], - "source": [ - "!wget -q -O news_category_test.csv https://s3.amazonaws.com/auxdata.johnsnowlabs.com/public/resources/en/classifier-dl/news_Category/news_category_test.csv" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1165, - "status": "ok", - "timestamp": 1664911615584, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ELxwZNaTSd1K", - "outputId": "8ffc8354-0452-4405-d3c9-9a957ef619c5" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------+--------------------------------------------------+\n", - "|category| text|\n", - "+--------+--------------------------------------------------+\n", - "|Business|Unions representing workers at Turner Newall ...|\n", - "|Sci/Tech| TORONTO, Canada A second team of rocketeers...|\n", - "|Sci/Tech| A company founded by a chemistry researcher at...|\n", - "|Sci/Tech| It's barely dawn when Mike Fitzpatrick starts ...|\n", - "|Sci/Tech| Southern California's smog fighting agency wen...|\n", - "|Sci/Tech|\"The British Department for Education and Skill...|\n", - "|Sci/Tech|\"confessed author of the Netsky and Sasser viru...|\n", - "|Sci/Tech|\\\\FOAF/LOAF and bloom filters have a lot of in...|\n", - "|Sci/Tech|\"Wiltshire Police warns about \"\"phishing\"\" afte...|\n", - "|Sci/Tech|In its first two years, the UK's dedicated card...|\n", - "|Sci/Tech| A group of technology companies including Tex...|\n", - "|Sci/Tech| Apple Computer Inc.<AAPL.O> on Tuesday ...|\n", - "|Sci/Tech| Free Record Shop, a Dutch music retail chain,...|\n", - "|Sci/Tech|A giant 100km colony of ants which has been di...|\n", - "|Sci/Tech| \"Dolphin groups, or \"\"pods\"\"|\n", - "|Sci/Tech|Tyrannosaurus rex achieved its massive size due...|\n", - "|Sci/Tech| Scientists have discovered irregular lumps be...|\n", - "|Sci/Tech| ESAs Mars Express has relayed pictures from o...|\n", - "|Sci/Tech|When did life begin? One evidential clue stems ...|\n", - "|Sci/Tech|update Earnings per share rise compared with a ...|\n", - "+--------+--------------------------------------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "import pyspark.sql.functions as F\n", - "\n", - "news_df = spark.read\\\n", - " .option(\"header\", \"true\")\\\n", - " .csv(\"news_category_test.csv\")\\\n", - " .withColumnRenamed(\"description\", \"text\")\n", - "\n", - "news_df.show(truncate=50)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "qd-CX_39Iktn" - }, - "outputs": [], - "source": [ - "lemmatizer = LemmatizerModel.pretrained('lemma_antbnc', 'en') \\\n", - " .setInputCols([\"token\"]) \\\n", - " .setOutputCol(\"lemma\") \\\n", - "\n", - "'''\n", - "lemmatizer = Lemmatizer() \\\n", - " .setInputCols([\"token\"]) \\\n", - " .setOutputCol(\"lemma\") \\\n", - " .setDictionary(\"./AntBNC_lemmas_ver_001.txt\", value_delimiter =\"\\t\", key_delimiter = \"->\")\n", - "'''" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "avTepygiVUFC" - }, - "outputs": [], - "source": [ - "!cd ~/cache_pretrained && ls -l" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "mAYe90QU8lHh" - }, - "outputs": [], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "stemmer = Stemmer() \\\n", - " .setInputCols([\"token\"]) \\\n", - " .setOutputCol(\"stem\")\n", - "\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " stemmer,\n", - " lemmatizer])\n", - "\n", - "empty_df = spark.createDataFrame([['']]).toDF(\"text\")\n", - "\n", - "pipelineModel = nlpPipeline.fit(empty_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1483, - "status": "ok", - "timestamp": 1664910030044, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "YTvZeE0vIk2Y", - "outputId": "e5fbb045-0cae-40f3-9594-b15d98d05169" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "|category| text| document| token| stem| lemma|\n", - "+--------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "|Business|Unions representi...|[{document, 0, 12...|[{token, 0, 5, Un...|[{token, 0, 5, un...|[{token, 0, 5, Un...|\n", - "|Sci/Tech| TORONTO, Canada ...|[{document, 0, 22...|[{token, 1, 7, TO...|[{token, 1, 7, to...|[{token, 1, 7, TO...|\n", - "|Sci/Tech| A company founde...|[{document, 0, 20...|[{token, 1, 1, A,...|[{token, 1, 1, a,...|[{token, 1, 1, A,...|\n", - "|Sci/Tech| It's barely dawn...|[{document, 0, 26...|[{token, 1, 4, It...|[{token, 1, 4, it...|[{token, 1, 4, It...|\n", - "|Sci/Tech| Southern Califor...|[{document, 0, 17...|[{token, 1, 8, So...|[{token, 1, 8, so...|[{token, 1, 8, So...|\n", - "+--------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "only showing top 5 rows\n", - "\n" - ] - } - ], - "source": [ - "result = pipelineModel.transform(news_df)\n", - "\n", - "result.show(5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 17, - "status": "ok", - "timestamp": 1664908494075, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "-efJWYk6NiE3", - "outputId": "be9c6900-ef54-4c47-b930-3a34f22c8a94" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "| result| result|\n", - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "|[Unions, representing, workers, at, Turner, Newall, say, they, are, ', disappointed, ', after, ta...|[Unions, represent, worker, at, Turner, Newall, say, they, be, ', disappointed, ', after, talk, w...|\n", - "|[TORONTO, ,, Canada, A, second, team, of, rocketeers, competing, for, the, #36;10, million, Ansar...|[TORONTO, ,, Canada, A, second, team, of, rocketeer, compete, for, the, #36;10, million, Ansari, ...|\n", - "|[A, company, founded, by, a, chemistry, researcher, at, the, University, of, Louisville, won, a, ...|[A, company, founded, by, a, chemistry, researcher, at, the, University, of, Louisville, win, a, ...|\n", - "|[It's, barely, dawn, when, Mike, Fitzpatrick, starts, his, shift, with, a, blur, of, colorful, ma...|[It's, barely, dawn, when, Mike, Fitzpatrick, start, he, shift, with, a, blur, of, colorful, map,...|\n", - "|[Southern, California's, smog, fighting, agency, went, after, emissions, of, the, bovine, variety...|[Southern, California's, smog, fight, agency, go, after, emission, of, the, bovine, variety, Frid...|\n", - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "only showing top 5 rows\n", - "\n" - ] - } - ], - "source": [ - "result.select('token.result','lemma.result').show(5, truncate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "x8xqKxLeUvDc" - }, - "source": [ - "## PerceptronModel (POS - Part of speech tags)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - }, - "executionInfo": { - "elapsed": 645, - "status": "ok", - "timestamp": 1664908709974, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Dyv1H1i42DaZ", - "outputId": "eba2c3d0-fbf9-44d4-c711-3f3983b63546" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
NumberTagDescription
01.0CCCoordinating conjunction
12.0CDCardinal number
23.0DTDeterminer
34.0EXExistential there
45.0FWForeign word
56.0INPreposition or subordinating conjunction
67.0JJAdjective
78.0JJRAdjective, comparative
89.0JJSAdjective, superlative
910.0LSList item marker
1011.0MDModal
1112.0NNNoun, singular or mass
1213.0NNSNoun, plural
1314.0NNPProper noun, singular
1415.0NNPSProper noun, plural
1516.0PDTPredeterminer
1617.0POSPossessive ending
1718.0PRPPersonal pronoun
1819.0PRP$Possessive pronoun
1920.0RBAdverb
2021.0RBRAdverb, comparative
2122.0RBSAdverb, superlative
2223.0RPParticle
2324.0SYMSymbol
2425.0TOto
2526.0UHInterjection
2627.0VBVerb, base form
2728.0VBDVerb, past tense
2829.0VBGVerb, gerund or present participle
2930.0VBNVerb, past participle
3031.0VBPVerb, non-3rd person singular present
3132.0VBZVerb, 3rd person singular present
3233.0WDTWh-determiner
3334.0WPWh-pronoun
3435.0WP$Possessive wh-pronoun
3536.0WRBWh-adverb
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " Number Tag Description\n", - "0 1.0 CC Coordinating conjunction\n", - "1 2.0 CD Cardinal number\n", - "2 3.0 DT Determiner\n", - "3 4.0 EX Existential there\n", - "4 5.0 FW Foreign word\n", - "5 6.0 IN Preposition or subordinating conjunction\n", - "6 7.0 JJ Adjective\n", - "7 8.0 JJR Adjective, comparative\n", - "8 9.0 JJS Adjective, superlative\n", - "9 10.0 LS List item marker\n", - "10 11.0 MD Modal\n", - "11 12.0 NN Noun, singular or mass\n", - "12 13.0 NNS Noun, plural\n", - "13 14.0 NNP Proper noun, singular\n", - "14 15.0 NNPS Proper noun, plural\n", - "15 16.0 PDT Predeterminer\n", - "16 17.0 POS Possessive ending\n", - "17 18.0 PRP Personal pronoun\n", - "18 19.0 PRP$ Possessive pronoun\n", - "19 20.0 RB Adverb\n", - "20 21.0 RBR Adverb, comparative\n", - "21 22.0 RBS Adverb, superlative\n", - "22 23.0 RP Particle\n", - "23 24.0 SYM Symbol\n", - "24 25.0 TO to\n", - "25 26.0 UH Interjection\n", - "26 27.0 VB Verb, base form\n", - "27 28.0 VBD Verb, past tense\n", - "28 29.0 VBG Verb, gerund or present participle\n", - "29 30.0 VBN Verb, past participle\n", - "30 31.0 VBP Verb, non-3rd person singular present\n", - "31 32.0 VBZ Verb, 3rd person singular present\n", - "32 33.0 WDT Wh-determiner\n", - "33 34.0 WP Wh-pronoun\n", - "34 35.0 WP$ Possessive wh-pronoun\n", - "35 36.0 WRB Wh-adverb" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "\n", - "pos_df= pd.read_html('https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html', header=0)\n", - "\n", - "pos_df[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 3725, - "status": "ok", - "timestamp": 1664908717470, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "MwOLREB9Ik55", - "outputId": "12a8e4ea-4699-4379-f035-5dd013d18d3b" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "pos_anc download started this may take some time.\n", - "Approximate size to download 3.9 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "pos = PerceptronModel.pretrained(\"pos_anc\", 'en')\\\n", - " .setInputCols(\"document\", \"token\")\\\n", - " .setOutputCol(\"pos\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 23, - "status": "ok", - "timestamp": 1664908717471, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "OZkdncsmIk74", - "outputId": "2ea420c0-c076-46e5-d7b1-67049e90f74a" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 8\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:26 lemma_antbnc_en_2.0.2_2.4_1556480454569\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:34 pos_anc_en_3.0.0_3.0_1614962126490\n" - ] - } - ], - "source": [ - "!cd ~/cache_pretrained && ls -l" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "gwiBekZ2IlHp" - }, - "outputs": [], - "source": [ - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " stemmer,\n", - " lemmatizer,\n", - " pos])\n", - "\n", - "empty_df = spark.createDataFrame([['']]).toDF(\"text\")\n", - "\n", - "pipelineModel = nlpPipeline.fit(empty_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 351, - "status": "ok", - "timestamp": 1664908717814, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "79R4-HHPNv6h", - "outputId": "02c0bdec-771f-49b2-99fd-573ec79fd171" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "|category| text| document| token| stem| lemma| pos|\n", - "+--------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "|Business|Unions representi...|[{document, 0, 12...|[{token, 0, 5, Un...|[{token, 0, 5, un...|[{token, 0, 5, Un...|[{pos, 0, 5, NNP,...|\n", - "|Sci/Tech| TORONTO, Canada ...|[{document, 0, 22...|[{token, 1, 7, TO...|[{token, 1, 7, to...|[{token, 1, 7, TO...|[{pos, 1, 7, NNP,...|\n", - "|Sci/Tech| A company founde...|[{document, 0, 20...|[{token, 1, 1, A,...|[{token, 1, 1, a,...|[{token, 1, 1, A,...|[{pos, 1, 1, DT, ...|\n", - "|Sci/Tech| It's barely dawn...|[{document, 0, 26...|[{token, 1, 4, It...|[{token, 1, 4, it...|[{token, 1, 4, It...|[{pos, 1, 4, NNP,...|\n", - "|Sci/Tech| Southern Califor...|[{document, 0, 17...|[{token, 1, 8, So...|[{token, 1, 8, so...|[{token, 1, 8, So...|[{pos, 1, 8, NNP,...|\n", - "+--------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "only showing top 5 rows\n", - "\n" - ] - } - ], - "source": [ - "result = pipelineModel.transform(news_df)\n", - "\n", - "result.show(5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 272, - "status": "ok", - "timestamp": 1664908718082, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "r0y9NOb_Vhfk", - "outputId": "e30494eb-ac8f-4c95-f1ed-92c95196bb9c" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "| result| result|\n", - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "|[Unions, representing, workers, at, Turner, Newall, say, they, are, ', disappointed, ', after, ta...| [NNP, VBG, NNS, IN, NNP, NNP, VBP, PRP, VBP, POS, JJ, POS, IN, NNS, IN, NN, NN, NN, NNP, NNP, .]|\n", - "|[TORONTO, ,, Canada, A, second, team, of, rocketeers, competing, for, the, #36;10, million, Ansar...|[NNP, ,, NNP, DT, JJ, NN, IN, NNS, VBG, IN, DT, NN, CD, NNP, NNP, NNP, ,, DT, NN, IN, RB, JJ, JJ,...|\n", - "|[A, company, founded, by, a, chemistry, researcher, at, the, University, of, Louisville, won, a, ...|[DT, NN, VBN, IN, DT, NN, NN, IN, DT, NNP, IN, NNP, VBD, DT, NN, TO, VB, DT, NN, IN, VBG, JJR, NN...|\n", - "|[It's, barely, dawn, when, Mike, Fitzpatrick, starts, his, shift, with, a, blur, of, colorful, ma...|[NNP, RB, NN, WRB, NNP, NNP, VBZ, PRP$, NN, IN, DT, NN, IN, JJ, NNS, ,, NNS, CC, JJ, NNS, ,, CC, ...|\n", - "|[Southern, California's, smog, fighting, agency, went, after, emissions, of, the, bovine, variety...|[NNP, NNP, NN, VBG, NN, VBD, IN, NNS, IN, DT, NN, NN, NNP, ,, VBG, DT, NN, JJ, NNS, TO, VB, NN, N...|\n", - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "only showing top 5 rows\n", - "\n" - ] - } - ], - "source": [ - "result.select('token.result','pos.result').show(5, truncate=100)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "executionInfo": { - "elapsed": 1209, - "status": "ok", - "timestamp": 1664908719285, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ffYOgQIOVhnX", - "outputId": "725a804b-0e5a-429e-d327-feb80fb48d68" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tokenbeginendstemlemmapos
0Unions05unionUnionsNNP
1representing718represrepresentVBG
2workers2026workerworkerNNS
3at2829atatIN
4Turner3136turnerTurnerNNP
5Newall4045newalNewallNNP
6say4749saisayVBP
7they5154theitheyPRP
8are5658arbeVBP
9'6060''POS
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " token begin end stem lemma pos\n", - "0 Unions 0 5 union Unions NNP\n", - "1 representing 7 18 repres represent VBG\n", - "2 workers 20 26 worker worker NNS\n", - "3 at 28 29 at at IN\n", - "4 Turner 31 36 turner Turner NNP\n", - "5 Newall 40 45 newal Newall NNP\n", - "6 say 47 49 sai say VBP\n", - "7 they 51 54 thei they PRP\n", - "8 are 56 58 ar be VBP\n", - "9 ' 60 60 ' ' POS" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# applying this pipeline to top 100 rows and then converting to Pandas\n", - "\n", - "result = pipelineModel.transform(news_df.limit(100))\n", - "\n", - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.token.begin, \n", - " result.token.end, \n", - " result.stem.result, \n", - " result.lemma.result, \n", - " result.pos.result)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"begin\"),\n", - " F.expr(\"cols['2']\").alias(\"end\"),\n", - " F.expr(\"cols['3']\").alias(\"stem\"),\n", - " F.expr(\"cols['4']\").alias(\"lemma\"),\n", - " F.expr(\"cols['5']\").alias(\"pos\")).toPandas()\n", - "\n", - "result_df.head(10) " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 14, - "status": "ok", - "timestamp": 1664908719285, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "g7t4I5s7bDjI", - "outputId": "0598a731-322d-40f4-88ed-12966d506d4b" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[('Unions', 'union', 'Unions', 'NNP'),\n", - " ('representing', 'repres', 'represent', 'VBG'),\n", - " ('workers', 'worker', 'worker', 'NNS'),\n", - " ('at', 'at', 'at', 'IN'),\n", - " ('Turner', 'turner', 'Turner', 'NNP'),\n", - " ('Newall', 'newal', 'Newall', 'NNP'),\n", - " ('say', 'sai', 'say', 'VBP'),\n", - " ('they', 'thei', 'they', 'PRP'),\n", - " ('are', 'ar', 'be', 'VBP'),\n", - " ('disappointed', 'disappoint', 'disappointed', 'VBN'),\n", - " ('after', 'after', 'after', 'IN'),\n", - " ('talks', 'talk', 'talk', 'NNS'),\n", - " ('with', 'with', 'with', 'IN'),\n", - " ('stricken', 'stricken', 'stricken', 'NN'),\n", - " ('parent', 'parent', 'parent', 'NN'),\n", - " ('firm', 'firm', 'firm', 'NN'),\n", - " ('Federal', 'feder', 'Federal', 'NNP'),\n", - " ('Mogul', 'mogul', 'Mogul', 'NNP'),\n", - " ('.', '.', '.', '.')]" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# same in LightPipeline\n", - "\n", - "light_model = LightPipeline(pipelineModel)\n", - "\n", - "light_result = light_model.annotate('Unions representing workers at Turner Newall say they are disappointed after talks with stricken parent firm Federal Mogul.')\n", - "\n", - "list(zip(light_result['token'], light_result['stem'], light_result['lemma'], light_result['pos']))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 645 - }, - "executionInfo": { - "elapsed": 12, - "status": "ok", - "timestamp": 1664908720075, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "QjRWpWOov7aF", - "outputId": "d57cf051-8750-44fa-ae80-cbeb39b80f28" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tokenstemlemmapos
0UnionsunionUnionsNNP
1representingrepresrepresentVBG
2workersworkerworkerNNS
3atatatIN
4TurnerturnerTurnerNNP
5NewallnewalNewallNNP
6saysaisayVBP
7theytheitheyPRP
8arearbeVBP
9disappointeddisappointdisappointedVBN
10afterafterafterIN
11talkstalktalkNNS
12withwithwithIN
13strickenstrickenstrickenNN
14parentparentparentNN
15firmfirmfirmNN
16FederalfederFederalNNP
17MogulmogulMogulNNP
18....
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " token stem lemma pos\n", - "0 Unions union Unions NNP\n", - "1 representing repres represent VBG\n", - "2 workers worker worker NNS\n", - "3 at at at IN\n", - "4 Turner turner Turner NNP\n", - "5 Newall newal Newall NNP\n", - "6 say sai say VBP\n", - "7 they thei they PRP\n", - "8 are ar be VBP\n", - "9 disappointed disappoint disappointed VBN\n", - "10 after after after IN\n", - "11 talks talk talk NNS\n", - "12 with with with IN\n", - "13 stricken stricken stricken NN\n", - "14 parent parent parent NN\n", - "15 firm firm firm NN\n", - "16 Federal feder Federal NNP\n", - "17 Mogul mogul Mogul NNP\n", - "18 . . . ." - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame(list(zip(light_result['token'], light_result['stem'], light_result['lemma'], light_result['pos'])), columns = ['token', 'stem', 'lemma', 'pos'])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "JFc_5BlI2znE" - }, - "source": [ - "## **Chunker**\n", - "\n", - "Meaningful phrase matching. This annotator matches a pattern of part-of-speech tags in order to return meaningful phrases from document\n", - "\n", - "> **Output type**: Chunk\n", - "\n", - "> **Input types**: Document, POS\n", - "\n", - "Functions:\n", - "\n", - "🔍`setRegexParsers(patterns)`: A list of regex patterns to match chunks, for example: Array(“‹DT›?‹JJ›*‹NN›\n", - "\n", - "🔍`addRegexParser(patterns)`: adds a pattern to the current list of chunk patterns, for example: “‹DT›?‹JJ›*‹NN›”" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 283, - "status": "ok", - "timestamp": 1664908725750, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "uvqfIP6XLm3p", - "outputId": "8ceae7a1-c450-4bfe-b8ea-13b25f13c8a7" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{Param(parent='Chunker_8572c053a681', name='lazyAnnotator', doc='Whether this AnnotatorModel acts as lazy in RecursivePipelines'): False,\n", - " Param(parent='Chunker_8572c053a681', name='inputCols', doc='previous annotations columns, if renamed'): ['document',\n", - " 'pos'],\n", - " Param(parent='Chunker_8572c053a681', name='outputCol', doc='output annotation column. can be left default.'): 'chunk',\n", - " Param(parent='Chunker_8572c053a681', name='regexParsers', doc='an array of grammar based chunk parsers'): ['+',\n", - " '
?*']}" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# applying POS chunker to find a custom pattern\n", - "\n", - "chunker = Chunker()\\\n", - " .setInputCols([\"document\", \"pos\"])\\\n", - " .setOutputCol(\"chunk\")\\\n", - " .setRegexParsers([\"+\", \"
?*\"])\n", - "\n", - "# NNP: Proper Noun\n", - "# NN: COmmon Noun\n", - "# DT: Determinator (e.g. the)\n", - "# JJ: Adjective\n", - "\n", - "chunker.extractParamMap()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 602, - "status": "ok", - "timestamp": 1664908747650, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "KsbWh5shIlB8", - "outputId": "69338733-53e8-4215-9fdd-123ac9ee39ac" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "|category| text| document| token| stem| lemma| pos| chunk|\n", - "+--------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "|Business|Unions representi...|[{document, 0, 12...|[{token, 0, 5, Un...|[{token, 0, 5, un...|[{token, 0, 5, Un...|[{pos, 0, 5, NNP,...|[{chunk, 0, 5, Un...|\n", - "|Sci/Tech| TORONTO, Canada ...|[{document, 0, 22...|[{token, 1, 7, TO...|[{token, 1, 7, to...|[{token, 1, 7, TO...|[{pos, 1, 7, NNP,...|[{chunk, 1, 7, TO...|\n", - "|Sci/Tech| A company founde...|[{document, 0, 20...|[{token, 1, 1, A,...|[{token, 1, 1, a,...|[{token, 1, 1, A,...|[{pos, 1, 1, DT, ...|[{chunk, 52, 61, ...|\n", - "|Sci/Tech| It's barely dawn...|[{document, 0, 26...|[{token, 1, 4, It...|[{token, 1, 4, it...|[{token, 1, 4, It...|[{pos, 1, 4, NNP,...|[{chunk, 1, 4, It...|\n", - "|Sci/Tech| Southern Califor...|[{document, 0, 17...|[{token, 1, 8, So...|[{token, 1, 8, so...|[{token, 1, 8, So...|[{pos, 1, 8, NNP,...|[{chunk, 1, 21, S...|\n", - "+--------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+\n", - "only showing top 5 rows\n", - "\n" - ] - } - ], - "source": [ - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " stemmer,\n", - " lemmatizer,\n", - " pos,\n", - " chunker])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(100))\n", - "result.show(5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "executionInfo": { - "elapsed": 1078, - "status": "ok", - "timestamp": 1664908751905, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "f9wEshybZPN2", - "outputId": "c88fcd59-336c-49de-eb62-32d60201c964" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
chunkbeginend
0Unions05
1Turner Newall3145
2Federal Mogul113125
3stricken9299
4parent101106
5firm108111
6TORONTO17
7Canada1015
8Ansari X Prize8295
9A second team2032
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " chunk begin end\n", - "0 Unions 0 5\n", - "1 Turner Newall 31 45\n", - "2 Federal Mogul 113 125\n", - "3 stricken 92 99\n", - "4 parent 101 106\n", - "5 firm 108 111\n", - "6 TORONTO 1 7\n", - "7 Canada 10 15\n", - "8 Ansari X Prize 82 95\n", - "9 A second team 20 32" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result_df = result.select(F.explode(F.arrays_zip(result.chunk.result, \n", - " result.chunk.begin, \n", - " result.chunk.end)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"chunk\"),\n", - " F.expr(\"cols['1']\").alias(\"begin\"),\n", - " F.expr(\"cols['2']\").alias(\"end\")).toPandas()\n", - "\n", - "result_df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gm1aI--pgHId" - }, - "source": [ - "## **Dependency Parser**\n", - "\n", - "The practice of analyzing the relationships between sentences in a phrase to ascertain its grammatical structure is known as dependency parsing (DP). Based on this, sentences are frequently broken up into multiple sections. The method is predicated on the idea that each language component in a phrase has a direct link with the others. Dependencies are the names given to these relationships.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 28206, - "status": "ok", - "timestamp": 1664908781504, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "idjZppOHgOSj", - "outputId": "a56eaac7-cf48-4ee1-f00b-cd48ac7aef92" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dependency_conllu download started this may take some time.\n", - "Approximate size to download 16.7 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "dep_parser = DependencyParserModel.pretrained('dependency_conllu')\\\n", - " .setInputCols([\"document\", \"pos\", \"token\"])\\\n", - " .setOutputCol(\"dependency\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 5621, - "status": "ok", - "timestamp": 1664908787110, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ibIvWMsjhqh_", - "outputId": "f4f9bca4-2e69-4b4d-8e16-681a718a9633" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dependency_typed_conllu download started this may take some time.\n", - "Approximate size to download 2.4 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "typed_dep_parser = TypedDependencyParserModel.pretrained('dependency_typed_conllu')\\\n", - " .setInputCols([\"token\", \"pos\", \"dependency\"])\\\n", - " .setOutputCol(\"dependency_type\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "szCwgxYLhG6c" - }, - "outputs": [], - "source": [ - "nlpPipeline = Pipeline(\n", - " stages=[\n", - " documentAssembler, \n", - " tokenizer,\n", - " stemmer,\n", - " lemmatizer,\n", - " pos,\n", - " dep_parser,\n", - " typed_dep_parser\n", - " ])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(100))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "executionInfo": { - "elapsed": 4286, - "status": "ok", - "timestamp": 1664908824032, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "nmva7uDshOEN", - "outputId": "c40776cb-d3e8-4d2f-e256-1a02f4165ed9" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
chunkbeginenddependencydependency_type
0Unions05ROOTroot
1representing718workersamod
2workers2026Unionsflat
3at2829Turnercase
4Turner3136workersflat
5Newall4045saynsubj
6say4749Unionsparataxis
7they5154disappointednsubj
8are5658disappointednsubj
9'6060disappointedcase
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " chunk begin end dependency dependency_type\n", - "0 Unions 0 5 ROOT root\n", - "1 representing 7 18 workers amod\n", - "2 workers 20 26 Unions flat\n", - "3 at 28 29 Turner case\n", - "4 Turner 31 36 workers flat\n", - "5 Newall 40 45 say nsubj\n", - "6 say 47 49 Unions parataxis\n", - "7 they 51 54 disappointed nsubj\n", - "8 are 56 58 disappointed nsubj\n", - "9 ' 60 60 disappointed case" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.token.begin, \n", - " result.token.end, \n", - " result.dependency.result, \n", - " result.dependency_type.result)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"chunk\"),\n", - " F.expr(\"cols['1']\").alias(\"begin\"),\n", - " F.expr(\"cols['2']\").alias(\"end\"),\n", - " F.expr(\"cols['3']\").alias(\"dependency\"),\n", - " F.expr(\"cols['4']\").alias(\"dependency_type\")).toPandas()\n", - "\n", - "result_df.head(10)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8sxmntVciusy" - }, - "source": [ - "![image.png](data:image/png;base64,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)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "kbqjOV0iGCqy" - }, - "source": [ - "## StopWordsCleaner\n", - "\n", - "`stopwords_fr`, `stopwords_de`, `stopwords_en`, `stopwords_it`, `stopwords_af` .... over 40 languages " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 3080, - "status": "ok", - "timestamp": 1664908832107, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "jEcrH4f4GD8g", - "outputId": "42a58115-0d25-49c3-a9ed-99425fbdf26d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "stopwords_en download started this may take some time.\n", - "Approximate size to download 2.9 KB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "stopwords_cleaner = StopWordsCleaner.pretrained('stopwords_en','en')\\\n", - " .setInputCols(\"token\")\\\n", - " .setOutputCol(\"cleanTokens\")\\\n", - " .setCaseSensitive(False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 2957, - "status": "ok", - "timestamp": 1664908835345, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "fDE2i6J9JUCv", - "outputId": "a9ff1126-f1f8-41d6-8fca-83b4e1ad528a" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "stopwords_es download started this may take some time.\n", - "Approximate size to download 2.2 KB\n", - "[OK!]\n" - ] - }, - { - "data": { - "text/plain": [ - "['a',\n", - " 'acuerdo',\n", - " 'adelante',\n", - " 'ademas',\n", - " 'además',\n", - " 'adrede',\n", - " 'ahi',\n", - " 'ahí',\n", - " 'ahora',\n", - " 'al']" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# we can also get the list of stopwords \n", - "\n", - "stopwords_cleaner_es = StopWordsCleaner.pretrained('stopwords_es','es')\\\n", - " .setInputCols(\"token\")\\\n", - " .setOutputCol(\"cleanTokens\")\\\n", - " .setCaseSensitive(False)\n", - "\n", - "stopwords_cleaner_es.getStopWords()[:10]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 740, - "status": "ok", - "timestamp": 1664908852130, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "7WarSNQYG6Q0", - "outputId": "25fbaa01-1e9e-4558-a933-d9cebdb54a10" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['Peter Parker nice person friend mine.']" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "token_assembler = TokenAssembler() \\\n", - " .setInputCols([\"document\", \"cleanTokens\"]) \\\n", - " .setOutputCol(\"clean_text\")\n", - "\n", - "\n", - "nlpPipeline = Pipeline(\n", - " stages=[\n", - " documentAssembler, \n", - " tokenizer,\n", - " stopwords_cleaner,\n", - " token_assembler\n", - " ])\n", - "\n", - "empty_df = spark.createDataFrame([['']]).toDF(\"text\")\n", - "\n", - "pipelineModel = nlpPipeline.fit(empty_df)\n", - "\n", - "# same in LightPipeline\n", - "\n", - "light_model = LightPipeline(pipelineModel)\n", - "\n", - "light_result = light_model.annotate('Peter Parker is a nice person and a friend of mine.')\n", - "\n", - "light_result['clean_text']" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "9ouF8KqNb7tt" - }, - "source": [ - "## **SpellChecker**\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Trnkx6UYwEve" - }, - "source": [ - "### Norvig Spell Checker\n", - "\n", - "This annotator retrieves tokens and makes corrections automatically if not found in an English dictionary" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 8177, - "status": "ok", - "timestamp": 1664908863208, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "A8RrJeKCarp9", - "outputId": "90d1cb97-085b-48b2-9691-d4b1ab0fd474" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "spellcheck_norvig download started this may take some time.\n", - "Approximate size to download 4.2 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "spell_checker_norvig = NorvigSweetingModel.pretrained('spellcheck_norvig')\\\n", - " .setInputCols(\"token\")\\\n", - " .setOutputCol(\"corrected\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 763, - "status": "ok", - "timestamp": 1664908863965, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "hnCTwbIgMVzK", - "outputId": "dd40f4ad-d025-4370-d051-b3479daab7bb" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------------+\n", - "|text |\n", - "+--------------------------------------------------------+\n", - "|Peter Parker is a nice persn and lives in New York. |\n", - "|Bruce Wayne is also a nice guy and lives in Gotham City.|\n", - "+--------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "from pyspark.sql.types import StringType\n", - "\n", - "text_list = ['Peter Parker is a nice persn and lives in New York.', \n", - " 'Bruce Wayne is also a nice guy and lives in Gotham City.']\n", - "\n", - "spark_df = spark.createDataFrame(text_list, StringType()).toDF(\"text\")\n", - "\n", - "spark_df.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "HxIK6oxHccuw" - }, - "outputs": [], - "source": [ - "nlpPipeline = Pipeline(\n", - " stages=[\n", - " documentAssembler, \n", - " tokenizer,\n", - " stemmer,\n", - " lemmatizer,\n", - " pos,\n", - " spell_checker_norvig\n", - " ])\n", - "\n", - "empty_df = spark.createDataFrame([['']]).toDF(\"text\")\n", - "\n", - "pipelineModel = nlpPipeline.fit(empty_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "tSQkHKrNdJEx" - }, - "outputs": [], - "source": [ - "result = pipelineModel.transform(spark_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 363 - }, - "executionInfo": { - "elapsed": 1085, - "status": "ok", - "timestamp": 1664908885485, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ZRL3ukFneUtM", - "outputId": "5ab2609f-3022-4305-e69b-49271df81995" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
tokencorrectedstemlemmapos
0PeterPeterpeterPeterNNP
1ParkerParkerparkerParkerNNP
2isisibeVBZ
3aaaaDT
4niceniceniceniceJJ
5persnpersonpersnpersnNN
6andandandandCC
7livesliveslivelifeNNS
8ininininIN
9NewNewnewNewNNP
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " token corrected stem lemma pos\n", - "0 Peter Peter peter Peter NNP\n", - "1 Parker Parker parker Parker NNP\n", - "2 is is i be VBZ\n", - "3 a a a a DT\n", - "4 nice nice nice nice JJ\n", - "5 persn person persn persn NN\n", - "6 and and and and CC\n", - "7 lives lives live life NNS\n", - "8 in in in in IN\n", - "9 New New new New NNP" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from pyspark.sql import functions as F\n", - "\n", - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.corrected.result, \n", - " result.stem.result, \n", - " result.lemma.result, \n", - " result.pos.result)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"corrected\"),\n", - " F.expr(\"cols['2']\").alias(\"stem\"),\n", - " F.expr(\"cols['3']\").alias(\"lemma\"),\n", - " F.expr(\"cols['4']\").alias(\"pos\")).toPandas()\n", - "\n", - "result_df.head(10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 300, - "status": "ok", - "timestamp": 1664908886968, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "3NMCMcDEe2UV", - "outputId": "24919aee-0989-4f2a-df09-31499a43e2ff" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[('The', 'The'),\n", - " ('patint', 'patient'),\n", - " ('has', 'has'),\n", - " ('pain', 'pain'),\n", - " ('and', 'and'),\n", - " ('headace', 'headache')]" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# same in LightPipeline\n", - "\n", - "light_model = LightPipeline(pipelineModel)\n", - "\n", - "light_result = light_model.annotate('The patint has pain and headace')\n", - "\n", - "list(zip(light_result['token'], light_result['corrected']))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Gur1-TQWwMi8" - }, - "source": [ - "### Context SpellChecker" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "paSJd3uqSky6" - }, - "source": [ - "The idea for this annotator is to have a flexible, configurable and \"re-usable by parts\" model.\n", - "\n", - "Flexibility is the ability to accommodate different use cases for spell checking like OCR text, keyboard-input text, ASR text, and general spelling problems due to orthographic errors.\n", - "\n", - "We say this is a configurable annotator, as you can adapt it yourself to different use cases avoiding re-training as much as possible.\n", - "\n", - "Spell Checking at three levels: The final ranking of a correction sequence is affected by three things,\n", - "\n", - "Different correction candidates for each word - **word level**.\n", - "\n", - "The surrounding text of each word, i.e. it's context - **sentence level**.\n", - "\n", - "The relative cost of different correction candidates according to the edit operations at the character level it requires - **subword level**." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 35902, - "status": "ok", - "timestamp": 1664908935636, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "hK9VWFp3SaW9", - "outputId": "b96ad15e-4d35-4b19-e832-6dc62b1bb346" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "spellcheck_dl download started this may take some time.\n", - "Approximate size to download 95.1 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "spellModel = ContextSpellCheckerModel.pretrained('spellcheck_dl')\\\n", - " .setInputCols(\"token\")\\\n", - " .setOutputCol(\"checked\")\n", - "\n", - "finisher = Finisher()\\\n", - " .setInputCols(\"checked\")\n", - "\n", - "pipeline = Pipeline(\n", - " stages = [\n", - " documentAssembler,\n", - " tokenizer,\n", - " spellModel,\n", - " finisher\n", - " ])\n", - "\n", - "empty_ds = spark.createDataFrame([[\"\"]]).toDF(\"text\")\n", - "\n", - "sc_model = pipeline.fit(empty_ds)\n", - "lp = LightPipeline(sc_model)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1137, - "status": "ok", - "timestamp": 1664908936768, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "OixU8ShyUo0i", - "outputId": "88aa746d-a86a-41c3-aa2d-491c33afd913" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'checked': ['Please',\n", - " 'allow',\n", - " 'me',\n", - " 'to',\n", - " 'introduce',\n", - " 'myself',\n", - " ',',\n", - " 'I',\n", - " 'am',\n", - " 'a',\n", - " 'man',\n", - " 'of',\n", - " 'wealth',\n", - " 'and',\n", - " 'taste']}" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lp.annotate(\"Plaese alliow me tao introdduce myhelf, I am a man of waelth and tiaste\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1150, - "status": "ok", - "timestamp": 1664908937914, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "LAT3Q8FbWpeU", - "outputId": "256d355f-f2d6-4bd6-f468-03a96272f09c" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------------------+-------------------------------------------------------------------+\n", - "|text |finished_checked |\n", - "+----------------------------------------------------+-------------------------------------------------------------------+\n", - "|We will go to swimming if the ueather is sunny. |[We, will, go, to, swimming, if, the, weather, is, sunny, .] |\n", - "|I have a black ueather jacket, so nice. |[I, have, a, black, leather, jacket, ,, so, nice, .] |\n", - "|I introduce you to my sister, she is called ueather.|[I, introduce, you, to, my, sister, ,, she, is, called, Heather, .]|\n", - "+----------------------------------------------------+-------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "from pyspark.sql.types import StringType\n", - "\n", - "examples = ['We will go to swimming if the ueather is sunny.',\\\n", - " \"I have a black ueather jacket, so nice.\",\\\n", - " \"I introduce you to my sister, she is called ueather.\"]\n", - "\n", - "spark_df = spark.createDataFrame(examples, StringType()).toDF(\"text\")\n", - "\n", - "results = sc_model.transform(spark_df)\n", - "results.show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "gyNDdgVqvVtV" - }, - "source": [ - "## **Language Detector**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lJSy_xiufD42" - }, - "source": [ - "Language detection and identification is the task of automatically detecting the language(s) present in a document based on the content of the document. `LanguageDetectorDL` is an annotator that detects the language of documents or sentences depending on the inputCols. In addition, LanguageDetetorDL can accurately detect language from documents with mixed languages by coalescing sentences and select the best candidate." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 16, - "status": "ok", - "timestamp": 1664908937915, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "43hvF4-OL-Lj", - "outputId": "74f25fb3-e810-460a-ec24-bc7e7b421fab" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{Param(parent='LanguageDetectorDL_bf1972e695d7', name='lazyAnnotator', doc='Whether this AnnotatorModel acts as lazy in RecursivePipelines'): False,\n", - " Param(parent='LanguageDetectorDL_bf1972e695d7', name='threshold', doc='The minimum threshold for the final result otheriwse it will be either neutral or the value set in thresholdLabel.'): 0.5,\n", - " Param(parent='LanguageDetectorDL_bf1972e695d7', name='thresholdLabel', doc='In case the score is less than threshold, what should be the label. Default is neutral.'): 'Unknown',\n", - " Param(parent='LanguageDetectorDL_bf1972e695d7', name='coalesceSentences', doc='If sets to true the output of all sentences will be averaged to one output instead of one output per sentence. Default to false.'): True}" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "LanguageDetectorDL().extractParamMap()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 3103, - "status": "ok", - "timestamp": 1664908941006, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "LnacEgnaY7nR", - "outputId": "4bd87fbc-3a54-4274-b03f-86fea8122cb5" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ld_wiki_tatoeba_cnn_375 download started this may take some time.\n", - "Approximate size to download 8.8 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "languageDetector = LanguageDetectorDL.pretrained(\"ld_wiki_tatoeba_cnn_375\", \"xx\")\\\n", - " .setInputCols(\"document\")\\\n", - " .setOutputCol(\"language\")\\\n", - " .setThreshold(0.5)\\\n", - " .setCoalesceSentences(True)\n", - "\n", - "nlpPipeline = Pipeline(\n", - " stages=[\n", - " documentAssembler, \n", - " languageDetector\n", - " ])\n", - "\n", - "empty_df = spark.createDataFrame([['']]).toDF(\"text\")\n", - "\n", - "pipelineModel = nlpPipeline.fit(empty_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "yWPp7EeyaeEI" - }, - "outputs": [], - "source": [ - "light_model = LightPipeline(pipelineModel)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "UjmVCWMdZNB_" - }, - "outputs": [], - "source": [ - "text_en = \"William Henry Gates III (born October 28, 1955) is an American business magnate, software developer, investor, and philanthropist. He is best known as the co-founder of Microsoft Corporation. During his career at Microsoft, Gates held the positions of chairman, chief executive officer (CEO), president and chief software architect, while also being the largest individual shareholder until May 2014.\"\n", - "\n", - "text_de = 'Als Sebastian Thrun 2007 bei Google anfing, an selbstfahrenden Autos zu arbeiten, nahmen ihn nur wenige Leute außerhalb des Unternehmens ernst.'\n", - "\n", - "text_es = \"La historia del procesamiento del lenguaje natural generalmente comenzó en la década de 1950, aunque se puede encontrar trabajo de períodos anteriores. En 1950, Alan Turing publicó un artículo titulado 'Maquinaria de computación e inteligencia' que proponía lo que ahora se llama la prueba de Turing como criterio de inteligencia\"\n", - "\n", - "text_it = \"Geoffrey Everest Hinton è uno psicologo cognitivo e uno scienziato informatico canadese inglese, noto soprattutto per il suo lavoro sulle reti neurali artificiali. Dal 2013 divide il suo tempo lavorando per Google e l'Università di Toronto. Nel 2017 è stato cofondatore ed è diventato Chief Scientific Advisor del Vector Institute di Toronto.\"\n", - "\n", - "text_tr = 'Doğal Dil İşleme (NLP), bilgisayar biliminin, insanlar doğal olarak konuşup yazdıkça insan dilini anlamasını sağlayan bilgisayar biliminin alt alanıdır. '" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 390, - "status": "ok", - "timestamp": 1664908941386, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "X0hRXP8maUwF", - "outputId": "932445d2-5fa1-4253-9ee5-2f0d9bfafe3f" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['tr']" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "light_model.annotate(text_tr)['language']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 18, - "status": "ok", - "timestamp": 1664908941388, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "gf0KUzqLBTN9", - "outputId": "40202d16-a75a-465c-de3f-0b3bc1bca673" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['es']" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "light_model.annotate(text_es)['language']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 376, - "status": "ok", - "timestamp": 1664908941756, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "LC6k4k3yajCe", - "outputId": "fc11ba6c-51be-4244-cb87-c5461b3e5f31" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Annotation(language, 0, 328, es, {'avk': '3.2227776E-25', 'toki': '0.0', 'dng': '0.0', 'hy': '0.0', 'bua': '0.0', 'pcd': '1.9255921E-31', 'se': '3.0613954E-33', 'nlv': '0.0', 'ku': '1.6084451E-30', 'gcf': '0.0', 'xmf': '0.0', 'rue': '0.0', 'lou': '0.0', 'crh': '0.0', 'lkt': '0.0', 'oar': '0.0', 'aoz': '0.0', 'ss': '0.0', 'st': '0.0', 'ota': '0.0', 'bs': '7.278714E-36', 'cho': '0.0', 'stq': '0.0', 'kaa': '0.0', 'ba': '0.0', 'ngu': '0.0', 'pfl': '0.0', 'lb': '6.1421093E-24', 'hr': '3.8482914E-28', 'ta': '0.0', 'ka': '0.0', 'ar': '0.0', 'lzz': '0.0', 'swh': '0.0', 'hbo': '0.0', 'pi': '0.0', 'nov': '9.6963065E-25', 'yue': '0.0', 'ty': '0.0', 'fr': '2.2967522E-22', 'lfn': '5.509995E-9', 'is': '1.7047716E-29', 'urh': '0.0', 'mgm': '0.0', 'nah': '0.0', 'ug': '0.0', 'otk': '0.0', 'lv': '0.0', 'tmw': '0.0', 'eu': '1.0338304E-22', 'mdf': '0.0', 'got': '0.0', 'kl': '0.0', 'rn': '0.0', 'emx': '0.0', 'vep': '0.0', 'am': '0.0', 'hif': '0.0', 'mt': '4.717723E-21', 'krc': '0.0', 'bn': '0.0', 'rw': '0.0', 'gsw': '0.0', 'apc': '0.0', 'uz': '0.0', 'csb': '0.0', 'ckt': '0.0', 'aii': '0.0', 'bho': '0.0', 'uk': '0.0', 'chg': '0.0', 'co': '0.0', 'fj': '0.0', 'zlm': '0.0', 'toi': '0.0', 'si': '0.0', 'dsb': '0.0', 'lld': '0.0', 'ky': '0.0', 'enm': '0.0', 'ksh': '0.0', 'bvy': '0.0', 'pa': '0.0', 'ga': '7.1540605E-31', 'gan': '0.0', 'ceb': '0.0', 'br': '8.016619E-19', 'lmo': '0.0', 'rap': '0.0', 'bal': '0.0', 'ady': '0.0', 'nys': '0.0', 'tt': '0.0', 'war': '5.471905E-35', 'so': '0.0', 'tts': '0.0', 'mwl': '0.0', 'pt': '6.489546E-14', 'tpi': '0.0', 'cs': '1.0178266E-20', 'phn': '0.0', 'zu': '0.0', 'lo': '0.0', 'gl': '1.5889118E-8', 'gn': '0.0', 'sux': '0.0', 'ban': '0.0', 'ny': '0.0', 'nds': '2.8447118E-31', 'cjy': '0.0', 'fuc': '0.0', 'sr': '1.6595062E-26', 'nog': '0.0', 'ts': '0.0', 'chn': '0.0', 'el': '0.0', 'tpw': '0.0', 'it': '2.1318946E-13', 'sc': '0.0', 'su': '0.0', 'ber': '1.966357E-26', 'ca': '1.6977338E-10', 'rel': '0.0', 'os': '0.0', 'hnj': '0.0', 'vi': '0.0', 'mnc': '0.0', 'aln': '0.0', 'la': '2.1372422E-15', 'nch': '0.0', 'ltg': '0.0', 'ab': '0.0', 'tg': '0.0', 'mg': '0.0', 'as': '0.0', 'kam': '0.0', 'yo': '0.0', 'tzl': '2.683327E-26', 'min': '0.0', 'shs': '0.0', 'dv': '0.0', 'pdc': '0.0', 'cay': '0.0', 'tl': '1.04098085E-23', 'nl': '1.8647921E-28', 'ike': '0.0', 'jpa': '0.0', 'bg': '0.0', 'gv': '0.0', 'bi': '0.0', 'swg': '0.0', 'hil': '0.0', 'ko': '0.0', 'rm': '0.0', 'or': '0.0', 'eo': '1.4023826E-13', 'tk': '3.6414057E-35', 'cyo': '0.0', 'rom': '4.664236E-36', 'mk': '0.0', 'dtp': '0.0', 'gil': '0.0', 'fkv': '0.0', 'oc': '1.7036886E-11', 'haw': '0.0', 'egl': '0.0', 'umb': '0.0', 'et': '3.80267E-30', 'pau': '0.0', 'af': '5.8317244E-36', 'gag': '0.0', 'laa': '0.0', 'de': '1.2161509E-26', 'bm': '0.0', 'xh': '0.0', 'dws': '0.0', 'ps': '0.0', 'scn': '0.0', 'ch': '2.7466975E-34', 'yi': '0.0', 'qya': '0.0', 'ha': '0.0', 'cy': '3.6395086E-32', 'myv': '0.0', 'nb': '2.7764615E-31', 'sn': '0.0', 'to': '0.0', 'rif': '0.0', 'bjn': '0.0', 'fro': '0.0', 'pap': '0.0', 'ig': '0.0', 'frr': '0.0', 'kxi': '0.0', 'bzt': '0.0', 'zza': '0.0', 'arq': '0.0', 'cv': '0.0', 'ur': '0.0', 'mfe': '0.0', 'oj': '0.0', 'pam': '0.0', 'quc': '0.0', 'fy': '0.0', 'ln': '0.0', 'jv': '2.8774632E-32', 'jbo': '1.3549087E-27', 'afh': '0.0', 'jdt': '0.0', 'ru': '1.6341115E-37', 'ht': '7.9929254E-26', 'vro': '0.0', 'kw': '3.1891775E-28', 'ml': '0.0', 'th': '0.0', 'tly': '0.0', 'drt': '0.0', 'id': '1.0684691E-35', 'ce': '0.0', 'pnb': '0.0', 'sq': '1.9903843E-35', 'kha': '0.0', 'ia': '3.723646E-8', 'arz': '0.0', 'lzh': '0.0', 'max': '0.0', 'pag': '0.0', 'sv': '1.5181038E-26', 'ppl': '0.0', 'udm': '0.0', 'tr': '1.3081725E-27', 'ain': '0.0', 'da': '1.2120395E-24', 'my': '0.0', 'gbm': '0.0', 'liv': '0.0', 'kzj': '0.0', 'zsm': '0.0', 'sg': '0.0', 'chr': '0.0', 'kek': '0.0', 'wo': '0.0', 'awa': '0.0', 'lg': '0.0', 'mh': '0.0', 'xal': '0.0', 'sm': '0.0', 'en': '1.6624443E-28', 'gu': '0.0', 'tn': '0.0', 'he': '0.0', 'sah': '0.0', 'tet': '0.0', 'new': '0.0', 'ilo': '3.3793208E-34', 'kn': '0.0', 'gd': '0.0', 'syc': '0.0', 'sk': '5.776495E-17', 'orv': '0.0', 'fur': '0.0', 'ary': '0.0', 'mrj': '0.0', 'krl': '0.0', 'bar': '0.0', 'lvs': '1.3227742E-36', 'na': '0.0', 'tig': '0.0', 'kpv': '0.0', 'lad': '4.582317E-6', 'sma': '0.0', 'az': '0.0', 'mic': '0.0', 'iba': '0.0', 'wa': '8.01678E-32', 'hoc': '0.0', 'lij': '2.766855E-28', 'es': '0.9999949', 'mvv': '0.0', 'fo': '1.9281377E-36', 'hsn': '0.0', 'prg': '0.0', 'mai': '0.0', 'hi': '0.0', 'vo': '2.4248794E-32', 'gom': '0.0', 'bcl': '0.0', 'te': '0.0', 'mr': '0.0', 'tlh': '1.7962606E-38', 'ie': '2.6994945E-13', 'ext': '5.785406E-24', 'tkl': '0.0', 'an': '1.859455E-8', 'sco': '0.0', 'nn': '3.8007597E-28', 'kjh': '0.0', 'io': '2.8876567E-17', 'sw': '9.545265E-37', 'mww': '0.0', 'be': '0.0', 'qu': '1.381481E-9', 'sgs': '0.0', 'kum': '0.0', 'mnw': '0.0', 'cbk': '6.1433343E-7', 'sd': '0.0', 'osp': '5.093505E-38', 'ang': '0.0', 'izh': '0.0', 'mi': '0.0', 'kab': '1.1073482E-25', 'hsb': '0.0', 'ja': '0.0', 'cpi': '0.0', 'sa': '0.0', 'moh': '0.0', 'acm': '0.0', 'ast': '1.2008109E-8', 'jam': '0.0', 'sjn': '0.0', 'grc': '0.0', 'fi': '4.1400016E-35', 'bo': '0.0', 'cycl': '0.0', 'tyv': '0.0', 'ro': '3.3371775E-17', 'evn': '0.0', 'tvl': '0.0', 'ngt': '0.0', 'cmo': '0.0', 'brx': '0.0', 'frm': '0.0', 'ryu': '0.0', 'afb': '0.0', 'ne': '0.0', 'ee': '0.0', 'gaa': '0.0', 'fuv': '0.0', 'mhr': '0.0', 'lt': '7.4077635E-21', 'no': '0.0', 'wuu': '0.0', 'npi': '0.0', 'nst': '0.0', 'tmr': '0.0', 'vec': '0.0', 'koi': '0.0', 'km': '0.0', 'gos': '0.0', 'kk': '0.0', 'sl': '1.5304573E-22', 'pms': '2.1088961E-23', 'ay': '0.0', 'thv': '0.0', 'ti': '0.0', 'ii': '0.0', 'hak': '0.0', 'non': '0.0', 'fa': '0.0', 'mn': '0.0', 'zh': '0.0', 'osx': '0.0', 'shy': '0.0', 'ms': '0.0', 'ldn': '0.0', 'sentence': '0', 'hu': '9.299107E-22', 'nv': '0.0', 'akl': '0.0', 'pl': '1.00265134E-19', 'mad': '0.0', 'ks': '0.0', 'hrx': '0.0', 'niu': '0.0', 'crs': '0.0'})]" - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "light_model.fullAnnotate(text_es)[0]['language']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 6329, - "status": "ok", - "timestamp": 1664908948076, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "vNaXj6bYgPJe", - "outputId": "a7ef6444-e190-46cb-ae1d-a413364635d1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "detect_language_220 download started this may take some time.\n", - "Approx size to download 9.1 MB\n", - "[OK!]\n" - ] - }, - { - "data": { - "text/plain": [ - "{'document': ['French author who helped pioneer the science-fiction genre.'],\n", - " 'sentence': ['French author who helped pioneer the science-fiction genre.'],\n", - " 'language': ['en']}" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sparknlp.pretrained import PretrainedPipeline\n", - "\n", - "pipeline = PretrainedPipeline(\"detect_language_220\", lang = \"xx\")\n", - "\n", - "pipeline.annotate(\"French author who helped pioneer the science-fiction genre.\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "IlpLWUJhLPvM" - }, - "source": [ - "Translation with MarianTransformer\n", - "\n", - "[MarianTransformer](https://nlp.johnsnowlabs.com/docs/en/transformers#mariantransformer) is an efficient, free Neural Machine Translation framework written in pure C++ with minimal dependencies. It is mainly being developed by the Microsoft Translator team. Many academic (most notably the University of Edinburgh and in the past the Adam Mickiewicz University in Poznań) and commercial contributors help with its development. MarianTransformer uses the models trained by MarianNMT.\n", - "\n", - "It is currently the engine behind the Microsoft Translator Neural Machine Translation services and being deployed by many companies, organizations and research projects." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 24696, - "status": "ok", - "timestamp": 1664909112937, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "3ZqfVlpbLXfV", - "outputId": "dc18f780-9804-43c6-ed8e-7cd3e475e065" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sentence_detector_dl download started this may take some time.\n", - "Approximate size to download 514.9 KB\n", - "[OK!]\n", - "opus_mt_de_en download started this may take some time.\n", - "Approximate size to download 372.5 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler() \\\n", - " .setInputCol(\"text\") \\\n", - " .setOutputCol(\"document\")\n", - "\n", - "sentence = SentenceDetectorDLModel.pretrained(\"sentence_detector_dl\", \"xx\") \\\n", - " .setInputCols(\"document\") \\\n", - " .setOutputCol(\"sentence\")\n", - "\n", - "marian = MarianTransformer.pretrained('opus_mt_de_en') \\\n", - " .setInputCols(\"sentence\") \\\n", - " .setOutputCol(\"translation\") \\\n", - " .setMaxInputLength(30)\n", - "\n", - "pipeline = Pipeline().setStages([documentAssembler,\n", - " sentence,\n", - " marian])\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 12719, - "status": "ok", - "timestamp": 1664909129723, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "xepsNREULyeW", - "outputId": "05923286-cf1e-4c97-aa91-b6362d1e51e0" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+---------------------------+\n", - "|result |\n", - "+---------------------------+\n", - "|The Germans love bratwurst!|\n", - "+---------------------------+\n", - "\n" - ] - } - ], - "source": [ - "data = spark.createDataFrame([[\"Die Deutschen lieben Bratwurst!\"]]).toDF(\"text\")\n", - "result = pipeline.fit(data).transform(data)\n", - "\n", - "result.selectExpr(\"explode(translation.result) as result\").show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "LnPg4AgLwgXc" - }, - "source": [ - "## Embeddings\n", - "\n", - "**Here is the Multi-Lingual Embeddings Model List avaliable in Spark NLP:**\n", - "\n", - "| title | name | language |\n", - "|:-----------------------------------------------------------------------------------------------------------------------|:---------------------------------------|:-----------|\n", - "| Glove Embeddings 6B 100 | glove_100d | en |\n", - "| GloVe Embeddings 6B 300 (Multilingual) | glove_6B_300 | xx |\n", - "| GloVe Embeddings 840B 300 (Multilingual) | glove_840B_300 | xx |\n", - "| Embeddings Clinical | embeddings_clinical | en |\n", - "| ELMo Embeddings | elmo | en |\n", - "| Embeddings Healthcare | embeddings_healthcare | en |\n", - "| Universal Sentence Encoder | tfhub_use | en |\n", - "| Universal Sentence Encoder Large | tfhub_use_lg | en |\n", - "| ALBERT Embeddings (Base Uncase) | albert_base_uncased | en |\n", - "| ALBERT Embeddings (Large Uncase) | albert_large_uncased | en |\n", - "| ALBERT Embeddings (XLarge Uncase) | albert_xlarge_uncased | en |\n", - "| ALBERT Embeddings (XXLarge Uncase) | albert_xxlarge_uncased | en |\n", - "| XLNet Embeddings (Base) | xlnet_base_cased | en |\n", - "| XLNet Embeddings (Large) | xlnet_large_cased | en |\n", - "| Embeddings Scielo 150 dims | embeddings_scielo_150d | es |\n", - "| Embeddings Scielo 300 dims | embeddings_scielo_300d | es |\n", - "| Embeddings Scielo 50 dims | embeddings_scielo_50d | es |\n", - "| Embeddings Scielowiki 150 dims | embeddings_scielowiki_150d | es |\n", - "| Embeddings Scielowiki 300 dims | embeddings_scielowiki_300d | es |\n", - "| Embeddings Scielowiki 50 dims | embeddings_scielowiki_50d | es |\n", - "| Embeddings Sciwiki 150 dims | embeddings_sciwiki_150d | es |\n", - "| Embeddings Sciwiki 300 dims | embeddings_sciwiki_300d | es |\n", - "| Embeddings Sciwiki 50 dims | embeddings_sciwiki_50d | es |\n", - "| Embeddings Healthcare 100 dims | embeddings_healthcare_100d | en |\n", - "| Embeddings BioVec | embeddings_biovec | en |\n", - "| BERT Embeddings (Base Cased) | bert_base_cased | en |\n", - "| BERT Embeddings (Base Uncased) | bert_base_uncased | en |\n", - "| BERT Embeddings (Large Cased) | bert_large_cased | en |\n", - "| BERT Embeddings (Large Uncased) | bert_large_uncased | en |\n", - "| Multilingual BERT Embeddings (Base Cased) | bert_multi_cased | xx |\n", - "| BioBERT Embeddings (Clinical) | biobert_clinical_base_cased | en |\n", - "| BioBERT Embeddings (Discharge) | biobert_discharge_base_cased | en |\n", - "| BioBERT Embeddings (PMC) | biobert_pmc_base_cased | en |\n", - "| BioBERT Embeddings (Pubmed) | biobert_pubmed_base_cased | en |\n", - "| BioBERT Embeddings (Pubmed Large) | biobert_pubmed_large_cased | en |\n", - "| BioBERT Embeddings (Pubmed PMC) | biobert_pubmed_pmc_base_cased | en |\n", - "| BioBERT Sentence Embeddings (Clinical) | sent_biobert_clinical_base_cased | en |\n", - "| BERT Sentence Embeddings (Base Cased) | sent_bert_base_cased | en |\n", - "| BERT Sentence Embeddings (Base Uncased) | sent_bert_base_uncased | en |\n", - "| BERT Sentence Embeddings (Large Cased) | sent_bert_large_cased | en |\n", - "| BERT Sentence Embeddings (Large Uncased) | sent_bert_large_uncased | en |\n", - "| Multilingual BERT Sentence Embeddings (Base Cased) | sent_bert_multi_cased | xx |\n", - "| BioBERT Sentence Embeddings (Discharge) | sent_biobert_discharge_base_cased | en |\n", - "| BioBERT Sentence Embeddings (PMC) | sent_biobert_pmc_base_cased | en |\n", - "| BioBERT Sentence Embeddings (Pubmed) | sent_biobert_pubmed_base_cased | en |\n", - "| BioBERT Sentence Embeddings (Pubmed Large) | sent_biobert_pubmed_large_cased | en |\n", - "| BioBERT Sentence Embeddings (Pubmed PMC) | sent_biobert_pubmed_pmc_base_cased | en |\n", - "| Smaller BERT Sentence Embeddings (L-10_H-128_A-2) | sent_small_bert_L10_128 | en |\n", - "| Smaller BERT Sentence Embeddings (L-10_H-256_A-4) | sent_small_bert_L10_256 | en |\n", - "| Smaller BERT Sentence Embeddings (L-10_H-512_A-8) | sent_small_bert_L10_512 | en |\n", - "| Smaller BERT Sentence Embeddings (L-10_H-768_A-12) | sent_small_bert_L10_768 | en |\n", - "| Smaller BERT Sentence Embeddings (L-12_H-128_A-2) | sent_small_bert_L12_128 | en |\n", - "| Smaller BERT Sentence Embeddings (L-12_H-256_A-4) | sent_small_bert_L12_256 | en |\n", - "| Smaller BERT Sentence Embeddings (L-12_H-512_A-8) | sent_small_bert_L12_512 | en |\n", - "| Smaller BERT Sentence Embeddings (L-12_H-768_A-12) | sent_small_bert_L12_768 | en |\n", - "| Smaller BERT Sentence Embeddings (L-2_H-128_A-2) | sent_small_bert_L2_128 | en |\n", - "| Smaller BERT Sentence Embeddings (L-2_H-256_A-4) | sent_small_bert_L2_256 | en |\n", - "| Smaller BERT Sentence Embeddings (L-2_H-512_A-8) | sent_small_bert_L2_512 | en |\n", - "| Smaller BERT Sentence Embeddings (L-2_H-768_A-12) | sent_small_bert_L2_768 | en |\n", - "| Smaller BERT Sentence Embeddings (L-4_H-128_A-2) | sent_small_bert_L4_128 | en |\n", - "| Smaller BERT Sentence Embeddings (L-4_H-256_A-4) | sent_small_bert_L4_256 | en |\n", - "| Smaller BERT Sentence Embeddings (L-4_H-512_A-8) | sent_small_bert_L4_512 | en |\n", - "| Smaller BERT Sentence Embeddings (L-4_H-768_A-12) | sent_small_bert_L4_768 | en |\n", - "| Smaller BERT Sentence Embeddings (L-6_H-128_A-2) | sent_small_bert_L6_128 | en |\n", - "| Smaller BERT Sentence Embeddings (L-6_H-256_A-4) | sent_small_bert_L6_256 | en |\n", - "| Smaller BERT Sentence Embeddings (L-6_H-512_A-8) | sent_small_bert_L6_512 | en |\n", - "| Smaller BERT Sentence Embeddings (L-6_H-768_A-12) | sent_small_bert_L6_768 | en |\n", - "| Smaller BERT Sentence Embeddings (L-8_H-128_A-2) | sent_small_bert_L8_128 | en |\n", - "| Smaller BERT Sentence Embeddings (L-8_H-256_A-4) | sent_small_bert_L8_256 | en |\n", - "| Smaller BERT Sentence Embeddings (L-8_H-512_A-8) | sent_small_bert_L8_512 | en |\n", - "| Smaller BERT Sentence Embeddings (L-8_H-768_A-12) | sent_small_bert_L8_768 | en |\n", - "| Smaller BERT Embeddings (L-10_H-128_A-2) | small_bert_L10_128 | en |\n", - "| Smaller BERT Embeddings (L-10_H-256_A-4) | small_bert_L10_256 | en |\n", - "| Smaller BERT Embeddings (L-10_H-512_A-8) | small_bert_L10_512 | en |\n", - "| Smaller BERT Embeddings (L-10_H-768_A-12) | small_bert_L10_768 | en |\n", - "| Smaller BERT Embeddings (L-12_H-128_A-2) | small_bert_L12_128 | en |\n", - "| Smaller BERT Embeddings (L-12_H-256_A-4) | small_bert_L12_256 | en |\n", - "| Smaller BERT Embeddings (L-12_H-512_A-8) | small_bert_L12_512 | en |\n", - "| Smaller BERT Embeddings (L-12_H-768_A-12) | small_bert_L12_768 | en |\n", - "| Smaller BERT Embeddings (L-2_H-128_A-2) | small_bert_L2_128 | en |\n", - "| Smaller BERT Embeddings (L-2_H-256_A-4) | small_bert_L2_256 | en |\n", - "| Smaller BERT Embeddings (L-2_H-512_A-8) | small_bert_L2_512 | en |\n", - "| Smaller BERT Embeddings (L-2_H-768_A-12) | small_bert_L2_768 | en |\n", - "| Smaller BERT Embeddings (L-4_H-128_A-2) | small_bert_L4_128 | en |\n", - "| Smaller BERT Embeddings (L-4_H-256_A-4) | small_bert_L4_256 | en |\n", - "| Smaller BERT Embeddings (L-4_H-512_A-8) | small_bert_L4_512 | en |\n", - "| Smaller BERT Embeddings (L-4_H-768_A-12) | small_bert_L4_768 | en |\n", - "| Smaller BERT Embeddings (L-6_H-128_A-2) | small_bert_L6_128 | en |\n", - "| Smaller BERT Embeddings (L-6_H-256_A-4) | small_bert_L6_256 | en |\n", - "| Smaller BERT Embeddings (L-6_H-512_A-8) | small_bert_L6_512 | en |\n", - "| Smaller BERT Embeddings (L-6_H-768_A-12) | small_bert_L6_768 | en |\n", - "| Smaller BERT Embeddings (L-8_H-128_A-2) | small_bert_L8_128 | en |\n", - "| Smaller BERT Embeddings (L-8_H-256_A-4) | small_bert_L8_256 | en |\n", - "| Smaller BERT Embeddings (L-8_H-512_A-8) | small_bert_L8_512 | en |\n", - "| Smaller BERT Embeddings (L-8_H-768_A-12) | small_bert_L8_768 | en |\n", - "| COVID BERT Embeddings (Large Uncased) | covidbert_large_uncased | en |\n", - "| ELECTRA Embeddings(ELECTRA Base) | electra_base_uncased | en |\n", - "| ELECTRA Embeddings(ELECTRA Small) | electra_large_uncased | en |\n", - "| ELECTRA Embeddings(ELECTRA Small) | electra_small_uncased | en |\n", - "| COVID BERT Sentence Embeddings (Large Uncased) | sent_covidbert_large_uncased | en |\n", - "| ELECTRA Sentence Embeddings(ELECTRA Base) | sent_electra_base_uncased | en |\n", - "| ELECTRA Sentence Embeddings(ELECTRA Large) | sent_electra_large_uncased | en |\n", - "| ELECTRA Sentence Embeddings(ELECTRA Small) | sent_electra_small_uncased | en |\n", - "| Finnish BERT Embeddings (Base Cased) | bert_finnish_cased | fi |\n", - "| Finnish BERT Embeddings (Base Uncased) | bert_finnish_uncased | fi |\n", - "| Finnish BERT Sentence Embeddings (Base Cased) | sent_bert_finnish_cased | fi |\n", - "| Finnish BERT Sentence Embeddings (Base Uncased) | sent_bert_finnish_uncased | fi |\n", - "| Fastext Word Embeddings in German | w2v_cc_300d | de |\n", - "| BioBERT Embeddings (Clinical) | biobert_clinical_base_cased | en |\n", - "| BioBERT Embeddings (Discharge) | biobert_discharge_base_cased | en |\n", - "| BioBERT Embeddings (PMC) | biobert_pmc_base_cased | en |\n", - "| BioBERT Embeddings (Pubmed) | biobert_pubmed_base_cased | en |\n", - "| BioBERT Embeddings (Pubmed Large) | biobert_pubmed_large_cased | en |\n", - "| BioBERT Embeddings (Pubmed PMC) | biobert_pubmed_pmc_base_cased | en |\n", - "| BioBERT Sentence Embeddings (Clinical) | sent_biobert_clinical_base_cased | en |\n", - "| BioBERT Sentence Embeddings (Discharge) | sent_biobert_discharge_base_cased | en |\n", - "| BioBERT Sentence Embeddings (PMC) | sent_biobert_pmc_base_cased | en |\n", - "| BioBERT Sentence Embeddings (Pubmed) | sent_biobert_pubmed_base_cased | en |\n", - "| BioBERT Sentence Embeddings (Pubmed Large) | sent_biobert_pubmed_large_cased | en |\n", - "| BioBERT Sentence Embeddings (Pubmed PMC) | sent_biobert_pubmed_pmc_base_cased | en |\n", - "| BERT LaBSE Sentence Embeddings | labse | en |\n", - "| Portuguese BERT Embeddings (Base Cased) | bert_portuguese_base_cased | pt |\n", - "| Portuguese BERT Embeddings (Large Cased) | bert_portuguese_large_cased | pt |\n", - "| Sentence Embeddings - Biobert cased (MedNLI) | sbiobert_base_cased_mli | en |\n", - "| Sentence Embeddings - Bluebert uncased (MedNLI) | sbluebert_base_uncased_mli | en |\n", - "| Word Embeddings for Urdu (urduvec_140M_300d) | urduvec_140M_300d | ur |\n", - "| Word Embeddings for Arabic (arabic_w2v_cc_300d) | arabic_w2v_cc_300d | ar |\n", - "| Word Embeddings for Persian (persian_w2v_cc_300d) | persian_w2v_cc_300d | fa |\n", - "| Universal Sentence Encoder Multilingual Large | tfhub_use_multi_lg | xx |\n", - "| Universal Sentence Encoder Multilingual | tfhub_use_multi | xx |\n", - "| Universal Sentence Encoder XLING English and German | tfhub_use_xling_en_de | xx |\n", - "| Universal Sentence Encoder XLING English and Spanish | tfhub_use_xling_en_es | xx |\n", - "| Universal Sentence Encoder XLING English and French | tfhub_use_xling_en_fr | xx |\n", - "| Universal Sentence Encoder XLING Many | tfhub_use_xling_many | xx |\n", - "| Word Embeddings for Hebrew (hebrew_cc_300d) | hebrew_cc_300d | he |\n", - "| Word Embeddings for Hindi (hindi_cc_300d) | hindi_cc_300d | hi |\n", - "| Word Embeddings for Bengali (bengali_cc_300d) | bengali_cc_300d | bn |\n", - "| Universal Sentence Encoder Multilingual Large (tfhub_use_multi_lg) | tfhub_use_multi_lg | xx |\n", - "| Universal Sentence Encoder Multilingual (tfhub_use_multi) | tfhub_use_multi | xx |\n", - "| Sentence Embeddings - sbert medium (tuned) | sbert_jsl_medium_umls_uncased | en |\n", - "| Sentence Embeddings - sbert medium (tuned) | sbert_jsl_medium_uncased | en |\n", - "| Sentence Embeddings - sbert mini (tuned) | sbert_jsl_mini_umls_uncased | en |\n", - "| Sentence Embeddings - sbert mini (tuned) | sbert_jsl_mini_uncased | en |\n", - "| Sentence Embeddings - sbert tiny (tuned) | sbert_jsl_tiny_umls_uncased | en |\n", - "| Sentence Embeddings - sbert tiny (tuned) | sbert_jsl_tiny_uncased | en |\n", - "| Sentence Embeddings - sbiobert (tuned) | sbiobert_jsl_cased | en |\n", - "| Sentence Embeddings - sbiobert (tuned) | sbiobert_jsl_umls_cased | en |\n", - "| Chinese BERT Base | bert_base_chinese | zh |\n", - "| BERTje A Dutch BERT model | bert_base_dutch_cased | nl |\n", - "| German BERT Base Cased Model | bert_base_german_cased | de |\n", - "| German BERT Base Uncased Model | bert_base_german_uncased | de |\n", - "| Italian BERT Base Cased | bert_base_italian_cased | it |\n", - "| Italian BERT Base Uncased | bert_base_italian_uncased | it |\n", - "| BERT multilingual base model (cased) | bert_base_multilingual_cased | xx |\n", - "| BERT multilingual base model (uncased) | bert_base_multilingual_uncased | xx |\n", - "| Turkish BERT Base Cased (BERTurk) | bert_base_turkish_cased | tr |\n", - "| Turkish BERT Base Uncased (BERTurk) | bert_base_turkish_uncased | tr |\n", - "| Chinese BERT with Whole Word Masking | chinese_bert_wwm | zh |\n", - "| DistilBERT base model (cased) | distilbert_base_cased | en |\n", - "| DistilBERT base multilingual model (cased) | distilbert_base_multilingual_cased | xx |\n", - "| DistilBERT base model (uncased) | distilbert_base_uncased | en |\n", - "| DistilRoBERTa base model | distilroberta_base | en |\n", - "| RoBERTa base model | roberta_base | en |\n", - "| RoBERTa large model | roberta_large | en |\n", - "| Twitter XLM-RoBERTa Base (twitter_xlm_roberta_base) | twitter_xlm_roberta_base | xx |\n", - "| XLM-RoBERTa Base (xlm_roberta_base) | xlm_roberta_base | xx |\n", - "| ALBERT Embeddings (Base Uncase) | albert_base_uncased | en |\n", - "| ALBERT Embeddings (Large Uncase) | albert_large_uncased | en |\n", - "| ALBERT Embeddings (XLarge Uncase) | albert_xlarge_uncased | en |\n", - "| ALBERT Embeddings (XXLarge Uncase) | albert_xxlarge_uncased | en |\n", - "| Sentence Embeddings - sbert medium (tuned) | sbert_jsl_medium_umls_uncased | en |\n", - "| Sentence Embeddings - sbert medium (tuned) | sbert_jsl_medium_uncased | en |\n", - "| Sentence Embeddings - sbert mini (tuned) | sbert_jsl_mini_umls_uncased | en |\n", - "| Sentence Embeddings - sbert mini (tuned) | sbert_jsl_mini_uncased | en |\n", - "| Sentence Embeddings - sbert tiny (tuned) | sbert_jsl_tiny_umls_uncased | en |\n", - "| Sentence Embeddings - sbert tiny (tuned) | sbert_jsl_tiny_uncased | en |\n", - "| Sentence Embeddings - sbiobert (tuned) | sbiobert_jsl_cased | en |\n", - "| Sentence Embeddings - sbiobert (tuned) | sbiobert_jsl_umls_cased | en |\n", - "| Chinese Pre-Trained XLNet (Base) | chinese_xlnet_base | zh |\n", - "| XLNet Embeddings (Base Cased) | xlnet_base_cased | en |\n", - "| XLNet Embeddings (Large Cased) | xlnet_large_cased | en |\n", - "| XLM-RoBERTa XTREME Base (xlm_roberta_xtreme_base) | xlm_roberta_xtreme_base | xx |\n", - "| Universal sentence encoder for English trained with CMLM (sent_bert_use_cmlm_en_base) | sent_bert_use_cmlm_en_base | en |\n", - "| Universal sentence encoder for English trained with CMLM (sent_bert_use_cmlm_en_large) | sent_bert_use_cmlm_en_large | en |\n", - "| Universal sentence encoder for 100+ languages trained with CMLM (sent_bert_use_cmlm_multi_base_br) | sent_bert_use_cmlm_multi_base_br | xx |\n", - "| Universal sentence encoder for 100+ languages trained with CMLM (sent_bert_use_cmlm_multi_base) | sent_bert_use_cmlm_multi_base | xx |\n", - "| MS-BERT base model (uncased) | ms_bluebert_base_uncased | en |\n", - "| Longformer Base (longformer_base_4096) | longformer_base_4096 | en |\n", - "| Longformer Large (longformer_large_4096) | longformer_large_4096 | en |\n", - "| Multilingual Representations for Indian Languages (MuRIL) | bert_muril | xx |\n", - "| BERT Embeddings trained on MEDLINE/PubMed | bert_pubmed | en |\n", - "| BERT Embeddings trained on MEDLINE/PubMed and fine-tuned on SQuAD 2.0 | bert_pubmed_squad2 | en |\n", - "| BERT Embeddings trained on Wikipedia and BooksCorpus | bert_wiki_books | en |\n", - "| BERT Embeddings trained on Wikipedia and BooksCorpus and fine-tuned on MNLI | bert_wiki_books_mnli | en |\n", - "| BERT Embeddings trained on Wikipedia and BooksCorpus and fine-tuned on QNLI | bert_wiki_books_qnli | en |\n", - "| BERT Embeddings trained on Wikipedia and BooksCorpus and fine-tuned on QQP | bert_wiki_books_qqp | en |\n", - "| BERT Embeddings trained on Wikipedia and BooksCorpus and fine-tuned on SQuAD 2.0 | bert_wiki_books_squad2 | en |\n", - "| BERT Embeddings trained on Wikipedia and BooksCorpus and fine-tuned on SST-2 | bert_wiki_books_sst2 | en |\n", - "| Sentence Detection in Telugu Text | sentence_detector_dl | te |\n", - "| BERT Sentence Embeddings trained on MEDLINE/PubMed | sent_bert_pubmed | en |\n", - "| BERT Sentence Embeddings trained on MEDLINE/PubMed and fine-tuned on SQuAD 2.0 | sent_bert_pubmed_squad2 | en |\n", - "| BERT Sentence Embeddings trained on Wikipedia and BooksCorpus | sent_bert_wiki_books | en |\n", - "| BERT Sentence Embeddings trained on Wikipedia and BooksCorpus and fine-tuned on MNLI | sent_bert_wiki_books_mnli | en |\n", - "| BERT Sentence Embeddings trained on Wikipedia and BooksCorpus and fine-tuned on QNLI | sent_bert_wiki_books_qnli | en |\n", - "| BERT Sentence Embeddings trained on Wikipedia and BooksCorpus and fine-tuned on QQP | sent_bert_wiki_books_qqp | en |\n", - "| BERT Sentence Embeddings trained on Wikipedia and BooksCorpus and fine-tuned on SQuAD 2.0 | sent_bert_wiki_books_squad2 | en |\n", - "| BERT Sentence Embeddings trained on Wikipedia and BooksCorpus and fine-tuned on SST-2 | sent_bert_wiki_books_sst2 | en |\n", - "| Multilingual Representations for Indian Languages (MuRIL) - BERT Sentence Embedding pre-trained on 17 Indian languages | sent_bert_muril | xx |\n", - "| DistilRoBERTa Base Sentence Embeddings(sent_distilroberta_base) | sent_distilroberta_base | en |\n", - "| RoBERTa Base Sentence Embeddings(sent_roberta_base) | sent_roberta_base | en |\n", - "| RoBERTa Large Sentence Embeddings(sent_roberta_large) | sent_roberta_large | en |\n", - "| XLM-RoBERTa Base Sentence Embeddings (sent_xlm_roberta_base) | sent_xlm_roberta_base | xx |\n", - "| Spanish BERT Sentence Base Cased Embedding | sent_bert_base_cased | es |\n", - "| Dutch BERT Sentence Base Cased Embedding | sent_bert_base_cased | nl |\n", - "| Swedish BERT Sentence Base Cased Embedding | sent_bert_base_cased | sv |\n", - "| Greek BERT Sentence Base Uncased Embedding | sent_bert_base_uncased | el |\n", - "| Spanish BERT Sentence Base Uncased Embedding | sent_bert_base_uncased | es |\n", - "| Legal BERT Sentence Base Uncased Embedding | sent_bert_base_uncased_legal | en |\n", - "| Spanish BERT Base Cased Embedding | bert_base_cased | es |\n", - "| Dutch BERT Base Cased Embedding | bert_base_cased | nl |\n", - "| Swedish BERT Base Cased Embedding | bert_base_cased | sv |\n", - "| Greek BERT Base Uncased Embedding | bert_base_uncased | el |\n", - "| Spanish BERT Base Uncased Embedding | bert_base_uncased | es |\n", - "| Legal BERT Base Uncased Embedding | bert_base_uncased_legal | en |\n", - "| Word Embeddings for Japanese (japanese_cc_300d) | japanese_cc_300d | ja |\n", - "| Bert Embeddings Romanian (Base Cased) | bert_base_cased | ro |\n", - "| BERT Sentence Embeddings German (Base Cased) | sent_bert_base_cased | de |\n", - "| Japanese BERT Base | bert_base_japanese | ja |\n", - "| XLM-RoBERTa Base for Amharic (xlm_roberta_base_finetuned_amharic) | xlm_roberta_base_finetuned_amharic | am |\n", - "| XLM-RoBERTa Base for Hausa (xlm_roberta_base_finetuned_hausa) | xlm_roberta_base_finetuned_hausa | ha |\n", - "| XLM-RoBERTa Base for Igbo (xlm_roberta_base_finetuned_igbo) | xlm_roberta_base_finetuned_igbo | ig |\n", - "| XLM-RoBERTa Base for Kinyarwanda (xlm_roberta_base_finetuned_kinyarwanda) | xlm_roberta_base_finetuned_kinyarwanda | rw |\n", - "| XLM-RoBERTa Base for Luganda (xlm_roberta_base_finetuned_luganda) | xlm_roberta_base_finetuned_luganda | lg |\n", - "| XLM-RoBERTa Large (xlm_roberta_large) | xlm_roberta_large | xx |\n", - "| Word Embeddings for Dutch (dutch_cc_300d) | dutch_cc_300d | nl |" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "9SJw0qleR98a" - }, - "source": [ - "**You can find all these models and more [HERE](https://nlp.johnsnowlabs.com/models?task=Embeddings&edition=Spark+NLP)**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "s6BhkdS2jn9T" - }, - "source": [ - "### Word Embeddings (Glove)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 5993, - "status": "ok", - "timestamp": 1664909751172, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Og-knlUnjnNR", - "outputId": "5b6314c0-b289-44b0-a88b-75445073e4d1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "glove_100d download started this may take some time.\n", - "Approximate size to download 145.3 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "glove_embeddings = WordEmbeddingsModel.pretrained('glove_100d')\\\n", - " .setInputCols([\"document\", \"token\"])\\\n", - " .setOutputCol(\"embeddings\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "WY0kpJQMj3nu" - }, - "outputs": [], - "source": [ - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " glove_embeddings])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1370, - "status": "ok", - "timestamp": 1664909147376, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "_9pyocDNkPE2", - "outputId": "be0a0aed-a79b-482c-bb30-a517efc2842e" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------+----------------------------------------------------------------------------------------------------+\n", - "| token| embeddings|\n", - "+------------+----------------------------------------------------------------------------------------------------+\n", - "| Unions|[0.71865, 0.80754, -1.1787, 0.27145, -0.48833, -0.18938, -1.1789, 0.17836, -0.21995, -0.7216, -0....|\n", - "|representing|[0.25671, 0.30035, -0.18006, 0.46666, 0.98501, 0.2321, -0.34959, 0.26997, -0.99667, -0.43404, -0....|\n", - "| workers|[0.50592, 0.71717, -0.67236, -0.32112, -0.58285, -0.47977, -0.50243, 0.60594, 0.25709, 0.03974, -...|\n", - "| at|[0.1766, 0.093851, 0.24351, 0.44313, -0.39037, 0.12524, -0.19918, 0.59855, -0.82035, 0.28006, 0.5...|\n", - "| Turner|[0.51634, -0.37186, -0.21776, -1.0115, 0.4014, -0.4841, 0.36274, -0.2952, -0.42258, -0.62844, 0.6...|\n", - "| Newall|[-0.38857, -1.1449, -0.41737, -0.31969, -0.16546, -0.7044, 0.12875, -0.26047, 0.072844, -0.13314,...|\n", - "| say|[-0.091682, 0.58105, 0.40477, -0.41979, -0.85111, -0.28719, -0.41949, -0.10424, 0.45317, -0.09907...|\n", - "| they|[-0.07954, 0.30171, 0.079516, -0.74662, -0.67879, 0.35029, -0.19754, 0.4929, 0.14162, -0.23789, 0...|\n", - "| are|[-0.51533, 0.83186, 0.22457, -0.73865, 0.18718, 0.26021, -0.42564, 0.67121, -0.31084, -0.61275, 0...|\n", - "| '|[-0.34562, -0.24993, 0.58678, -0.89119, -1.0954, -0.45078, -0.074549, -0.44779, -0.38492, -0.4923...|\n", - "+------------+----------------------------------------------------------------------------------------------------+\n", - "only showing top 10 rows\n", - "\n" - ] - } - ], - "source": [ - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.embeddings.embeddings)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"embeddings\"))\n", - "\n", - "result_df.show(10, truncate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "x16b0IqLwyLj" - }, - "source": [ - "#### Using your own Word embeddings in Spark NLP" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "pSb6TNYTbf55" - }, - "outputs": [], - "source": [ - "! wget -q https://dl.fbaipublicfiles.com/fasttext/vectors-crawl/cc.nl.300.vec.gz" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Srhl4Dwrbklm" - }, - "outputs": [], - "source": [ - "!gunzip cc.nl.300.vec.gz" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "bGJogyZ-w7cB" - }, - "outputs": [], - "source": [ - "custom_embeddings = WordEmbeddings()\\\n", - " .setInputCols([\"document\", \"token\"])\\\n", - " .setOutputCol(\"my_embeddings\")\\\n", - " .setStoragePath('cc.nl.300.vec', \"TEXT\")\\\n", - " .setDimension(300)\n", - "\n", - "custom_embeddings_model = custom_embeddings.fit(result.limit(10))# any df would be fine as long as it had document and token columns thru Spark NLP" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1184, - "status": "ok", - "timestamp": 1664909418626, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ZgJ6xShAdbFo", - "outputId": "6cb0490b-72c1-43ef-a770-735d0098e3f5" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------------------------------------------------------------------+\n", - "| embeddings|\n", - "+----------------------------------------------------------------------------------------------------+\n", - "|[[-0.0724, -0.0156, -0.031, -0.0285, 0.0037, 0.0091, -0.0524, -0.0528, -0.0572, -0.0975, 0.0156, ...|\n", - "|[[0.0123, -0.0048, -0.0016, 0.015, 0.0078, 0.0286, -0.0042, -0.0298, 0.0143, -0.1116, 0.0151, -0....|\n", - "|[[0.0807, 0.032, -0.0031, 0.0422, 0.14, 0.0321, -0.1067, -0.1257, -0.0627, -0.2708, -0.0688, 0.11...|\n", - "|[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...|\n", - "|[[-0.0471, 0.025, -0.007, 0.055, -0.019, 0.0615, -0.0303, -0.0282, -0.0087, -0.037, 0.0122, -0.02...|\n", - "|[[-0.2369, 0.1427, 0.0382, -0.0638, 0.0302, 0.0055, -0.0086, -0.0269, 0.0066, 0.1798, -0.0224, -0...|\n", - "|[[-0.2369, 0.1427, 0.0382, -0.0638, 0.0302, 0.0055, -0.0086, -0.0269, 0.0066, 0.1798, -0.0224, -0...|\n", - "|[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...|\n", - "|[[-0.2369, 0.1427, 0.0382, -0.0638, 0.0302, 0.0055, -0.0086, -0.0269, 0.0066, 0.1798, -0.0224, -0...|\n", - "|[[0.0312, 0.0831, -0.0697, -0.0373, 0.118, -0.0333, -0.0756, -0.0233, -0.0578, 0.4225, -0.0321, -...|\n", - "+----------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "custom_embeddings_model.transform(result.limit(10)).select('my_embeddings.embeddings').show(truncate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "zCJzgV_Up7Yg" - }, - "source": [ - "### Elmo Embeddings" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "_WcSwAzJew8l" - }, - "source": [ - "Computes contextualized word representations using character-based word representations and bidirectional LSTMs.\n", - "\n", - "It can work with 4 different pooling layer options: `word_emb`, \n", - "`lstm_outputs1`, `lstm_outputs2`, or `elmo`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 17958, - "status": "ok", - "timestamp": 1664909436576, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ehvin7KVpzYk", - "outputId": "724b7158-36f9-4e1f-c039-ce5051f4acb9" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "elmo download started this may take some time.\n", - "Approximate size to download 334.1 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "elmo_embeddings = ElmoEmbeddings.pretrained('elmo')\\\n", - " .setInputCols([\"document\", \"token\"])\\\n", - " .setOutputCol(\"embeddings\")\\\n", - " .setPoolingLayer('elmo')# default --> elmo " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1806, - "status": "ok", - "timestamp": 1664909438371, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Liew-mgrr5eD", - "outputId": "60ee5647-af42-4418-c17b-f24af5b307d1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------+----------------------------------------------------------------------------------------------------+\n", - "| token| elmo_embeddings|\n", - "+------------+----------------------------------------------------------------------------------------------------+\n", - "| Unions|[-0.90887415, -0.30120426, 0.43796417, -0.57044435, 0.47783935, -0.119429074, 0.0076734107, 0.383...|\n", - "|representing|[0.13965544, 0.22222666, -0.039318062, 0.016958922, 0.7448401, 0.3416085, -0.3798288, -0.24866202...|\n", - "| workers|[-0.46730578, -0.30479333, -0.026425809, -0.32429358, 0.75354207, -0.18502708, -0.12659112, -0.46...|\n", - "| at|[-0.25518382, -0.22426175, -0.3707175, -0.60111916, 0.06384361, -0.48253918, 0.43195224, 0.506473...|\n", - "| Turner|[-1.28543, -0.08228641, -0.191375, -0.42979646, -0.22902456, 0.11305181, 0.28118223, -0.6329747, ...|\n", - "| Newall|[-0.15922381, -0.4069708, -0.26923794, -0.4310938, 0.02952183, -0.34705558, -0.17874795, 0.088628...|\n", - "| say|[0.040825248, 0.79921997, 0.020270275, -0.5167818, 0.089849845, -0.54928946, -0.09102909, -0.0168...|\n", - "| they|[-1.1243961, -0.010669309, -0.097467996, -0.0038198307, 0.8827248, -0.8975107, 0.25767303, 0.5404...|\n", - "| are|[-0.7048798, -0.3428075, -0.07719923, -0.49473467, 0.014530063, -0.12821776, 0.2985173, 0.5282617...|\n", - "| '|[-0.54589736, -0.29538193, 0.023100121, -0.019431472, 0.25288752, 0.009414777, 0.17324895, -0.034...|\n", - "|disappointed|[-0.67589045, -0.20069829, 0.83521056, -0.50575566, 0.65615255, -0.6367348, -0.16388428, -0.90439...|\n", - "| '|[-0.25755265, 0.3030559, 0.5622954, 0.30021656, 0.54014075, -0.5633521, 0.24766476, -0.57990265, ...|\n", - "| after|[-0.202389, 0.24767357, -0.23489536, -0.32719886, 0.44261807, -0.9367193, 0.21963781, -0.12545675...|\n", - "| talks|[-0.1785077, 0.25418776, 0.08238828, -0.24434832, 0.17956342, -1.2120204, 0.07875113, 0.3737102, ...|\n", - "| with|[0.52579856, -0.15434241, -0.118289724, -0.13308676, -0.05741524, 0.014611676, 0.27711594, 0.1267...|\n", - "| stricken|[0.4297342, -0.14186615, 0.069291145, -0.23070803, 0.045775726, -0.10202141, 0.6809373, 0.7641753...|\n", - "| parent|[0.44972146, -0.1574139, 0.16139527, -0.067404754, 0.6104196, 0.18980037, -0.19194514, 1.1387352,...|\n", - "| firm|[0.23465863, -0.27139914, 0.22050485, -0.04467322, 0.44497567, -0.49274597, -0.042227328, 0.19309...|\n", - "| Federal|[-0.9843947, 1.3339465, 0.3907869, -0.50403845, 0.71886575, -0.28959268, 0.75705194, 0.17455763, ...|\n", - "| Mogul|[-0.4634573, -0.12920536, 0.111302294, -0.26346883, 0.9858167, -1.0185302, -0.060575206, 0.365284...|\n", - "+------------+----------------------------------------------------------------------------------------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " elmo_embeddings])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))\n", - "\n", - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.embeddings.embeddings)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"elmo_embeddings\"))\n", - "\n", - "result_df.show(truncate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "fyUNNvrgsW5u" - }, - "source": [ - "### Bert Embeddings\n", - "\n", - "BERT (Bidirectional Encoder Representations from Transformers) provides dense vector representations for natural language by using a deep, pre-trained neural network with the Transformer architecture\n", - "\n", - "It can work with 3 different pooling layer options: `0`, \n", - "`-1`, or `-2`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 20530, - "status": "ok", - "timestamp": 1664909458894, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "s5TGgrQPsl4P", - "outputId": "cffca8e0-c615-4b96-927c-2ade78b848a0" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bert_base_uncased download started this may take some time.\n", - "Approximate size to download 392.5 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "bert_embeddings = BertEmbeddings.pretrained('bert_base_uncased')\\\n", - " .setInputCols([\"document\", \"token\"])\\\n", - " .setOutputCol(\"embeddings\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 4586, - "status": "ok", - "timestamp": 1664909463445, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "VRHsfwBrsvF8", - "outputId": "771d576e-aa7e-4a0e-92b3-b6c2889485bc" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------+----------------------------------------------------------------------------------------------------+\n", - "| token| bert_embeddings|\n", - "+------------+----------------------------------------------------------------------------------------------------+\n", - "| Unions|[0.6670659, 0.075691774, -0.43506515, 0.13065232, 0.44819474, -0.075209334, -0.2241662, 0.1837851...|\n", - "|representing|[0.42402333, -0.15955889, -0.17578948, -0.5392357, -0.40183172, 0.38137984, 0.12605838, -0.409287...|\n", - "| workers|[0.7290717, 0.06131853, -0.54681975, -0.47506055, 0.3344038, 0.03293537, 0.38784602, 0.8520438, 0...|\n", - "| at|[0.10098228, 0.40903705, -0.44306707, -0.17509109, 0.1682218, 0.11896059, 0.41752312, 0.28065842,...|\n", - "| Turner|[0.6406127, 0.21072698, 0.010704566, 0.061129358, 0.052616015, 0.48817542, 0.04534916, 0.36956063...|\n", - "| Newall|[0.23471491, -0.47658986, -0.08398946, 0.054417428, 0.59816754, -0.328746, -0.34127328, 0.3301417...|\n", - "| say|[0.30300033, 0.123910174, 0.26303437, -0.29814374, 0.6184639, 0.15924262, -0.41755497, 0.51777476...|\n", - "| they|[0.06975791, -0.09760859, 0.19559911, -0.09057991, 0.10705751, 0.29734504, 0.09018942, 0.3121962,...|\n", - "| are|[-0.4600867, -0.03295532, 0.23510689, -0.23376492, 0.7956509, -0.009301226, -0.17701793, 0.711720...|\n", - "| '|[-0.32480395, -0.25789693, 0.5846827, -0.1503588, 0.45304078, -0.100868076, 0.43844336, 1.1270385...|\n", - "|disappointed|[-0.2920178, -0.5172758, 0.3739883, -0.46082836, 0.3249434, -0.14818825, -0.29012105, -0.01015694...|\n", - "| '|[-0.15516862, -0.13123243, 1.1257515, -0.6699537, 0.69658446, -0.08509679, 0.72284716, 0.7080308,...|\n", - "| after|[-0.2543314, -0.8899713, 0.5071763, 0.21592468, 0.2176922, 0.013359261, -0.47493804, 0.787083, 0....|\n", - "| talks|[-0.37898618, -0.2394179, 0.5133715, -0.025473528, 0.5798027, -0.29655194, 0.1830677, 0.07918449,...|\n", - "| with|[-0.40935937, 0.001023029, 0.20301563, 0.22106495, 0.062305883, -0.71892744, -0.17498948, 0.17216...|\n", - "| stricken|[-0.2687675, -0.51437914, 0.09687303, 0.032191057, 0.012207681, -0.044916622, -0.56810105, 0.2606...|\n", - "| parent|[0.6813847, -0.05907987, -0.45890468, 0.29420638, -0.38349813, 0.043616094, -0.50075155, 1.391248...|\n", - "| firm|[0.6276437, 0.32360873, 0.07091117, 0.48709965, 0.5830411, 0.57710993, -0.35511157, 0.3764335, -0...|\n", - "| Federal|[0.39469343, 0.43995667, -0.21780302, 0.34551498, 0.5347833, 0.65870786, -0.604482, 0.23736075, -...|\n", - "| Mogul|[0.49591896, 0.13451222, 0.1510944, 0.45716962, 0.8584716, 0.150838, -0.62374413, 0.3586182, -0.2...|\n", - "+------------+----------------------------------------------------------------------------------------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " bert_embeddings])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))\n", - "\n", - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.embeddings.embeddings)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"bert_embeddings\"))\n", - "\n", - "result_df.show(truncate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "LC8E1nrUv6bD" - }, - "source": [ - "### Chunk Embeddings\n", - "\n", - "This annotator utilizes `WordEmbeddings` or `BertEmbeddings` to generate chunk embeddings from either `TextMatcher`, `RegexMatcher`, `Chunker`, `NGramGenerator`, or `NerConverter` outputs.\n", - "\n", - "`setPoolingStrategy`: Choose how you would like to aggregate Word Embeddings to Sentence Embeddings: `AVERAGE` or `SUM`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 31, - "status": "ok", - "timestamp": 1664909463446, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "FkZYc6jXhK7l", - "outputId": "2c46aa91-26d1-4070-dd74-2204f8a60b45" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(category='Business', text=\"Unions representing workers at Turner Newall say they are 'disappointed' after talks with stricken parent firm Federal Mogul.\"),\n", - " Row(category='Sci/Tech', text=' TORONTO, Canada A second team of rocketeers competing for the #36;10 million Ansari X Prize, a contest for privately funded suborbital space flight, has officially announced the first launch date for its manned rocket.'),\n", - " Row(category='Sci/Tech', text=' A company founded by a chemistry researcher at the University of Louisville won a grant to develop a method of producing better peptides, which are short chains of amino acids, the building blocks of proteins.')]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "news_df.take(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "XMTBQh24hDx5" - }, - "outputs": [], - "source": [ - "entities = ['parent firm', 'economy', 'amino acids']\n", - "\n", - "with open ('entities.txt', 'w') as f:\n", - " for i in entities:\n", - " f.write(i+'\\n')\n", - "\n", - "entity_extractor = TextMatcher() \\\n", - " .setInputCols([\"document\",'token'])\\\n", - " .setOutputCol(\"entities\")\\\n", - " .setEntities(\"entities.txt\")\\\n", - " .setCaseSensitive(False)\\\n", - " .setEntityValue('entities')\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " entity_extractor])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 383, - "status": "ok", - "timestamp": 1664909464487, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "C9h6W5ixhkxp", - "outputId": "cf116e73-8e2e-420e-883d-ffa20afc9001" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Row(result=['parent firm']), Row(result=[]), Row(result=['amino acids'])]" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result.select('entities.result').take(3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Y_kbAnkMiLx_" - }, - "outputs": [], - "source": [ - "chunk_embeddings = ChunkEmbeddings() \\\n", - " .setInputCols([\"entities\", \"embeddings\"]) \\\n", - " .setOutputCol(\"chunk_embeddings\") \\\n", - " .setPoolingStrategy(\"AVERAGE\")\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " entity_extractor,\n", - " glove_embeddings,\n", - " chunk_embeddings])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 5153, - "status": "ok", - "timestamp": 1664909470368, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "o4peezBVjEWQ", - "outputId": "7d0a8b78-43c9-4ec7-f244-4e78529a6167" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------+----------------------------------------------------------------------------------------------------+\n", - "| entities| chunk_embeddings|\n", - "+-----------+----------------------------------------------------------------------------------------------------+\n", - "|parent firm|[0.45683652, -0.105479494, -0.34525, -0.143924, -0.192452, -0.33616, -0.22334, -0.208185, -0.3673...|\n", - "|amino acids|[-0.3861, 0.054408997, -0.287795, -0.33318, 0.375065, -0.185539, -0.330525, -0.214415, -0.73892, ...|\n", - "+-----------+----------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "result_df = result.select(F.explode(F.arrays_zip(result.entities.result,\n", - " result.chunk_embeddings.embeddings)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"entities\"),\n", - " F.expr(\"cols['1']\").alias(\"chunk_embeddings\"))\n", - "\n", - "result_df.show(truncate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Ak26Rrf1tH_s" - }, - "source": [ - "### UniversalSentenceEncoder" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "FfHu1tUIj4uK" - }, - "source": [ - "The Universal Sentence Encoder encodes text into high dimensional vectors that can be used for text classification, semantic similarity, clustering and other natural language tasks." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 26072, - "status": "ok", - "timestamp": 1664909777210, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "88WEGqcSsWIY", - "outputId": "9e582ab4-93ca-4588-843f-ef5ff661a2ee" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tfhub_use download started this may take some time.\n", - "Approximate size to download 923.7 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "# no need for token columns \n", - "use_embeddings = UniversalSentenceEncoder.pretrained(\"tfhub_use\", \"en\") \\\n", - " .setInputCols(\"document\") \\\n", - " .setOutputCol(\"sentence_embeddings\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 2298, - "status": "ok", - "timestamp": 1664909779486, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "RJAYyXfztu-8", - "outputId": "297713c9-0c4e-4501-98e9-6e324cf5096f" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "| document| USE_embeddings|\n", - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "|Unions representing workers at Turner Newall say they are 'disappointed' after talks with stric...|[0.012997561, 0.01984477, -0.024626475, 0.039759077, -0.044246476, 0.013197604, 0.07867438, -0.05...|\n", - "| TORONTO, Canada A second team of rocketeers competing for the #36;10 million Ansari X Prize,...|[0.001999881, 0.051844038, -0.044029105, -5.932957E-4, -0.038505986, -0.027279468, 0.06940469, -0...|\n", - "| A company founded by a chemistry researcher at the University of Louisville won a grant to devel...|[0.03864186, 0.023220852, -0.004016253, 0.07199469, 0.027279727, -0.058951836, -0.0019538593, 0.0...|\n", - "| It's barely dawn when Mike Fitzpatrick starts his shift with a blur of colorful maps, figures an...|[0.072394915, 0.06559241, -0.015342068, -0.023814267, 0.01322931, -0.046775296, 0.009602186, 0.02...|\n", - "| Southern California's smog fighting agency went after emissions of the bovine variety Friday, ad...|[-0.034784008, -0.04371792, -8.897062E-4, 0.061689097, 0.03343994, 0.021937966, 0.05359926, -0.05...|\n", - "|\"The British Department for Education and Skills (DfES) recently launched a \"\"Music Manifesto\"\" c...|[-0.02244975, -0.0051162946, -0.011258106, 0.037045635, -0.0015617626, -0.046843972, 0.08016194, ...|\n", - "|\"confessed author of the Netsky and Sasser viruses, is responsible for 70 percent of virus infect...|[4.5218898E-4, -0.044989046, -0.027128322, 0.05711092, 0.04432688, -0.03930944, -0.0049682218, -0...|\n", - "|\\\\FOAF/LOAF and bloom filters have a lot of interesting properties for social\\network and whitel...|[0.045447674, -0.0673045, 0.047636565, -0.02094886, -0.025080299, 0.03516157, 0.0047589773, 0.030...|\n", - "| \"Wiltshire Police warns about \"\"phishing\"\" after its fraud squad chief was targeted.\"|[-0.00513464, -0.07799961, -0.03284713, -0.01024671, 0.037006836, -0.05350421, 0.009521332, -0.03...|\n", - "|In its first two years, the UK's dedicated card fraud unit, has recovered 36,000 stolen cards and...|[0.007892201, -0.0701188, -0.028799085, -0.018356498, 0.024937212, -0.07232398, 0.085445836, 0.02...|\n", - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " use_embeddings])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))\n", - "\n", - "result_df = result.select(F.explode(F.arrays_zip(result.document.result, \n", - " result.sentence_embeddings.embeddings)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"document\"),\n", - " F.expr(\"cols['1']\").alias(\"USE_embeddings\"))\n", - "\n", - "result_df.show(truncate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "W74tlfkl75P5" - }, - "source": [ - "### LongFormer Embeddings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "L6wv9S3gF0Sj" - }, - "outputs": [], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 40865, - "status": "ok", - "timestamp": 1664909830454, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "8jzsd5paFps6", - "outputId": "4f2fd0cf-2f36-4d63-ad9e-29999004c02d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "longformer_base_4096 download started this may take some time.\n", - "Approximate size to download 343.3 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "# no need for token columns \n", - "longformer_embeddings = LongformerEmbeddings.pretrained() \\\n", - " .setInputCols('document',\"token\") \\\n", - " .setOutputCol(\"longformer_embeddings\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 29988, - "status": "ok", - "timestamp": 1664909860431, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Jc4sj9dC8AMT", - "outputId": "15e60cb5-7cd3-4320-eeea-8c2249fafbad" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------+----------------------------------------------------------------------------------------------------+\n", - "| token| longformer_embeddings|\n", - "+------------+----------------------------------------------------------------------------------------------------+\n", - "| Unions|[0.07719437, -0.17138699, -6.540511E-4, -0.13498086, -0.023513347, -0.2028867, 0.0938687, -0.0760...|\n", - "|representing|[-0.037457973, -0.122049384, 0.11676876, 0.20218223, 0.05563064, 0.16728787, 0.110208884, -0.1453...|\n", - "| workers|[-0.13273284, -0.015104517, 0.052178774, -0.34765008, -0.26494068, 0.21955602, 0.0025631627, -0.0...|\n", - "| at|[-0.1871058, -0.15763302, -0.036046065, -0.14117411, 0.32089376, 0.0988634, -0.099187165, 0.09724...|\n", - "| Turner|[0.041943394, -0.007565988, 0.032059915, -0.019206144, -0.34937793, -0.187767, -0.030716063, -0.1...|\n", - "| Newall|[-0.016664965, 0.20831646, -0.07345706, -0.08770898, 0.09218825, -0.1095924, 0.39393264, 0.363961...|\n", - "| say|[0.10822279, 0.09800173, -0.050198782, -0.26110616, 0.055013414, -0.24756625, 0.023142464, 0.0982...|\n", - "| they|[-0.06725839, 0.18717986, -0.25182387, -0.52932215, -0.8810263, 0.20006596, 0.12919274, 0.0215994...|\n", - "| are|[0.20806815, 0.25371054, -0.03866426, -0.14666738, -0.3055287, -0.06543347, 0.019405391, -0.01027...|\n", - "| '|[0.27279565, -0.008778511, 0.029686064, 0.09686689, -0.047101133, 0.17664933, 0.02347222, -0.2584...|\n", - "|disappointed|[-0.061784416, 0.10046677, -0.01712867, 0.07331942, 0.2395818, -0.3137749, -0.07112072, -0.325874...|\n", - "| '|[0.30586535, -0.08653332, 0.06588482, 0.23384081, 0.018363494, -0.031568833, 0.03716231, -0.15546...|\n", - "| after|[0.12608868, 0.021265892, -8.5087307E-4, 0.20219721, -0.11005052, -0.16537799, -0.093448654, 0.04...|\n", - "| talks|[-0.065675214, 0.2547877, -0.023002231, 0.07334101, -1.0161656, 0.10010045, -0.076567814, -0.1042...|\n", - "| with|[-0.058689136, 0.08328565, -0.062080774, 0.24219596, 0.48440862, 0.31241417, 0.04525351, 0.111382...|\n", - "| stricken|[0.022671841, -0.0010705628, 0.046994254, 0.019946698, -0.3519812, 0.101592556, -0.14684096, -0.1...|\n", - "| parent|[0.099573314, -0.030517425, 0.027951747, 0.10648133, 0.3734014, -0.33672994, 0.206242, -0.0200887...|\n", - "| firm|[0.25588194, -0.10536073, -0.00896785, 0.24162258, -0.6211535, -0.3675931, -0.10997876, 0.0204709...|\n", - "| Federal|[-0.019053962, 0.009452908, -0.012464292, -0.069504485, 0.14036526, 0.022730783, -0.011906238, 0....|\n", - "| Mogul|[-0.076652616, 0.04900066, -0.051001675, -0.14854756, 0.08934068, -0.16336307, -0.03759157, 0.139...|\n", - "+------------+----------------------------------------------------------------------------------------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " longformer_embeddings])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))\n", - "\n", - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.longformer_embeddings.embeddings)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"longformer_embeddings\"))\n", - "\n", - "result_df.show(truncate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "wtoIJ_rc8iCl" - }, - "source": [ - "### Multi-Lingual Embeddings \n", - "\n", - "These Embeddings can map text from multiple languages to topological close points in hyperspace, which standard embeddings fail to do. \n", - "Classifier Models trained with these embeddings are able to generalize across all the supported languages, even if the classifier model was trained on english data. \n", - "\n", - "**Here is the Multi-Lingual Embeddings Model List avaliable in Spark NLP:**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "At39DrH2NHA7" - }, - "source": [ - "\n", - "\n", - "| Name | Spark NLP Model Name | language |\n", - "|:-----------------------------------------------------------------------------------------------------------------------|:-----------------------------------|:-----------|\n", - "| GloVe Embeddings 6B 300 (Multilingual) | glove_6B_300 | xx |\n", - "| GloVe Embeddings 840B 300 (Multilingual) | glove_840B_300 | xx |\n", - "| Multilingual BERT Embeddings (Base Cased) | bert_multi_cased | xx |\n", - "| Multilingual BERT Sentence Embeddings (Base Cased) | sent_bert_multi_cased | xx |\n", - "| Universal Sentence Encoder Multilingual Large | tfhub_use_multi_lg | xx |\n", - "| Universal Sentence Encoder Multilingual | tfhub_use_multi | xx |\n", - "| Universal Sentence Encoder XLING English and German | tfhub_use_xling_en_de | xx |\n", - "| Universal Sentence Encoder XLING English and Spanish | tfhub_use_xling_en_es | xx |\n", - "| Universal Sentence Encoder XLING English and French | tfhub_use_xling_en_fr | xx |\n", - "| Universal Sentence Encoder XLING Many | tfhub_use_xling_many | xx |\n", - "| Universal Sentence Encoder Multilingual Large (tfhub_use_multi_lg) | tfhub_use_multi_lg | xx |\n", - "| Universal Sentence Encoder Multilingual (tfhub_use_multi) | tfhub_use_multi | xx |\n", - "| BERT multilingual base model (cased) | bert_base_multilingual_cased | xx |\n", - "| BERT multilingual base model (uncased) | bert_base_multilingual_uncased | xx |\n", - "| DistilBERT base multilingual model (cased) | distilbert_base_multilingual_cased | xx |\n", - "| Twitter XLM-RoBERTa Base (twitter_xlm_roberta_base) | twitter_xlm_roberta_base | xx |\n", - "| XLM-RoBERTa Base (xlm_roberta_base) | xlm_roberta_base | xx |\n", - "| XLM-RoBERTa XTREME Base (xlm_roberta_xtreme_base) | xlm_roberta_xtreme_base | xx |\n", - "| Universal sentence encoder for 100+ languages trained with CMLM (sent_bert_use_cmlm_multi_base_br) | sent_bert_use_cmlm_multi_base_br | xx |\n", - "| Universal sentence encoder for 100+ languages trained with CMLM (sent_bert_use_cmlm_multi_base) | sent_bert_use_cmlm_multi_base | xx |\n", - "| Multilingual Representations for Indian Languages (MuRIL) | bert_muril | xx |\n", - "| Multilingual Representations for Indian Languages (MuRIL) - BERT Sentence Embedding pre-trained on 17 Indian languages | sent_bert_muril | xx |\n", - "| XLM-RoBERTa Base Sentence Embeddings (sent_xlm_roberta_base) | sent_xlm_roberta_base | xx |\n", - "| XLM-RoBERTa Large (xlm_roberta_large) | xlm_roberta_large | xx |\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Jp6ByDKwQzHv" - }, - "source": [ - "**You can find all these models and more [HERE](https://nlp.johnsnowlabs.com/models?language=xx&task=Embeddings&edition=Spark+NLP)**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-M7vAkB2F-7x" - }, - "source": [ - "#### Multi-Lingual BERT Embeddings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 18538, - "status": "ok", - "timestamp": 1664910048572, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "9_ef5r1-F-7y", - "outputId": "d4346895-78b6-4324-c0c1-0e7a2a691e18" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bert_multi_cased download started this may take some time.\n", - "Approximate size to download 638.6 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "# no need for token columns \n", - "embeddings = BertEmbeddings.pretrained('bert_multi_cased','xx') \\\n", - " .setInputCols('document',\"token\") \\\n", - " .setOutputCol(\"embeddings\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "-QOhEV0aF-7y" - }, - "outputs": [], - "source": [ - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " embeddings])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))\n", - "\n", - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.embeddings.embeddings)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"BERT embeddings\"))\n", - "\n", - "result_df.show(truncate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Nn6vOaJ7y3ZZ" - }, - "source": [ - "## Loading Models from local" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 275, - "status": "ok", - "timestamp": 1664910173570, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "z_HgZG10zER5", - "outputId": "7498f1a0-8a15-4dc2-cbab-118cdf0c4472" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/root/cache_pretrained\n" - ] - } - ], - "source": [ - "!cd ~/cache_pretrained && pwd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 256, - "status": "ok", - "timestamp": 1664910176253, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "YhdSFd6ybatv", - "outputId": "b46d0fde-1dc6-49ff-f5c2-d064b0862aed" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 72\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:50 bert_base_uncased_en_2.6.0_2.4_1598340514223\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:58 bert_multi_cased_xx_2.6.0_2.4_1598341875191\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:39 dependency_conllu_en_3.4.4_3.0_1656845289670\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:39 dependency_typed_conllu_en_3.4.4_3.0_1656850770275\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:42 detect_language_220_xx_2.7.0_2.4_1607185721383\n", - "drwxr-xr-x 3 root root 4096 Oct 4 18:50 elmo_en_2.4.0_2.4_1580488815299\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:45 glove_100d_en_2.4.0_2.4_1579690104032\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:42 ld_wiki_tatoeba_cnn_375_xx_2.7.0_2.4_1607184873730\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:26 lemma_antbnc_en_2.0.2_2.4_1556480454569\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:52 longformer_base_4096_en_3.2.0_2.4_1628093002279\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:42 opus_mt_de_en_xx_3.1.0_2.4_1622555271468\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:34 pos_anc_en_3.0.0_3.0_1614962126490\n", - "drwxr-xr-x 3 root root 4096 Oct 4 18:42 sentence_detector_dl_xx_2.7.0_2.4_1609610616998\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:41 spellcheck_dl_en_3.4.1_3.0_1648457196011\n", - "drwxr-xr-x 4 root root 4096 Oct 4 18:40 spellcheck_norvig_en_3.1.3_3.0_1631046343759\n", - "drwxr-xr-x 3 root root 4096 Oct 4 18:40 stopwords_en_en_2.5.4_2.4_1594742439135\n", - "drwxr-xr-x 3 root root 4096 Oct 4 18:40 stopwords_es_es_2.5.4_2.4_1594742441303\n", - "drwxr-xr-x 3 root root 4096 Oct 4 18:51 tfhub_use_en_2.4.0_2.4_1587136330099\n" - ] - } - ], - "source": [ - "!cd ~/cache_pretrained && ls -l" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "B64mWzh9y7Jt" - }, - "outputs": [], - "source": [ - "glove_embeddings = WordEmbeddingsModel.load('/root/cache_pretrained/glove_100d_en_2.4.0_2.4_1579690104032').\\\n", - " setInputCols([\"document\", 'token']).\\\n", - " setOutputCol(\"glove_embeddings\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "yo839CrNuzq7" - }, - "source": [ - "## Getting Sentence Embeddings from word embeddings" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 5476, - "status": "ok", - "timestamp": 1664910192748, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "c8bhA7Rhuygc", - "outputId": "3775be95-61f0-4ad7-b592-8bb1f550fb84" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "glove_100d download started this may take some time.\n", - "Approximate size to download 145.3 MB\n", - "[OK!]\n", - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "| document| sentence_embeddings|\n", - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "|Unions representing workers at Turner Newall say they are 'disappointed' after talks with stric...|[0.06131713, 0.08552574, 0.1340617, -0.22403374, -0.23798925, -0.159222, -0.21079227, 0.07760903,...|\n", - "| TORONTO, Canada A second team of rocketeers competing for the #36;10 million Ansari X Prize,...|[-0.05313636, 0.100133374, 0.19096054, -0.01998518, 0.32574704, -0.06335781, 0.1789568, 0.2931641...|\n", - "| A company founded by a chemistry researcher at the University of Louisville won a grant to devel...|[0.021042928, 0.074208066, 0.0723595, -0.09070449, 0.2993206, 0.04752573, -0.060713578, 0.155145,...|\n", - "| It's barely dawn when Mike Fitzpatrick starts his shift with a blur of colorful maps, figures an...|[-0.22619276, 0.18458064, 0.3589564, -0.3349514, 0.08098127, 0.09799263, -0.049265776, 0.25009856...|\n", - "| Southern California's smog fighting agency went after emissions of the bovine variety Friday, ad...|[-0.06140215, -0.040404316, 0.44608322, -0.18327837, 0.019998113, -0.09348459, -0.17261569, 0.177...|\n", - "|\"The British Department for Education and Skills (DfES) recently launched a \"\"Music Manifesto\"\" c...|[-0.01894932, 0.067353465, 0.011856217, -0.23963752, 0.30282092, 0.01841911, 0.029716793, 0.16109...|\n", - "|\"confessed author of the Netsky and Sasser viruses, is responsible for 70 percent of virus infect...|[0.013585807, 0.0013871301, 0.19375019, -0.25756782, 0.1557032, 0.101828136, 0.12016087, 0.031324...|\n", - "|\\\\FOAF/LOAF and bloom filters have a lot of interesting properties for social\\network and whitel...|[-0.13172166, 0.16039874, 0.26770115, -0.21353802, 0.094076656, 0.123355016, -0.1721528, 0.098089...|\n", - "| \"Wiltshire Police warns about \"\"phishing\"\" after its fraud squad chief was targeted.\"|[-0.014898933, -0.1829025, 0.17554195, -0.355318, -0.013315629, 0.18482018, -0.0075285546, 0.0961...|\n", - "|In its first two years, the UK's dedicated card fraud unit, has recovered 36,000 stolen cards and...|[0.0010903521, 0.17995015, 0.18142067, -0.24167466, 0.19849405, 0.19571333, 0.11464099, 0.1724940...|\n", - "+----------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "glove_embeddings = WordEmbeddingsModel.pretrained('glove_100d')\\\n", - " .setInputCols([\"document\", \"token\"])\\\n", - " .setOutputCol(\"embeddings\")\n", - "\n", - "embeddingsSentence = SentenceEmbeddings() \\\n", - " .setInputCols([\"document\", \"embeddings\"]) \\\n", - " .setOutputCol(\"sentence_embeddings\") \\\n", - " .setPoolingStrategy(\"AVERAGE\") # or SUM\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " glove_embeddings,\n", - " embeddingsSentence])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))\n", - "\n", - "result_df = result.select(F.explode(F.arrays_zip(result.document.result, \n", - " result.sentence_embeddings.embeddings)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"document\"),\n", - " F.expr(\"cols['1']\").alias(\"sentence_embeddings\"))\n", - "\n", - "result_df.show(truncate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "C6-wTRfAx3rL" - }, - "source": [ - "### Cosine similarity between two embeddings (sentence similarity)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1489, - "status": "ok", - "timestamp": 1664910203619, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "pliYSeTgwpq9", - "outputId": "2927a1a6-b856-4b7f-ef3d-b39e905e270c" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.876465618347585" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from scipy.spatial import distance\n", - "\n", - "import numpy as np\n", - "\n", - "v1 = result_df.select('sentence_embeddings').take(2)[0][0]\n", - "\n", - "v2 = result_df.select('sentence_embeddings').take(2)[1][0]\n", - "\n", - "1 - distance.cosine(np.array(v1), np.array(v2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 776, - "status": "ok", - "timestamp": 1664910232785, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "LZNFCaboxhUO", - "outputId": "899e07a1-2824-41ee-ec29-9bb7de96cb27" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v2 = result_df.select('sentence_embeddings').take(2)[0][0]\n", - "\n", - "1 - distance.cosine(np.array(v1), np.array(v2))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "qwWi2bMTegFV" - }, - "source": [ - "## QuestionAnswering Models" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "rwjTKJ8oghjG" - }, - "source": [ - "| Language Name(s) | NLU Reference | Spark NLP Reference |\n", - "|:-------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n", - "|[Bengali](https://iso639-3.sil.org/code/ben) |[bn.answer_question.mbert_bengali_tydiqa_qa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mbert_bengali_tydiqa_qa_bn_3_0.html) |[bert_qa_mbert_bengali_tydiqa_qa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mbert_bengali_tydiqa_qa_bn_3_0.html) |\n", - "|[Castilian, Spanish](https://iso639-3.sil.org/code/spa) |[es.answer_question.distill_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_mrm8488.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_distill_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_mrm8488_es_3_0.html) |[bert_qa_distill_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_mrm8488](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_distill_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_mrm8488_es_3_0.html) |\n", - "|[Castilian, Spanish](https://iso639-3.sil.org/code/spa) |[es.answer_question.beto_base_spanish_sqac.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_beto_base_spanish_sqac_es_3_0.html) |[bert_qa_beto_base_spanish_sqac](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_beto_base_spanish_sqac_es_3_0.html) |\n", - "|[Castilian, Spanish](https://iso639-3.sil.org/code/spa) |[es.answer_question.bert_base_spanish_wwm_cased_finetuned_squad2_es_finetuned_sqac.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_squad2_es_finetuned_sqac_es_3_0.html) |[bert_qa_bert_base_spanish_wwm_cased_finetuned_squad2_es_finetuned_sqac](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_squad2_es_finetuned_sqac_es_3_0.html) |\n", - "|[Castilian, Spanish](https://iso639-3.sil.org/code/spa) |[es.answer_question.bert_base_spanish_wwm_cased_finetuned_squad2_es_MMG.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_base_spanish_wwm_cased_finetuned_squad2_es_MMG_es_3_0.html) |[bert_qa_bert_base_spanish_wwm_cased_finetuned_squad2_es_MMG](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_base_spanish_wwm_cased_finetuned_squad2_es_MMG_es_3_0.html) |\n", - "|[Castilian, Spanish](https://iso639-3.sil.org/code/spa) |[es.answer_question.bert_base_spanish_wwm_cased_finetuned_sqac_finetuned_squad2_es_MMG.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_base_spanish_wwm_cased_finetuned_sqac_finetuned_squad2_es_MMG_es_3_0.html) |[bert_qa_bert_base_spanish_wwm_cased_finetuned_sqac_finetuned_squad2_es_MMG](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_base_spanish_wwm_cased_finetuned_sqac_finetuned_squad2_es_MMG_es_3_0.html) |\n", - "|[Castilian, Spanish](https://iso639-3.sil.org/code/spa) |[es.answer_question.bert_base_spanish_wwm_cased_finetuned_sqac_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_sqac_finetuned_squad_es_3_0.html) |[bert_qa_bert_base_spanish_wwm_cased_finetuned_sqac_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_sqac_finetuned_squad_es_3_0.html) |\n", - "|[Castilian, Spanish](https://iso639-3.sil.org/code/spa) |[es.answer_question.bert_base_spanish_wwm_cased_finetuned_sqac.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_sqac_es_3_0.html) |[bert_qa_bert_base_spanish_wwm_cased_finetuned_sqac](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_sqac_es_3_0.html) |\n", - "|[Castilian, Spanish](https://iso639-3.sil.org/code/spa) |[es.answer_question.bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_mrm8488.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_mrm8488_es_3_0.html) |[bert_qa_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_mrm8488](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_mrm8488_es_3_0.html) |\n", - "|[Castilian, Spanish](https://iso639-3.sil.org/code/spa) |[es.answer_question.bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_finetuned_sqac.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_finetuned_sqac_es_3_0.html) |[bert_qa_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_finetuned_sqac](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_finetuned_sqac_es_3_0.html) |\n", - "|[Danish](https://iso639-3.sil.org/code/dan) |[da.answer_question.danish_bert_botxo_qa_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_danish_bert_botxo_qa_squad_da_3_0.html) |[bert_qa_danish_bert_botxo_qa_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_danish_bert_botxo_qa_squad_da_3_0.html) |\n", - "|[Dutch, Flemish](https://iso639-3.sil.org/code/nld) |[nl.answer_question.bert_base_multilingual_cased_finetuned_dutch_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_dutch_squad2_nl_3_0.html) |[bert_qa_bert_base_multilingual_cased_finetuned_dutch_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_dutch_squad2_nl_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.zero_shot.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_zero_shot_en_3_0.html) |[bert_qa_zero_shot](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_zero_shot_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.youngjae_bert_finetuned_squad_accelerate.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_youngjae_bert_finetuned_squad_accelerate_en_3_0.html) |[bert_qa_youngjae_bert_finetuned_squad_accelerate](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_youngjae_bert_finetuned_squad_accelerate_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.youngjae_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_youngjae_bert_finetuned_squad_en_3_0.html) |[bert_qa_youngjae_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_youngjae_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.ydshieh_bert_base_cased_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_ydshieh_bert_base_cased_squad2_en_3_0.html) |[bert_qa_ydshieh_bert_base_cased_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_ydshieh_bert_base_cased_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xxlargev1_squad2_512.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlargev1_squad2_512_en_3_0.html) |[albert_qa_xxlargev1_squad2_512](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlargev1_squad2_512_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xxlarge_v2_squad2_covid_deepset.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlarge_v2_squad2_covid_deepset_en_3_0.html) |[albert_qa_xxlarge_v2_squad2_covid_deepset](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlarge_v2_squad2_covid_deepset_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xxlarge_v2_squad2.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlarge_v2_squad2_en_3_0.html) |[albert_qa_xxlarge_v2_squad2](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlarge_v2_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xxlarge_v1_finetuned_squad2.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlarge_v1_finetuned_squad2_en_3_0.html) |[albert_qa_xxlarge_v1_finetuned_squad2](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlarge_v1_finetuned_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xxlarge_tweetqa.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlarge_tweetqa_en_3_0.html) |[albert_qa_xxlarge_tweetqa](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlarge_tweetqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xxlarge_finetuned_squad.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlarge_finetuned_squad_en_3_0.html) |[albert_qa_xxlarge_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xxlarge_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xtremedistil_l6_h256_uncased_finetuned_lr_2e_05_epochs_6.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_xtremedistil_l6_h256_uncased_finetuned_lr_2e_05_epochs_6_en_3_0.html) |[bert_qa_xtremedistil_l6_h256_uncased_finetuned_lr_2e_05_epochs_6](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_xtremedistil_l6_h256_uncased_finetuned_lr_2e_05_epochs_6_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xtremedistil_l6_h256_uncased_finetuned_lr_2e_05_epochs_3.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_xtremedistil_l6_h256_uncased_finetuned_lr_2e_05_epochs_3_en_3_0.html) |[bert_qa_xtremedistil_l6_h256_uncased_finetuned_lr_2e_05_epochs_3](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_xtremedistil_l6_h256_uncased_finetuned_lr_2e_05_epochs_3_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xtremedistil_l6_h256_uncased_TQUAD_finetuned_lr_2e_05_epochs_9.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_xtremedistil_l6_h256_uncased_TQUAD_finetuned_lr_2e_05_epochs_9_en_3_0.html) |[bert_qa_xtremedistil_l6_h256_uncased_TQUAD_finetuned_lr_2e_05_epochs_9](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_xtremedistil_l6_h256_uncased_TQUAD_finetuned_lr_2e_05_epochs_9_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xlarge_v2_squad_v2.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xlarge_v2_squad_v2_en_3_0.html) |[albert_qa_xlarge_v2_squad_v2](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xlarge_v2_squad_v2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xlarge_finetuned_squad.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xlarge_finetuned_squad_en_3_0.html) |[albert_qa_xlarge_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xlarge_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xlarge_finetuned.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xlarge_finetuned_en_3_0.html) |[albert_qa_xlarge_finetuned](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_xlarge_finetuned_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.xdistil_l12_h384_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_xdistil_l12_h384_squad2_en_3_0.html) |[bert_qa_xdistil_l12_h384_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_xdistil_l12_h384_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.vumichien_base_v2_squad2.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_vumichien_base_v2_squad2_en_3_0.html) |[albert_qa_vumichien_base_v2_squad2](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_vumichien_base_v2_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.vuiseng9_bert_base_uncased_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_vuiseng9_bert_base_uncased_squad_en_3_0.html) |[bert_qa_vuiseng9_bert_base_uncased_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_vuiseng9_bert_base_uncased_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.victoraavila_bert_base_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_victoraavila_bert_base_uncased_finetuned_squad_en_3_0.html) |[bert_qa_victoraavila_bert_base_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_victoraavila_bert_base_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.unqover_bert_base_uncased_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_unqover_bert_base_uncased_squad_en_3_0.html) |[bert_qa_unqover_bert_base_uncased_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_unqover_bert_base_uncased_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.unqover_bert_base_uncased_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_unqover_bert_base_uncased_newsqa_en_3_0.html) |[bert_qa_unqover_bert_base_uncased_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_unqover_bert_base_uncased_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.twmkn9_bert_base_uncased_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_twmkn9_bert_base_uncased_squad2_en_3_0.html) |[bert_qa_twmkn9_bert_base_uncased_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_twmkn9_bert_base_uncased_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.triviaqa_bert_el_Danastos.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_triviaqa_bert_el_Danastos_en_3_0.html) |[bert_qa_triviaqa_bert_el_Danastos](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_triviaqa_bert_el_Danastos_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.tinybert_6l_768d_squad2_large_teacher_finetuned_step1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tinybert_6l_768d_squad2_large_teacher_finetuned_step1_en_3_0.html) |[bert_qa_tinybert_6l_768d_squad2_large_teacher_finetuned_step1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tinybert_6l_768d_squad2_large_teacher_finetuned_step1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.tinybert_6l_768d_squad2_large_teacher_finetuned.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tinybert_6l_768d_squad2_large_teacher_finetuned_en_3_0.html) |[bert_qa_tinybert_6l_768d_squad2_large_teacher_finetuned](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tinybert_6l_768d_squad2_large_teacher_finetuned_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.tinybert_6l_768d_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tinybert_6l_768d_squad2_en_3_0.html) |[bert_qa_tinybert_6l_768d_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tinybert_6l_768d_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.tf_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tf_bert_finetuned_squad_en_3_0.html) |[bert_qa_tf_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tf_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.tf_bert_base_cased_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tf_bert_base_cased_squad2_en_3_0.html) |[bert_qa_tf_bert_base_cased_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tf_bert_base_cased_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.tests_finetuned_squad_test_bert_2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tests_finetuned_squad_test_bert_2_en_3_0.html) |[bert_qa_tests_finetuned_squad_test_bert_2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tests_finetuned_squad_test_bert_2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.tests_finetuned_squad_test_bert.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tests_finetuned_squad_test_bert_en_3_0.html) |[bert_qa_tests_finetuned_squad_test_bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_tests_finetuned_squad_test_bert_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.srmukundb_bert_base_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_srmukundb_bert_base_uncased_finetuned_squad_en_3_0.html) |[bert_qa_srmukundb_bert_base_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_srmukundb_bert_base_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad_slp.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_squad_slp_en_3_0.html) |[albert_qa_squad_slp](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_squad_slp_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad_ms_bert_base.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_ms_bert_base_en_3_0.html) |[bert_qa_squad_ms_bert_base](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_ms_bert_base_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad_mbert_model_2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_mbert_model_2_en_3_0.html) |[bert_qa_squad_mbert_model_2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_mbert_model_2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad_mbert_model.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_mbert_model_en_3_0.html) |[bert_qa_squad_mbert_model](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_mbert_model_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad_mbert_en_de_es_vi_zh_model.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_mbert_en_de_es_vi_zh_model_en_3_0.html) |[bert_qa_squad_mbert_en_de_es_vi_zh_model](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_mbert_en_de_es_vi_zh_model_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad_mbert_en_de_es_model.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_mbert_en_de_es_model_en_3_0.html) |[bert_qa_squad_mbert_en_de_es_model](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_mbert_en_de_es_model_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad_en_bert_base.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_en_bert_base_en_3_0.html) |[bert_qa_squad_en_bert_base](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_en_bert_base_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad_bert_el_Danastos.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_squad_bert_el_Danastos_en_3_0.html) |[bert_qa_squad_bert_el_Danastos](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_squad_bert_el_Danastos_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad_baseline.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_baseline_en_3_0.html) |[bert_qa_squad_baseline](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad_baseline_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad_2.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_squad_2.0_en_3_0.html) |[albert_qa_squad_2.0](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_squad_2.0_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad2.0_en_3_0.html) |[bert_qa_squad2.0](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad2.0_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.squad1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad1.1_en_3_0.html) |[bert_qa_squad1.1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_squad1.1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_recruit_qa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_recruit_qa_en_3_0.html) |[bert_qa_spanbert_recruit_qa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_recruit_qa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_large_recruit_qa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_large_recruit_qa_en_3_0.html) |[bert_qa_spanbert_large_recruit_qa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_large_recruit_qa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_finetuned_squadv2_en_3_0.html) |[bert_qa_spanbert_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_finetuned_squadv1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_finetuned_squadv1_en_3_0.html) |[bert_qa_spanbert_finetuned_squadv1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_finetuned_squadv1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_6.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_6_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_6](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_6_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_4.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_4_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_4](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_4_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_2_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_10.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_10_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_10](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_10_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_0.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_0_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_0](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_64_finetuned_squad_seed_0_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_8.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_8_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_8](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_8_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_6.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_6_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_6](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_6_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_10.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_10_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_10](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_10_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_0.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_0_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_0](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_512_finetuned_squad_seed_0_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_6.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_6_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_6](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_6_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_2_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_10.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_10_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_10](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_10_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_0.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_0_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_0](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_32_finetuned_squad_seed_0_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_256_finetuned_squad_seed_10.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_256_finetuned_squad_seed_10_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_256_finetuned_squad_seed_10](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_256_finetuned_squad_seed_10_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_16_finetuned_squad_seed_42.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_16_finetuned_squad_seed_42_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_16_finetuned_squad_seed_42](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_16_finetuned_squad_seed_42_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_8.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_8_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_8](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_8_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_6.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_6_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_6](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_6_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_4.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_4_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_4](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_4_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_10.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_10_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_10](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_128_finetuned_squad_seed_10_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_8.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_8_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_8](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_8_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_6.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_6_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_6](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_6_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_42.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_42_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_42](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_42_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_4.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_4_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_4](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_4_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_2_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_10.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_10_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_10](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_10_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_0.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_0_en_3_0.html) |[bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_0](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_spanbert_base_cased_few_shot_k_1024_finetuned_squad_seed_0_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.slp.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_slp_en_3_0.html) |[albert_qa_slp](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_slp_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.scibert_scivocab_uncased_squad_v2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_scibert_scivocab_uncased_squad_v2_en_3_0.html) |[bert_qa_scibert_scivocab_uncased_squad_v2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_scibert_scivocab_uncased_squad_v2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.scibert_scivocab_uncased_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_scibert_scivocab_uncased_squad_en_3_0.html) |[bert_qa_scibert_scivocab_uncased_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_scibert_scivocab_uncased_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.scibert_nli_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_scibert_nli_squad_en_3_0.html) |[bert_qa_scibert_nli_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_scibert_nli_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.sbert_large_nlu_ru_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_sbert_large_nlu_ru_finetuned_squad_en_3_0.html) |[bert_qa_sbert_large_nlu_ru_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_sbert_large_nlu_ru_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.sapbert_from_pubmedbert_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_sapbert_from_pubmedbert_squad2_en_3_0.html) |[bert_qa_sapbert_from_pubmedbert_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_sapbert_from_pubmedbert_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.salti_bert_base_multilingual_cased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_salti_bert_base_multilingual_cased_finetuned_squad_en_3_0.html) |[bert_qa_salti_bert_base_multilingual_cased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_salti_bert_base_multilingual_cased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.sagemaker_BioclinicalBERT_ADR.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_sagemaker_BioclinicalBERT_ADR_en_3_0.html) |[bert_qa_sagemaker_BioclinicalBERT_ADR](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_sagemaker_BioclinicalBERT_ADR_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.results.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_results_en_3_0.html) |[bert_qa_results](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_results_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.question_answering_zh_voidful.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_question_answering_zh_voidful_en_3_0.html) |[bert_qa_question_answering_zh_voidful](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_question_answering_zh_voidful_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.qaconv_bert_large_uncased_whole_word_masking_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_qaconv_bert_large_uncased_whole_word_masking_squad2_en_3_0.html) |[bert_qa_qaconv_bert_large_uncased_whole_word_masking_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_qaconv_bert_large_uncased_whole_word_masking_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.pubmed_bert_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_pubmed_bert_squadv2_en_3_0.html) |[bert_qa_pubmed_bert_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_pubmed_bert_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.prunebert_base_uncased_6_finepruned_w_distil_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_prunebert_base_uncased_6_finepruned_w_distil_squad_en_3_0.html) |[bert_qa_prunebert_base_uncased_6_finepruned_w_distil_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_prunebert_base_uncased_6_finepruned_w_distil_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.peterhsu_bert_finetuned_squad_accelerate.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_peterhsu_bert_finetuned_squad_accelerate_en_3_0.html) |[bert_qa_peterhsu_bert_finetuned_squad_accelerate](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_peterhsu_bert_finetuned_squad_accelerate_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.peterhsu_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_peterhsu_bert_finetuned_squad_en_3_0.html) |[bert_qa_peterhsu_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_peterhsu_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.output_files.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_output_files_en_3_0.html) |[bert_qa_output_files](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_output_files_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.ofirzaf_bert_large_uncased_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_ofirzaf_bert_large_uncased_squad_en_3_0.html) |[bert_qa_ofirzaf_bert_large_uncased_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_ofirzaf_bert_large_uncased_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.nq_bert_el_Danastos.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_nq_bert_el_Danastos_en_3_0.html) |[bert_qa_nq_bert_el_Danastos](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_nq_bert_el_Danastos_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.nolog_SciBert_v2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_nolog_SciBert_v2_en_3_0.html) |[bert_qa_nolog_SciBert_v2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_nolog_SciBert_v2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.no_need_to_name_this.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_no_need_to_name_this_en_3_0.html) |[bert_qa_no_need_to_name_this](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_no_need_to_name_this_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.nlpunibo.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_nlpunibo_en_3_0.html) |[albert_qa_nlpunibo](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_nlpunibo_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.nickmuchi_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_nickmuchi_bert_finetuned_squad_en_3_0.html) |[bert_qa_nickmuchi_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_nickmuchi_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.newsqa_bert_el_Danastos.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_newsqa_bert_el_Danastos_en_3_0.html) |[bert_qa_newsqa_bert_el_Danastos](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_newsqa_bert_el_Danastos_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.news_pretrain_bert_FT_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_news_pretrain_bert_FT_newsqa_en_3_0.html) |[bert_qa_news_pretrain_bert_FT_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_news_pretrain_bert_FT_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.news_pretrain_bert_FT_new_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_news_pretrain_bert_FT_new_newsqa_en_3_0.html) |[bert_qa_news_pretrain_bert_FT_new_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_news_pretrain_bert_FT_new_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.neuralmagic_bert_squad_12layer_0sparse.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_neuralmagic_bert_squad_12layer_0sparse_en_3_0.html) |[bert_qa_neuralmagic_bert_squad_12layer_0sparse](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_neuralmagic_bert_squad_12layer_0sparse_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.muril_large_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_muril_large_squad2_en_3_0.html) |[bert_qa_muril_large_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_muril_large_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.muril_large_cased_hita_qa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_muril_large_cased_hita_qa_en_3_0.html) |[bert_qa_muril_large_cased_hita_qa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_muril_large_cased_hita_qa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.muril_finetuned_squadv1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_muril_finetuned_squadv1_en_3_0.html) |[bert_qa_muril_finetuned_squadv1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_muril_finetuned_squadv1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.muril_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_muril_finetuned_squad_en_3_0.html) |[bert_qa_muril_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_muril_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.multilingual_bert_base_cased_vietnamese.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_vietnamese_en_3_0.html) |[bert_qa_multilingual_bert_base_cased_vietnamese](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_vietnamese_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.multilingual_bert_base_cased_spanish.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_spanish_en_3_0.html) |[bert_qa_multilingual_bert_base_cased_spanish](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_spanish_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.multilingual_bert_base_cased_hindi.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_hindi_en_3_0.html) |[bert_qa_multilingual_bert_base_cased_hindi](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_hindi_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.multilingual_bert_base_cased_german.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_german_en_3_0.html) |[bert_qa_multilingual_bert_base_cased_german](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_german_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.multilingual_bert_base_cased_english.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_english_en_3_0.html) |[bert_qa_multilingual_bert_base_cased_english](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_english_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.multilingual_bert_base_cased_arabic.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_arabic_en_3_0.html) |[bert_qa_multilingual_bert_base_cased_arabic](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_multilingual_bert_base_cased_arabic_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.mrp_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_mrp_bert_finetuned_squad_en_3_0.html) |[bert_qa_mrp_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_mrp_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.mrbalazs5_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_mrbalazs5_bert_finetuned_squad_en_3_0.html) |[bert_qa_mrbalazs5_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_mrbalazs5_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.mqa_unsupsim.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mqa_unsupsim_en_3_0.html) |[bert_qa_mqa_unsupsim](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mqa_unsupsim_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.mqa_sim.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mqa_sim_en_3_0.html) |[bert_qa_mqa_sim](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mqa_sim_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.mqa_cls.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mqa_cls_en_3_0.html) |[bert_qa_mqa_cls](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mqa_cls_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.mqa_baseline.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mqa_baseline_en_3_0.html) |[bert_qa_mqa_baseline](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mqa_baseline_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.model_output.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_model_output_en_3_0.html) |[bert_qa_model_output](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_model_output_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.minilm_uncased_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_minilm_uncased_squad2_en_3_0.html) |[bert_qa_minilm_uncased_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_minilm_uncased_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.mBERT_all_ty_SQen_SQ20_1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mBERT_all_ty_SQen_SQ20_1_en_3_0.html) |[bert_qa_mBERT_all_ty_SQen_SQ20_1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_mBERT_all_ty_SQen_SQ20_1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.linkbert_large_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_linkbert_large_finetuned_squad_en_3_0.html) |[bert_qa_linkbert_large_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_linkbert_large_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.kaporter_bert_base_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_kaporter_bert_base_uncased_finetuned_squad_en_3_0.html) |[bert_qa_kaporter_bert_base_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_kaporter_bert_base_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.kamilali_distilbert_base_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_kamilali_distilbert_base_uncased_finetuned_squad_en_3_0.html) |[bert_qa_kamilali_distilbert_base_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_kamilali_distilbert_base_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.juliusco_distilbert_base_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_juliusco_distilbert_base_uncased_finetuned_squad_en_3_0.html) |[bert_qa_juliusco_distilbert_base_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_juliusco_distilbert_base_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.jimypbr_bert_base_uncased_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_jimypbr_bert_base_uncased_squad_en_3_0.html) |[bert_qa_jimypbr_bert_base_uncased_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_jimypbr_bert_base_uncased_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.jatinshah_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_jatinshah_bert_finetuned_squad_en_3_0.html) |[bert_qa_jatinshah_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_jatinshah_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.ixambert_finetuned_squad_eu_en_MarcBrun.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_ixambert_finetuned_squad_eu_en_MarcBrun_en_3_0.html) |[bert_qa_ixambert_finetuned_squad_eu_en_MarcBrun](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_ixambert_finetuned_squad_eu_en_MarcBrun_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.ixambert_finetuned_squad_eu_MarcBrun.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_ixambert_finetuned_squad_eu_MarcBrun_en_3_0.html) |[bert_qa_ixambert_finetuned_squad_eu_MarcBrun](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_ixambert_finetuned_squad_eu_MarcBrun_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.ixambert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_ixambert_finetuned_squad_en_3_0.html) |[bert_qa_ixambert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_ixambert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.internetoftim_bert_large_uncased_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_internetoftim_bert_large_uncased_squad_en_3_0.html) |[bert_qa_internetoftim_bert_large_uncased_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_internetoftim_bert_large_uncased_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.huggingface_course_bert_finetuned_squad_accelerate.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_huggingface_course_bert_finetuned_squad_accelerate_en_3_0.html) |[bert_qa_huggingface_course_bert_finetuned_squad_accelerate](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_huggingface_course_bert_finetuned_squad_accelerate_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.huggingface_course_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_huggingface_course_bert_finetuned_squad_en_3_0.html) |[bert_qa_huggingface_course_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_huggingface_course_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.howey_bert_large_uncased_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_howey_bert_large_uncased_squad_en_3_0.html) |[bert_qa_howey_bert_large_uncased_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_howey_bert_large_uncased_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.generic.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_generic_en_3_0.html) |[albert_qa_generic](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_generic_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.fpdm_triplet_bert_FT_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_triplet_bert_FT_newsqa_en_3_0.html) |[bert_qa_fpdm_triplet_bert_FT_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_triplet_bert_FT_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.fpdm_triplet_bert_FT_new_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_triplet_bert_FT_new_newsqa_en_3_0.html) |[bert_qa_fpdm_triplet_bert_FT_new_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_triplet_bert_FT_new_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.fpdm_hier_bert_FT_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_hier_bert_FT_newsqa_en_3_0.html) |[bert_qa_fpdm_hier_bert_FT_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_hier_bert_FT_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.fpdm_hier_bert_FT_new_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_hier_bert_FT_new_newsqa_en_3_0.html) |[bert_qa_fpdm_hier_bert_FT_new_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_hier_bert_FT_new_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.fpdm_bert_FT_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_bert_FT_newsqa_en_3_0.html) |[bert_qa_fpdm_bert_FT_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_bert_FT_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.fpdm_bert_FT_new_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_bert_FT_new_newsqa_en_3_0.html) |[bert_qa_fpdm_bert_FT_new_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fpdm_bert_FT_new_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.finetune_bert_base_v3.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_finetune_bert_base_v3_en_3_0.html) |[bert_qa_finetune_bert_base_v3](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_finetune_bert_base_v3_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.finetune_bert_base_v2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_finetune_bert_base_v2_en_3_0.html) |[bert_qa_finetune_bert_base_v2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_finetune_bert_base_v2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.finetune_bert_base_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_finetune_bert_base_v1_en_3_0.html) |[bert_qa_finetune_bert_base_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_finetune_bert_base_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.fine_tuned_tweetqa_aip.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fine_tuned_tweetqa_aip_en_3_0.html) |[bert_qa_fine_tuned_tweetqa_aip](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fine_tuned_tweetqa_aip_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.fine_tuned_squad_aip.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fine_tuned_squad_aip_en_3_0.html) |[bert_qa_fine_tuned_squad_aip](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fine_tuned_squad_aip_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.fewrel_zero_shot.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fewrel_zero_shot_en_3_0.html) |[bert_qa_fewrel_zero_shot](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_fewrel_zero_shot_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.eauction_section_parsing_from_pretrained.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_eauction_section_parsing_from_pretrained_en_3_0.html) |[bert_qa_eauction_section_parsing_from_pretrained](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_eauction_section_parsing_from_pretrained_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.e_cased_qa_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_base_cased_qa_squad2_en_3_0.html) |[bert_base_cased_qa_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_base_cased_qa_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.distilbert_base_uncased_finetuned_custom.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_distilbert_base_uncased_finetuned_custom_en_3_0.html) |[bert_qa_distilbert_base_uncased_finetuned_custom](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_distilbert_base_uncased_finetuned_custom_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.demo.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_demo_en_3_0.html) |[bert_qa_demo](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_demo_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.deepset_bert_base_uncased_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_deepset_bert_base_uncased_squad2_en_3_0.html) |[bert_qa_deepset_bert_base_uncased_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_deepset_bert_base_uncased_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.debug_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_debug_squad_en_3_0.html) |[bert_qa_debug_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_debug_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.datauma_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_datauma_bert_finetuned_squad_en_3_0.html) |[bert_qa_datauma_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_datauma_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.csarron_bert_base_uncased_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_csarron_bert_base_uncased_squad_v1_en_3_0.html) |[bert_qa_csarron_bert_base_uncased_squad_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_csarron_bert_base_uncased_squad_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.cs224n_squad2.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_cs224n_squad2.0_xxlarge_v1_en_3_0.html) |[albert_qa_cs224n_squad2.0_xxlarge_v1](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_cs224n_squad2.0_xxlarge_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.covidbert_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_covidbert_squad_en_3_0.html) |[bert_qa_covidbert_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_covidbert_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.covid_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_covid_squad_en_3_0.html) |[bert_qa_covid_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_covid_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.chemical_bert_uncased_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_chemical_bert_uncased_squad2_en_3_0.html) |[bert_qa_chemical_bert_uncased_squad2](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_chemical_bert_uncased_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.causal_qa.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_causal_qa_en_3_0.html) |[bert_qa_causal_qa](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_causal_qa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.braquad_bert_qna.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_braquad_bert_qna_en_3_0.html) |[bert_qa_braquad_bert_qna](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_braquad_bert_qna_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.biomedical_slot_filling_reader_large.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biomedical_slot_filling_reader_large_en_3_0.html) |[bert_qa_biomedical_slot_filling_reader_large](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biomedical_slot_filling_reader_large_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.biomedical_slot_filling_reader_base.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biomedical_slot_filling_reader_base_en_3_0.html) |[bert_qa_biomedical_slot_filling_reader_base](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biomedical_slot_filling_reader_base_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bioformer_cased_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bioformer_cased_v1.0_squad1_en_3_0.html) |[bert_qa_bioformer_cased_v1.0_squad1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bioformer_cased_v1.0_squad1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.biobert_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biobert_v1.1_pubmed_squad_v2_en_3_0.html) |[bert_qa_biobert_v1.1_pubmed_squad_v2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biobert_v1.1_pubmed_squad_v2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.biobert_squad2_cased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biobert_squad2_cased_finetuned_squad_en_3_0.html) |[bert_qa_biobert_squad2_cased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biobert_squad2_cased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.biobert_squad2_cased.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biobert_squad2_cased_en_3_0.html) |[bert_qa_biobert_squad2_cased](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biobert_squad2_cased_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.biobert_bioasq.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biobert_bioasq_en_3_0.html) |[bert_qa_biobert_bioasq](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biobert_bioasq_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.biobert_base_cased_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biobert_base_cased_v1.1_squad_finetuned_covdrobert_en_3_0.html) |[bert_qa_biobert_base_cased_v1.1_squad_finetuned_covdrobert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_biobert_base_cased_v1.1_squad_finetuned_covdrobert_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bertserini_bert_large_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bertserini_bert_large_squad_en_3_0.html) |[bert_qa_bertserini_bert_large_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bertserini_bert_large_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bertserini_bert_base_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bertserini_bert_base_squad_en_3_0.html) |[bert_qa_bertserini_bert_base_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bertserini_bert_base_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bertimbau_squad1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bertimbau_squad1.1_en_3_0.html) |[bert_qa_bertimbau_squad1.1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bertimbau_squad1.1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_6_H_128_A_2_squad2_covid_qna.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_6_H_128_A_2_squad2_covid_qna_en_3_0.html) |[bert_qa_bert_uncased_L_6_H_128_A_2_squad2_covid_qna](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_6_H_128_A_2_squad2_covid_qna_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_6_H_128_A_2_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_6_H_128_A_2_squad2_en_3_0.html) |[bert_qa_bert_uncased_L_6_H_128_A_2_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_6_H_128_A_2_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_768_A_12_squad2_covid_qna.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_768_A_12_squad2_covid_qna_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_768_A_12_squad2_covid_qna](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_768_A_12_squad2_covid_qna_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_768_A_12_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_768_A_12_squad2_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_768_A_12_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_768_A_12_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_768_A_12_cord19_200616_squad2_covid_qna.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_768_A_12_cord19_200616_squad2_covid_qna_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_768_A_12_cord19_200616_squad2_covid_qna](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_768_A_12_cord19_200616_squad2_covid_qna_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_768_A_12_cord19_200616_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_768_A_12_cord19_200616_squad2_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_768_A_12_cord19_200616_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_768_A_12_cord19_200616_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_512_A_8_squad2_covid_qna.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_512_A_8_squad2_covid_qna_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_512_A_8_squad2_covid_qna](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_512_A_8_squad2_covid_qna_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_512_A_8_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_512_A_8_squad2_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_512_A_8_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_512_A_8_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_512_A_8_cord19_200616_squad2_covid_qna.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_512_A_8_cord19_200616_squad2_covid_qna_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_512_A_8_cord19_200616_squad2_covid_qna](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_512_A_8_cord19_200616_squad2_covid_qna_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_512_A_8_cord19_200616_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_512_A_8_cord19_200616_squad2_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_512_A_8_cord19_200616_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_512_A_8_cord19_200616_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_256_A_4_squad2_covid_qna.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_256_A_4_squad2_covid_qna_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_256_A_4_squad2_covid_qna](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_256_A_4_squad2_covid_qna_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_256_A_4_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_256_A_4_squad2_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_256_A_4_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_256_A_4_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_256_A_4_cord19_200616_squad2_covid_qna.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_256_A_4_cord19_200616_squad2_covid_qna_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_256_A_4_cord19_200616_squad2_covid_qna](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_256_A_4_cord19_200616_squad2_covid_qna_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_4_H_256_A_4_cord19_200616_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_256_A_4_cord19_200616_squad2_en_3_0.html) |[bert_qa_bert_uncased_L_4_H_256_A_4_cord19_200616_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_4_H_256_A_4_cord19_200616_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_2_H_512_A_8_squad2_covid_qna.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_2_H_512_A_8_squad2_covid_qna_en_3_0.html) |[bert_qa_bert_uncased_L_2_H_512_A_8_squad2_covid_qna](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_2_H_512_A_8_squad2_covid_qna_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_2_H_512_A_8_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_2_H_512_A_8_squad2_en_3_0.html) |[bert_qa_bert_uncased_L_2_H_512_A_8_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_2_H_512_A_8_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_2_H_512_A_8_cord19_200616_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_2_H_512_A_8_cord19_200616_squad2_en_3_0.html) |[bert_qa_bert_uncased_L_2_H_512_A_8_cord19_200616_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_2_H_512_A_8_cord19_200616_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_10_H_512_A_8_squad2_covid_qna.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_10_H_512_A_8_squad2_covid_qna_en_3_0.html) |[bert_qa_bert_uncased_L_10_H_512_A_8_squad2_covid_qna](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_10_H_512_A_8_squad2_covid_qna_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_10_H_512_A_8_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_10_H_512_A_8_squad2_en_3_0.html) |[bert_qa_bert_uncased_L_10_H_512_A_8_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_10_H_512_A_8_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_10_H_512_A_8_cord19_200616_squad2_covid_qna.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_10_H_512_A_8_cord19_200616_squad2_covid_qna_en_3_0.html) |[bert_qa_bert_uncased_L_10_H_512_A_8_cord19_200616_squad2_covid_qna](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_10_H_512_A_8_cord19_200616_squad2_covid_qna_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_uncased_L_10_H_512_A_8_cord19_200616_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_10_H_512_A_8_cord19_200616_squad2_en_3_0.html) |[bert_qa_bert_uncased_L_10_H_512_A_8_cord19_200616_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_uncased_L_10_H_512_A_8_cord19_200616_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_tiny_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_finetuned_squadv2_en_3_0.html) |[bert_qa_bert_tiny_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_tiny_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_finetuned_squad_en_3_0.html) |[bert_qa_bert_tiny_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_tiny_5_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_5_finetuned_squadv2_en_3_0.html) |[bert_qa_bert_tiny_5_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_5_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_tiny_4_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_4_finetuned_squadv2_en_3_0.html) |[bert_qa_bert_tiny_4_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_4_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_tiny_3_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_3_finetuned_squadv2_en_3_0.html) |[bert_qa_bert_tiny_3_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_3_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_tiny_2_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_2_finetuned_squadv2_en_3_0.html) |[bert_qa_bert_tiny_2_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_tiny_2_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_small_wrslb_finetuned_squadv1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_wrslb_finetuned_squadv1_en_3_0.html) |[bert_qa_bert_small_wrslb_finetuned_squadv1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_wrslb_finetuned_squadv1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_small_pretrained_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_pretrained_finetuned_squad_en_3_0.html) |[bert_qa_bert_small_pretrained_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_pretrained_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_small_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_finetuned_squadv2_en_3_0.html) |[bert_qa_bert_small_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_small_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_finetuned_squad_en_3_0.html) |[bert_qa_bert_small_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_small_cord19qa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_cord19qa_en_3_0.html) |[bert_qa_bert_small_cord19qa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_cord19qa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_small_cord19_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_cord19_squad2_en_3_0.html) |[bert_qa_bert_small_cord19_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_cord19_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_small_2_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_2_finetuned_squadv2_en_3_0.html) |[bert_qa_bert_small_2_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_small_2_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_set_date_1_lr_2e_5_bs_32_ep_4.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_set_date_1_lr_2e_5_bs_32_ep_4_en_3_0.html) |[bert_qa_bert_set_date_1_lr_2e_5_bs_32_ep_4](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_set_date_1_lr_2e_5_bs_32_ep_4_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_reader_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_reader_squad2_en_3_0.html) |[bert_qa_bert_reader_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_reader_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_qasper.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_qasper_en_3_0.html) |[bert_qa_bert_qasper](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_qasper_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_qa_vi_nvkha.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_qa_vi_nvkha_en_3_0.html) |[bert_qa_bert_qa_vi_nvkha](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_qa_vi_nvkha_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_multi_uncased_finetuned_chaii.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_uncased_finetuned_chaii_en_3_0.html) |[bert_qa_bert_multi_uncased_finetuned_chaii](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_uncased_finetuned_chaii_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_multi_cased_squad_sv_marbogusz.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_multi_cased_squad_sv_marbogusz_en_3_0.html) |[bert_qa_bert_multi_cased_squad_sv_marbogusz](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_multi_cased_squad_sv_marbogusz_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_multi_cased_finetuned_xquadv1_finetuned_squad_colab.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_cased_finetuned_xquadv1_finetuned_squad_colab_en_3_0.html) |[bert_qa_bert_multi_cased_finetuned_xquadv1_finetuned_squad_colab](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_cased_finetuned_xquadv1_finetuned_squad_colab_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_multi_cased_finetuned_chaii.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_cased_finetuned_chaii_en_3_0.html) |[bert_qa_bert_multi_cased_finetuned_chaii](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_cased_finetuned_chaii_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_multi_cased_finedtuned_xquad_chaii.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_cased_finedtuned_xquad_chaii_en_3_0.html) |[bert_qa_bert_multi_cased_finedtuned_xquad_chaii](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_cased_finedtuned_xquad_chaii_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_mini_wrslb_finetuned_squadv1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_mini_wrslb_finetuned_squadv1_en_3_0.html) |[bert_qa_bert_mini_wrslb_finetuned_squadv1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_mini_wrslb_finetuned_squadv1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_mini_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_mini_finetuned_squadv2_en_3_0.html) |[bert_qa_bert_mini_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_mini_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_mini_5_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_mini_5_finetuned_squadv2_en_3_0.html) |[bert_qa_bert_mini_5_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_mini_5_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_medium_wrslb_finetuned_squadv1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_medium_wrslb_finetuned_squadv1_en_3_0.html) |[bert_qa_bert_medium_wrslb_finetuned_squadv1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_medium_wrslb_finetuned_squadv1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_medium_squad2_distilled.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_medium_squad2_distilled_en_3_0.html) |[bert_qa_bert_medium_squad2_distilled](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_medium_squad2_distilled_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_medium_pretrained_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_medium_pretrained_finetuned_squad_en_3_0.html) |[bert_qa_bert_medium_pretrained_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_medium_pretrained_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_medium_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_medium_finetuned_squadv2_en_3_0.html) |[bert_qa_bert_medium_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_medium_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_medium_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_medium_finetuned_squad_en_3_0.html) |[bert_qa_bert_medium_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_medium_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_wwm_squadv2_x2.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_wwm_squadv2_x2.15_f83.2_d25_hybrid_v1_en_3_0.html) |[bert_qa_bert_large_uncased_wwm_squadv2_x2.15_f83.2_d25_hybrid_v1](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_wwm_squadv2_x2.15_f83.2_d25_hybrid_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_whole_word_masking_squad2_with_ner_mit_restaurant_with_neg_with_repeat.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_mit_restaurant_with_neg_with_repeat_en_3_0.html) |[bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_mit_restaurant_with_neg_with_repeat](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_mit_restaurant_with_neg_with_repeat_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_whole_word_masking_squad2_with_ner_mit_movie_with_neg_with_repeat.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_mit_movie_with_neg_with_repeat_en_3_0.html) |[bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_mit_movie_with_neg_with_repeat](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_mit_movie_with_neg_with_repeat_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_whole_word_masking_squad2_with_ner_conll2003_with_neg_with_repeat.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_conll2003_with_neg_with_repeat_en_3_0.html) |[bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_conll2003_with_neg_with_repeat](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_conll2003_with_neg_with_repeat_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_whole_word_masking_squad2_with_ner_Pwhatisthe_conll2003_with_neg_with_repeat.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_Pwhatisthe_conll2003_with_neg_with_repeat_en_3_0.html) |[bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_Pwhatisthe_conll2003_with_neg_with_repeat](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_Pwhatisthe_conll2003_with_neg_with_repeat_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_whole_word_masking_squad2_with_ner_Pistherea_conll2003_with_neg_with_repeat.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_Pistherea_conll2003_with_neg_with_repeat_en_3_0.html) |[bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_Pistherea_conll2003_with_neg_with_repeat](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_with_ner_Pistherea_conll2003_with_neg_with_repeat_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_whole_word_masking_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_en_3_0.html) |[bert_qa_bert_large_uncased_whole_word_masking_squad2](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_whole_word_masking_finetuned_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_finetuned_squadv2_en_3_0.html) |[bert_qa_bert_large_uncased_whole_word_masking_finetuned_squadv2](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_finetuned_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_whole_word_masking_finetuned_squad_finetuned_islamic_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_finetuned_squad_finetuned_islamic_squad_en_3_0.html) |[bert_qa_bert_large_uncased_whole_word_masking_finetuned_squad_finetuned_islamic_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_finetuned_squad_finetuned_islamic_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_whole_word_masking_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_finetuned_squad_en_3_0.html) |[bert_qa_bert_large_uncased_whole_word_masking_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_whole_word_masking_finetuned_chaii.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_finetuned_chaii_en_3_0.html) |[bert_qa_bert_large_uncased_whole_word_masking_finetuned_chaii](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_finetuned_chaii_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_whole_word_masking_chaii.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_chaii_en_3_0.html) |[bert_qa_bert_large_uncased_whole_word_masking_chaii](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_whole_word_masking_chaii_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_squadv2.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_squadv2_en_3_0.html) |[bert_qa_bert_large_uncased_squadv2](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_squadv2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_squadv1.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_squadv1.1_sparse_90_unstructured_en_3_0.html) |[bert_qa_bert_large_uncased_squadv1.1_sparse_90_unstructured](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_squadv1.1_sparse_90_unstructured_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_squad2_covid_qa_deepset.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_squad2_covid_qa_deepset_en_3_0.html) |[bert_qa_bert_large_uncased_squad2_covid_qa_deepset](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_squad2_covid_qa_deepset_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_uncased_finetuned_docvqa.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_finetuned_docvqa_en_3_0.html) |[bert_qa_bert_large_uncased_finetuned_docvqa](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_uncased_finetuned_docvqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_question_answering_finetuned_legal.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_question_answering_finetuned_legal_en_3_0.html) |[bert_qa_bert_large_question_answering_finetuned_legal](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_question_answering_finetuned_legal_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_finetuned_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_finetuned_squad2_en_3_0.html) |[bert_qa_bert_large_finetuned_squad2](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_finetuned_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_finetuned.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_finetuned_en_3_0.html) |[bert_qa_bert_large_finetuned](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_finetuned_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_faquad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_large_faquad_en_3_0.html) |[bert_qa_bert_large_faquad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_large_faquad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_large_cased_whole_word_masking_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_cased_whole_word_masking_finetuned_squad_en_3_0.html) |[bert_qa_bert_large_cased_whole_word_masking_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_cased_whole_word_masking_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_l_squadv1.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_l_squadv1.1_sl384_en_3_0.html) |[bert_qa_bert_l_squadv1.1_sl384](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_l_squadv1.1_sl384_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_finetuned_squad_pytorch.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_squad_pytorch_en_3_0.html) |[bert_qa_bert_finetuned_squad_pytorch](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_squad_pytorch_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_finetuned_squad_accelerate_10epoch_transformerfrozen.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_squad_accelerate_10epoch_transformerfrozen_en_3_0.html) |[bert_qa_bert_finetuned_squad_accelerate_10epoch_transformerfrozen](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_squad_accelerate_10epoch_transformerfrozen_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_finetuned_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_squad2_en_3_0.html) |[bert_qa_bert_finetuned_squad2](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_finetuned_squad1.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_squad1_en_3_0.html) |[bert_qa_bert_finetuned_squad1](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_squad1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_finetuned_qa.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_qa_en_3_0.html) |[bert_qa_bert_finetuned_qa](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_qa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_finetuned_lr2_e5_b16_ep2.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_lr2_e5_b16_ep2_en_3_0.html) |[bert_qa_bert_finetuned_lr2_e5_b16_ep2](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_lr2_e5_b16_ep2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_finetuned_jackh1995.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_jackh1995_en_3_0.html) |[bert_qa_bert_finetuned_jackh1995](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_finetuned_jackh1995_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_fa_QA_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_fa_QA_v1_en_3_0.html) |[bert_qa_bert_fa_QA_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_fa_QA_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_squadv1_x2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squadv1_x2.44_f87.7_d26_hybrid_filled_v1_en_3_0.html) |[bert_qa_bert_base_uncased_squadv1_x2.44_f87.7_d26_hybrid_filled_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squadv1_x2.44_f87.7_d26_hybrid_filled_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_squadv1_x1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squadv1_x1.96_f88.3_d27_hybrid_filled_opt_v1_en_3_0.html) |[bert_qa_bert_base_uncased_squadv1_x1.96_f88.3_d27_hybrid_filled_opt_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squadv1_x1.96_f88.3_d27_hybrid_filled_opt_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_squadv1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squadv1.1_sparse_80_1x4_block_pruneofa_en_3_0.html) |[bert_qa_bert_base_uncased_squadv1.1_sparse_80_1x4_block_pruneofa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squadv1.1_sparse_80_1x4_block_pruneofa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_squad_v1_sparse0.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squad_v1_sparse0.25_en_3_0.html) |[bert_qa_bert_base_uncased_squad_v1_sparse0.25](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squad_v1_sparse0.25_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_squad_L6.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squad_L6_en_3_0.html) |[bert_qa_bert_base_uncased_squad_L6](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squad_L6_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_squad_L3.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squad_L3_en_3_0.html) |[bert_qa_bert_base_uncased_squad_L3](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squad_L3_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_squad2_covid_qa_deepset.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squad2_covid_qa_deepset_en_3_0.html) |[bert_qa_bert_base_uncased_squad2_covid_qa_deepset](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squad2_covid_qa_deepset_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_squad1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squad1.1_pruned_x3.2_v2_en_3_0.html) |[bert_qa_bert_base_uncased_squad1.1_pruned_x3.2_v2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_squad1.1_pruned_x3.2_v2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_qa_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_qa_squad2_en_3_0.html) |[bert_qa_bert_base_uncased_qa_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_qa_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_fiqa_flm_sq_flit.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_fiqa_flm_sq_flit_en_3_0.html) |[bert_qa_bert_base_uncased_fiqa_flm_sq_flit](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_fiqa_flm_sq_flit_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_finetuned_vi_infovqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_vi_infovqa_en_3_0.html) |[bert_qa_bert_base_uncased_finetuned_vi_infovqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_vi_infovqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_finetuned_squad_v2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_squad_v2_en_3_0.html) |[bert_qa_bert_base_uncased_finetuned_squad_v2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_squad_v2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_finetuned_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_squad_v1_en_3_0.html) |[bert_qa_bert_base_uncased_finetuned_squad_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_squad_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_finetuned_squad_frozen_v2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_squad_frozen_v2_en_3_0.html) |[bert_qa_bert_base_uncased_finetuned_squad_frozen_v2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_squad_frozen_v2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_finetuned_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_newsqa_en_3_0.html) |[bert_qa_bert_base_uncased_finetuned_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_finetuned_infovqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_infovqa_en_3_0.html) |[bert_qa_bert_base_uncased_finetuned_infovqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_infovqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_finetuned_duorc_bert.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_duorc_bert_en_3_0.html) |[bert_qa_bert_base_uncased_finetuned_duorc_bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_duorc_bert_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_finetuned_docvqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_docvqa_en_3_0.html) |[bert_qa_bert_base_uncased_finetuned_docvqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_finetuned_docvqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_few_shot_k_64_finetuned_squad_seed_0.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_64_finetuned_squad_seed_0_en_3_0.html) |[bert_qa_bert_base_uncased_few_shot_k_64_finetuned_squad_seed_0](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_64_finetuned_squad_seed_0_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_few_shot_k_512_finetuned_squad_seed_0.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_512_finetuned_squad_seed_0_en_3_0.html) |[bert_qa_bert_base_uncased_few_shot_k_512_finetuned_squad_seed_0](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_512_finetuned_squad_seed_0_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_few_shot_k_32_finetuned_squad_seed_0.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_32_finetuned_squad_seed_0_en_3_0.html) |[bert_qa_bert_base_uncased_few_shot_k_32_finetuned_squad_seed_0](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_32_finetuned_squad_seed_0_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_few_shot_k_256_finetuned_squad_seed_0.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_256_finetuned_squad_seed_0_en_3_0.html) |[bert_qa_bert_base_uncased_few_shot_k_256_finetuned_squad_seed_0](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_256_finetuned_squad_seed_0_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_few_shot_k_16_finetuned_squad_seed_42.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_16_finetuned_squad_seed_42_en_3_0.html) |[bert_qa_bert_base_uncased_few_shot_k_16_finetuned_squad_seed_42](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_16_finetuned_squad_seed_42_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_few_shot_k_128_finetuned_squad_seed_0.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_128_finetuned_squad_seed_0_en_3_0.html) |[bert_qa_bert_base_uncased_few_shot_k_128_finetuned_squad_seed_0](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_128_finetuned_squad_seed_0_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_few_shot_k_1024_finetuned_squad_seed_42.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_1024_finetuned_squad_seed_42_en_3_0.html) |[bert_qa_bert_base_uncased_few_shot_k_1024_finetuned_squad_seed_42](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_few_shot_k_1024_finetuned_squad_seed_42_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_uncased_coqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_coqa_en_3_0.html) |[bert_qa_bert_base_uncased_coqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_uncased_coqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_turkish_cased_finetuned_lr_2e_05_epochs_3.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_turkish_cased_finetuned_lr_2e_05_epochs_3_en_3_0.html) |[bert_qa_bert_base_turkish_cased_finetuned_lr_2e_05_epochs_3](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_turkish_cased_finetuned_lr_2e_05_epochs_3_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_swedish_cased_squad_experimental.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_swedish_cased_squad_experimental_en_3_0.html) |[bert_qa_bert_base_swedish_cased_squad_experimental](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_swedish_cased_squad_experimental_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_squadv1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_squadv1_en_3_0.html) |[bert_qa_bert_base_squadv1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_squadv1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_spanish_wwm_uncased_finetuned_qa_tar.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_uncased_finetuned_qa_tar_en_3_0.html) |[bert_qa_bert_base_spanish_wwm_uncased_finetuned_qa_tar](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_uncased_finetuned_qa_tar_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_spanish_wwm_uncased_finetuned_qa_sqac.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_uncased_finetuned_qa_sqac_en_3_0.html) |[bert_qa_bert_base_spanish_wwm_uncased_finetuned_qa_sqac](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_uncased_finetuned_qa_sqac_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_spanish_wwm_uncased_finetuned_qa_mlqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_uncased_finetuned_qa_mlqa_en_3_0.html) |[bert_qa_bert_base_spanish_wwm_uncased_finetuned_qa_mlqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_uncased_finetuned_qa_mlqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_spanish_wwm_cased_finetuned_qa_tar.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_qa_tar_en_3_0.html) |[bert_qa_bert_base_spanish_wwm_cased_finetuned_qa_tar](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_qa_tar_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_spanish_wwm_cased_finetuned_qa_sqac.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_qa_sqac_en_3_0.html) |[bert_qa_bert_base_spanish_wwm_cased_finetuned_qa_sqac](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_qa_sqac_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_spanish_wwm_cased_finetuned_qa_mlqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_qa_mlqa_en_3_0.html) |[bert_qa_bert_base_spanish_wwm_cased_finetuned_qa_mlqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_spanish_wwm_cased_finetuned_qa_mlqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_multilingual_xquad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_xquad_en_3_0.html) |[bert_qa_bert_base_multilingual_xquad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_xquad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_multilingual_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_uncased_finetuned_squad_en_3_0.html) |[bert_qa_bert_base_multilingual_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_multilingual_cased_korquad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_korquad_v1_en_3_0.html) |[bert_qa_bert_base_multilingual_cased_korquad_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_korquad_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_multilingual_cased_korquad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_korquad_en_3_0.html) |[bert_qa_bert_base_multilingual_cased_korquad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_korquad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_multilingual_cased_finetuned_squadv1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_squadv1_en_3_0.html) |[bert_qa_bert_base_multilingual_cased_finetuned_squadv1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_squadv1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_multilingual_cased_finetuned_klue.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_klue_en_3_0.html) |[bert_qa_bert_base_multilingual_cased_finetuned_klue](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_klue_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_multilingual_cased_finetuned_chaii.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_chaii_en_3_0.html) |[bert_qa_bert_base_multilingual_cased_finetuned_chaii](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_chaii_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_finetuned_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_finetuned_squad2_en_3_0.html) |[bert_qa_bert_base_finetuned_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_finetuned_squad2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_faquad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_faquad_en_3_0.html) |[bert_qa_bert_base_faquad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_faquad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_cased_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_cased_squad_v1_en_3_0.html) |[bert_qa_bert_base_cased_squad_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_cased_squad_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_cased_finetuned_squad_test.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_cased_finetuned_squad_test_en_3_0.html) |[bert_qa_bert_base_cased_finetuned_squad_test](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_cased_finetuned_squad_test_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_cased_chaii.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_cased_chaii_en_3_0.html) |[bert_qa_bert_base_cased_chaii](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_cased_chaii_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_cased_IUChatbot_ontologyDts.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_cased_IUChatbot_ontologyDts_en_3_0.html) |[bert_qa_bert_base_cased_IUChatbot_ontologyDts](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_cased_IUChatbot_ontologyDts_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_512_full_trivia.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_512_full_trivia_en_3_0.html) |[bert_qa_bert_base_512_full_trivia](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_512_full_trivia_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_4096_full_trivia_copied_embeddings.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_4096_full_trivia_copied_embeddings_en_3_0.html) |[bert_qa_bert_base_4096_full_trivia_copied_embeddings](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_4096_full_trivia_copied_embeddings_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_2048_full_trivia_copied_embeddings.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_2048_full_trivia_copied_embeddings_en_3_0.html) |[bert_qa_bert_base_2048_full_trivia_copied_embeddings](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_2048_full_trivia_copied_embeddings_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_base_1024_full_trivia_copied_embeddings.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_1024_full_trivia_copied_embeddings_en_3_0.html) |[bert_qa_bert_base_1024_full_trivia_copied_embeddings](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_1024_full_trivia_copied_embeddings_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_all_translated.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_all_translated_en_3_0.html) |[bert_qa_bert_all_translated](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_all_translated_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_all_squad_que_translated.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_all_squad_que_translated_en_3_0.html) |[bert_qa_bert_all_squad_que_translated](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_all_squad_que_translated_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_all_squad_ben_tel_context.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_all_squad_ben_tel_context_en_3_0.html) |[bert_qa_bert_all_squad_ben_tel_context](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_all_squad_ben_tel_context_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_all_squad_all_translated.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_all_squad_all_translated_en_3_0.html) |[bert_qa_bert_all_squad_all_translated](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_all_squad_all_translated_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_all.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_all_en_3_0.html) |[bert_qa_bert_all](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_all_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_FT_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_FT_newsqa_en_3_0.html) |[bert_qa_bert_FT_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_FT_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert_FT_new_newsqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_FT_new_newsqa_en_3_0.html) |[bert_qa_bert_FT_new_newsqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_FT_new_newsqa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bert.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_en_3_0.html) |[bert_qa_bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.bdickson_bert_base_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bdickson_bert_base_uncased_finetuned_squad_en_3_0.html) |[bert_qa_bdickson_bert_base_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bdickson_bert_base_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.batteryscibert_uncased_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batteryscibert_uncased_squad_v1_en_3_0.html) |[bert_qa_batteryscibert_uncased_squad_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batteryscibert_uncased_squad_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.batteryscibert_cased_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batteryscibert_cased_squad_v1_en_3_0.html) |[bert_qa_batteryscibert_cased_squad_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batteryscibert_cased_squad_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.batteryonlybert_uncased_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batteryonlybert_uncased_squad_v1_en_3_0.html) |[bert_qa_batteryonlybert_uncased_squad_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batteryonlybert_uncased_squad_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.batteryonlybert_cased_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batteryonlybert_cased_squad_v1_en_3_0.html) |[bert_qa_batteryonlybert_cased_squad_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batteryonlybert_cased_squad_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.batterydata_bert_base_uncased_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batterydata_bert_base_uncased_squad_v1_en_3_0.html) |[bert_qa_batterydata_bert_base_uncased_squad_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batterydata_bert_base_uncased_squad_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.batterybert_uncased_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batterybert_uncased_squad_v1_en_3_0.html) |[bert_qa_batterybert_uncased_squad_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batterybert_uncased_squad_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.batterybert_cased_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batterybert_cased_squad_v1_en_3_0.html) |[bert_qa_batterybert_cased_squad_v1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_batterybert_cased_squad_v1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.base_v2_squad.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_base_v2_squad_en_3_0.html) |[albert_qa_base_v2_squad](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_base_v2_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.augmented_Squad_Translated.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_augmented_Squad_Translated_en_3_0.html) |[bert_qa_augmented_Squad_Translated](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_augmented_Squad_Translated_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.augmented.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_augmented_en_3_0.html) |[bert_qa_augmented](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_augmented_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.araSpeedest.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_araSpeedest_en_3_0.html) |[bert_qa_araSpeedest](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_araSpeedest_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.ankitkupadhyay_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_ankitkupadhyay_bert_finetuned_squad_en_3_0.html) |[bert_qa_ankitkupadhyay_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_ankitkupadhyay_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.andresestevez_bert_finetuned_squad_accelerate.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_andresestevez_bert_finetuned_squad_accelerate_en_3_0.html) |[bert_qa_andresestevez_bert_finetuned_squad_accelerate](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_andresestevez_bert_finetuned_squad_accelerate_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.andresestevez_bert_base_cased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_andresestevez_bert_base_cased_finetuned_squad_en_3_0.html) |[bert_qa_andresestevez_bert_base_cased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_andresestevez_bert_base_cased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.ai_club_inductions_21_nlp.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_ai_club_inductions_21_nlp_en_3_0.html) |[albert_qa_ai_club_inductions_21_nlp](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_ai_club_inductions_21_nlp_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Trial_3_Results.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Trial_3_Results_en_3_0.html) |[bert_qa_Trial_3_Results](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Trial_3_Results_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Tianle_bert_base_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Tianle_bert_base_uncased_finetuned_squad_en_3_0.html) |[bert_qa_Tianle_bert_base_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Tianle_bert_base_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.SupriyaArun_bert_base_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_SupriyaArun_bert_base_uncased_finetuned_squad_en_3_0.html) |[bert_qa_SupriyaArun_bert_base_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_SupriyaArun_bert_base_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.SreyanG_NVIDIA_bert_base_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_SreyanG_NVIDIA_bert_base_uncased_finetuned_squad_en_3_0.html) |[bert_qa_SreyanG_NVIDIA_bert_base_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_SreyanG_NVIDIA_bert_base_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.SreyanG_NVIDIA_bert_base_cased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_SreyanG_NVIDIA_bert_base_cased_finetuned_squad_en_3_0.html) |[bert_qa_SreyanG_NVIDIA_bert_base_cased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_SreyanG_NVIDIA_bert_base_cased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Spanbert_emotion_extraction.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Spanbert_emotion_extraction_en_3_0.html) |[bert_qa_Spanbert_emotion_extraction](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Spanbert_emotion_extraction_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Sotireas_BiomedNLP_PubMedBERT_base_uncased_abstract_fulltext_ContaminationQAmodel_PubmedBERT.bert](https://nlp.johnsnowlabs.com) |[bert_qa_Sotireas_BiomedNLP_PubMedBERT_base_uncased_abstract_fulltext_ContaminationQAmodel_PubmedBERT](https://nlp.johnsnowlabs.com) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Shushant_BiomedNLP_PubMedBERT_base_uncased_abstract_fulltext_ContaminationQAmodel_PubmedBERT.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Shushant_BiomedNLP_PubMedBERT_base_uncased_abstract_fulltext_ContaminationQAmodel_PubmedBERT_en_3_0.html) |[bert_qa_Shushant_BiomedNLP_PubMedBERT_base_uncased_abstract_fulltext_ContaminationQAmodel_PubmedBERT](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Shushant_BiomedNLP_PubMedBERT_base_uncased_abstract_fulltext_ContaminationQAmodel_PubmedBERT_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Seongkyu_bert_base_cased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Seongkyu_bert_base_cased_finetuned_squad_en_3_0.html) |[bert_qa_Seongkyu_bert_base_cased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Seongkyu_bert_base_cased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.SciBERT_SQuAD_QuAC.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_SciBERT_SQuAD_QuAC_en_3_0.html) |[bert_qa_SciBERT_SQuAD_QuAC](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_SciBERT_SQuAD_QuAC_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.QA_1e.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_QA_1e_en_3_0.html) |[albert_qa_QA_1e](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_QA_1e_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.PruebaBert.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_PruebaBert_en_3_0.html) |[bert_qa_PruebaBert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_PruebaBert_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Paul_Vinh_bert_base_multilingual_cased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Paul_Vinh_bert_base_multilingual_cased_finetuned_squad_en_3_0.html) |[bert_qa_Paul_Vinh_bert_base_multilingual_cased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Paul_Vinh_bert_base_multilingual_cased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Part_2_mBERT_Model_E2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Part_2_mBERT_Model_E2_en_3_0.html) |[bert_qa_Part_2_mBERT_Model_E2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Part_2_mBERT_Model_E2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Part_2_BERT_Multilingual_Dutch_Model_E1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Part_2_BERT_Multilingual_Dutch_Model_E1_en_3_0.html) |[bert_qa_Part_2_BERT_Multilingual_Dutch_Model_E1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Part_2_BERT_Multilingual_Dutch_Model_E1_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Part_1_mBERT_Model_E2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Part_1_mBERT_Model_E2_en_3_0.html) |[bert_qa_Part_1_mBERT_Model_E2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Part_1_mBERT_Model_E2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Neulvo_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_Neulvo_bert_finetuned_squad_en_3_0.html) |[bert_qa_Neulvo_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_Neulvo_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Multi_ling_BERT.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Multi_ling_BERT_en_3_0.html) |[bert_qa_Multi_ling_BERT](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Multi_ling_BERT_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.MiniLM_L12_H384_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_MiniLM_L12_H384_uncased_finetuned_squad_en_3_0.html) |[bert_qa_MiniLM_L12_H384_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_MiniLM_L12_H384_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.ManuERT_for_xqua.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_ManuERT_for_xqua_en_3_0.html) |[bert_qa_ManuERT_for_xqua](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_ManuERT_for_xqua_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.MTL_bert_base_uncased_ww_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_MTL_bert_base_uncased_ww_squad_en_3_0.html) |[bert_qa_MTL_bert_base_uncased_ww_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_MTL_bert_base_uncased_ww_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Laikokwei_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_Laikokwei_bert_finetuned_squad_en_3_0.html) |[bert_qa_Laikokwei_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_Laikokwei_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Klue_CommonSense_model.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Klue_CommonSense_model_en_3_0.html) |[bert_qa_Klue_CommonSense_model](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Klue_CommonSense_model_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.KevinChoi_bert_finetuned_squad_accelerate.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_KevinChoi_bert_finetuned_squad_accelerate_en_3_0.html) |[bert_qa_KevinChoi_bert_finetuned_squad_accelerate](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_KevinChoi_bert_finetuned_squad_accelerate_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.KevinChoi_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_KevinChoi_bert_finetuned_squad_en_3_0.html) |[bert_qa_KevinChoi_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_KevinChoi_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.HomayounSadri_bert_base_uncased_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_HomayounSadri_bert_base_uncased_finetuned_squad_en_3_0.html) |[bert_qa_HomayounSadri_bert_base_uncased_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_HomayounSadri_bert_base_uncased_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Harsit_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_Harsit_bert_finetuned_squad_en_3_0.html) |[bert_qa_Harsit_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_Harsit_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Graphcore_bert_large_uncased_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_Graphcore_bert_large_uncased_squad_en_3_0.html) |[bert_qa_Graphcore_bert_large_uncased_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_Graphcore_bert_large_uncased_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.FardinSaboori_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_FardinSaboori_bert_finetuned_squad_en_3_0.html) |[bert_qa_FardinSaboori_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_FardinSaboori_bert_finetuned_squad_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.COVID_BERTc.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_COVID_BERTc_en_3_0.html) |[bert_qa_COVID_BERTc](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_COVID_BERTc_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.COVID_BERTb.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_COVID_BERTb_en_3_0.html) |[bert_qa_COVID_BERTb](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_COVID_BERTb_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.COVID_BERTa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_COVID_BERTa_en_3_0.html) |[bert_qa_COVID_BERTa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_COVID_BERTa_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.BioM_xxlarge_SQuAD2.albert](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_BioM_xxlarge_SQuAD2_en_3_0.html) |[albert_qa_BioM_xxlarge_SQuAD2](https://nlp.johnsnowlabs.com/2022/06/24/albert_qa_BioM_xxlarge_SQuAD2_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Bertv1_fine.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Bertv1_fine_en_3_0.html) |[bert_qa_Bertv1_fine](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Bertv1_fine_en_3_0.html) |\n", - "|[English](https://iso639-3.sil.org/code/eng) |[en.answer_question.Alexander_Learn_bert_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_Alexander_Learn_bert_finetuned_squad_en_3_0.html) |[bert_qa_Alexander_Learn_bert_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_Alexander_Learn_bert_finetuned_squad_en_3_0.html) |\n", - "|[German](https://iso639-3.sil.org/code/deu) |[de.answer_question.bert_multi_english_german_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_english_german_squad2_de_3_0.html) |[bert_qa_bert_multi_english_german_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_english_german_squad2_de_3_0.html) |\n", - "|[German](https://iso639-3.sil.org/code/deu) |[de.answer_question.GBERTQnA.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_GBERTQnA_de_3_0.html) |[bert_qa_GBERTQnA](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_GBERTQnA_de_3_0.html) |\n", - "|[Hebrew](https://iso639-3.sil.org/code/heb) |[he.answer_question.hebert_finetuned_hebrew_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_hebert_finetuned_hebrew_squad_he_3_0.html) |[bert_qa_hebert_finetuned_hebrew_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_hebert_finetuned_hebrew_squad_he_3_0.html) |\n", - "|[Hungarian](https://iso639-3.sil.org/code/hun) |[hu.answer_question.huBert_fine_tuned_hungarian_squadv1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_huBert_fine_tuned_hungarian_squadv1_hu_3_0.html) |[bert_qa_huBert_fine_tuned_hungarian_squadv1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_huBert_fine_tuned_hungarian_squadv1_hu_3_0.html) |\n", - "|[Indonesian](https://iso639-3.sil.org/code/ind) |[id.answer_question.Indobert_QA.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Indobert_QA_id_3_0.html) |[bert_qa_Indobert_QA](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Indobert_QA_id_3_0.html) |\n", - "|[Italian](https://iso639-3.sil.org/code/ita) |[it.answer_question.squad_xxl_cased_hub1.bert](https://nlp.johnsnowlabs.com/2022/06/28/bert_qa_squad_xxl_cased_hub1_it_3_0.html) |[bert_qa_squad_xxl_cased_hub1](https://nlp.johnsnowlabs.com/2022/06/28/bert_qa_squad_xxl_cased_hub1_it_3_0.html) |\n", - "|[Italian](https://iso639-3.sil.org/code/ita) |[it.answer_question.bert_italian_finedtuned_squadv1_it_alfa.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_italian_finedtuned_squadv1_it_alfa_it_3_0.html) |[bert_qa_bert_italian_finedtuned_squadv1_it_alfa](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_italian_finedtuned_squadv1_it_alfa_it_3_0.html) |\n", - "|[Italian](https://iso639-3.sil.org/code/ita) |[it.answer_question.bert_base_italian_uncased_squad_it_antoniocappiello.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_base_italian_uncased_squad_it_antoniocappiello_it_3_0.html) |[bert_qa_bert_base_italian_uncased_squad_it_antoniocappiello](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_base_italian_uncased_squad_it_antoniocappiello_it_3_0.html) |\n", - "|[Japanese](https://iso639-3.sil.org/code/jpn) |[ja.answer_question.large_japanese_wikipedia_ud_head.bert](https://nlp.johnsnowlabs.com/2022/06/28/bert_qa_large_japanese_wikipedia_ud_head_ja_3_0.html) |[bert_qa_large_japanese_wikipedia_ud_head](https://nlp.johnsnowlabs.com/2022/06/28/bert_qa_large_japanese_wikipedia_ud_head_ja_3_0.html) |\n", - "|[Japanese](https://iso639-3.sil.org/code/jpn) |[ja.answer_question.base_japanese_wikipedia_ud_head.bert](https://nlp.johnsnowlabs.com/2022/06/28/bert_qa_base_japanese_wikipedia_ud_head_ja_3_0.html) |[bert_qa_base_japanese_wikipedia_ud_head](https://nlp.johnsnowlabs.com/2022/06/28/bert_qa_base_japanese_wikipedia_ud_head_ja_3_0.html) |\n", - "|[Korean](https://iso639-3.sil.org/code/kor) |[ko.answer_question.klue_bert_base_aihub_mrc.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_klue_bert_base_aihub_mrc_ko_3_0.html) |[bert_qa_klue_bert_base_aihub_mrc](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_klue_bert_base_aihub_mrc_ko_3_0.html) |\n", - "|[Korean](https://iso639-3.sil.org/code/kor) |[ko.answer_question.bespin_global_klue_bert_base_mrc.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bespin_global_klue_bert_base_mrc_ko_3_0.html) |[bert_qa_bespin_global_klue_bert_base_mrc](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bespin_global_klue_bert_base_mrc_ko_3_0.html) |\n", - "|[Korean](https://iso639-3.sil.org/code/kor) |[ko.answer_question.ainize_klue_bert_base_mrc.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_ainize_klue_bert_base_mrc_ko_3_0.html) |[bert_qa_ainize_klue_bert_base_mrc](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_ainize_klue_bert_base_mrc_ko_3_0.html) |\n", - "|[Modern Greek (1453-)](https://iso639-3.sil.org/code/ell) |[el.answer_question.qacombination_bert_el_Danastos.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_qacombination_bert_el_Danastos_el_3_0.html) |[bert_qa_qacombination_bert_el_Danastos](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_qacombination_bert_el_Danastos_el_3_0.html) |\n", - "|[Polish](https://iso639-3.sil.org/code/pol) |[pl.answer_question.bert_base_multilingual_cased_finetuned_polish_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_polish_squad2_pl_3_0.html) |[bert_qa_bert_base_multilingual_cased_finetuned_polish_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_polish_squad2_pl_3_0.html) |\n", - "|[Polish](https://iso639-3.sil.org/code/pol) |[pl.answer_question.bert_base_multilingual_cased_finetuned_polish_squad1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_polish_squad1_pl_3_0.html) |[bert_qa_bert_base_multilingual_cased_finetuned_polish_squad1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetuned_polish_squad1_pl_3_0.html) |\n", - "|[Portuguese](https://iso639-3.sil.org/code/por) |[pt.answer_question.bioBERTpt_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bioBERTpt_squad_v1.1_portuguese_pt_3_0.html) |[bert_qa_bioBERTpt_squad_v1.1_portuguese](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bioBERTpt_squad_v1.1_portuguese_pt_3_0.html) |\n", - "|[Portuguese](https://iso639-3.sil.org/code/por) |[pt.answer_question.bert_large_cased_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_cased_squad_v1.1_portuguese_pt_3_0.html) |[bert_qa_bert_large_cased_squad_v1.1_portuguese](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_bert_large_cased_squad_v1.1_portuguese_pt_3_0.html) |\n", - "|[Portuguese](https://iso639-3.sil.org/code/por) |[pt.answer_question.bert_base_portuguese_cased_finetuned_squad_v1_pt_mrm8488.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_base_portuguese_cased_finetuned_squad_v1_pt_mrm8488_pt_3_0.html) |[bert_qa_bert_base_portuguese_cased_finetuned_squad_v1_pt_mrm8488](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_base_portuguese_cased_finetuned_squad_v1_pt_mrm8488_pt_3_0.html) |\n", - "|[Portuguese](https://iso639-3.sil.org/code/por) |[pt.answer_question.bert_base_cased_squad_v1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_cased_squad_v1.1_portuguese_pt_3_0.html) |[bert_qa_bert_base_cased_squad_v1.1_portuguese](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_cased_squad_v1.1_portuguese_pt_3_0.html) |\n", - "|[Sinhala, Sinhalese](https://iso639-3.sil.org/code/sin) |[si.answer_question.bert_base_sinhala_qa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_sinhala_qa_si_3_0.html) |[bert_qa_bert_base_sinhala_qa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_sinhala_qa_si_3_0.html) |\n", - "|[Swedish](https://iso639-3.sil.org/code/swe) |[sv.answer_question.bert_base_swedish_squad2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_swedish_squad2_sv_3_0.html) |[bert_qa_bert_base_swedish_squad2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_swedish_squad2_sv_3_0.html) |\n", - "|[Thai](https://iso639-3.sil.org/code/tha) |[th.answer_question.xquad_th_mbert_base.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_xquad_th_mbert_base_th_3_0.html) |[bert_qa_xquad_th_mbert_base](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_xquad_th_mbert_base_th_3_0.html) |\n", - "|[Thai](https://iso639-3.sil.org/code/tha) |[th.answer_question.thai_bert_multi_cased_finetuned_xquadv1_finetuned_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_thai_bert_multi_cased_finetuned_xquadv1_finetuned_squad_th_3_0.html) |[bert_qa_thai_bert_multi_cased_finetuned_xquadv1_finetuned_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_thai_bert_multi_cased_finetuned_xquadv1_finetuned_squad_th_3_0.html) |\n", - "|[Thai](https://iso639-3.sil.org/code/tha) |[th.answer_question.bert_base_multilingual_cased_finetune_qa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetune_qa_th_3_0.html) |[bert_qa_bert_base_multilingual_cased_finetune_qa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_multilingual_cased_finetune_qa_th_3_0.html) |\n", - "|[Turkish](https://iso639-3.sil.org/code/tur) |[tr.answer_question.loodos_bert_base_uncased_QA_fine_tuned.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_loodos_bert_base_uncased_QA_fine_tuned_tr_3_0.html) |[bert_qa_loodos_bert_base_uncased_QA_fine_tuned](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_loodos_bert_base_uncased_QA_fine_tuned_tr_3_0.html) |\n", - "|[Turkish](https://iso639-3.sil.org/code/tur) |[tr.answer_question.logo_qna_model.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_logo_qna_model_tr_3_0.html) |[bert_qa_logo_qna_model](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_logo_qna_model_tr_3_0.html) |\n", - "|[Turkish](https://iso639-3.sil.org/code/tur) |[tr.answer_question.distilbert_tr_q_a.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_distilbert_tr_q_a_tr_3_0.html) |[bert_qa_distilbert_tr_q_a](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_distilbert_tr_q_a_tr_3_0.html) |\n", - "|[Turkish](https://iso639-3.sil.org/code/tur) |[tr.answer_question.bert_turkish_question_answering.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_turkish_question_answering_tr_3_0.html) |[bert_qa_bert_turkish_question_answering](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_turkish_question_answering_tr_3_0.html) |\n", - "|[Turkish](https://iso639-3.sil.org/code/tur) |[tr.answer_question.bert_base_turkish_squad.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_turkish_squad_tr_3_0.html) |[bert_qa_bert_base_turkish_squad](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_turkish_squad_tr_3_0.html) |\n", - "|[Arabic](https://iso639-3.sil.org/code/ara) |[ar.answer_question.arap_qa_bert_v2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_arap_qa_bert_v2_ar_3_0.html) |[bert_qa_arap_qa_bert_v2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_arap_qa_bert_v2_ar_3_0.html) |\n", - "|[Arabic](https://iso639-3.sil.org/code/ara) |[ar.answer_question.arap_qa_bert_large_v2.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_arap_qa_bert_large_v2_ar_3_0.html) |[bert_qa_arap_qa_bert_large_v2](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_arap_qa_bert_large_v2_ar_3_0.html) |\n", - "|[Arabic](https://iso639-3.sil.org/code/ara) |[ar.answer_question.arap_qa_bert.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_arap_qa_bert_ar_3_0.html) |[bert_qa_arap_qa_bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_arap_qa_bert_ar_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.roberta_base_chinese_extractive_qa_scratch.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_roberta_base_chinese_extractive_qa_scratch_zh_3_0.html) |[bert_qa_roberta_base_chinese_extractive_qa_scratch](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_roberta_base_chinese_extractive_qa_scratch_zh_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.roberta_base_chinese_extractive_qa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_roberta_base_chinese_extractive_qa_zh_3_0.html) |[bert_qa_roberta_base_chinese_extractive_qa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_roberta_base_chinese_extractive_qa_zh_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.question_answering_chinese.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_question_answering_chinese_zh_3_0.html) |[bert_qa_question_answering_chinese](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_question_answering_chinese_zh_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.qa_roberta_base_chinese_extractive.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_qa_roberta_base_chinese_extractive_zh_3_0.html) |[bert_qa_qa_roberta_base_chinese_extractive](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_qa_roberta_base_chinese_extractive_zh_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.multilingual_bert_base_cased_chinese.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_multilingual_bert_base_cased_chinese_zh_3_0.html) |[bert_qa_multilingual_bert_base_cased_chinese](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_multilingual_bert_base_cased_chinese_zh_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.chinese_pretrain_mrc_roberta_wwm_ext_large.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_chinese_pretrain_mrc_roberta_wwm_ext_large_zh_3_0.html) |[bert_qa_chinese_pretrain_mrc_roberta_wwm_ext_large](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_chinese_pretrain_mrc_roberta_wwm_ext_large_zh_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.chinese_pretrain_mrc_macbert_large.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_chinese_pretrain_mrc_macbert_large_zh_3_0.html) |[bert_qa_chinese_pretrain_mrc_macbert_large](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_chinese_pretrain_mrc_macbert_large_zh_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.chinese_pert_large_open_domain_mrc.bert](https://nlp.johnsnowlabs.com/2022/06/28/bert_qa_chinese_pert_large_open_domain_mrc_zh_3_0.html) |[bert_qa_chinese_pert_large_open_domain_mrc](https://nlp.johnsnowlabs.com/2022/06/28/bert_qa_chinese_pert_large_open_domain_mrc_zh_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.chinese_pert_large_mrc.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_chinese_pert_large_mrc_zh_3_0.html) |[bert_qa_chinese_pert_large_mrc](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_chinese_pert_large_mrc_zh_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.chinese_pert_base_mrc.bert](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_chinese_pert_base_mrc_zh_3_0.html) |[bert_qa_chinese_pert_base_mrc](https://nlp.johnsnowlabs.com/2022/06/06/bert_qa_chinese_pert_base_mrc_zh_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.bert_chinese_finetuned.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_chinese_finetuned_zh_3_0.html) |[bert_qa_bert_chinese_finetuned](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_chinese_finetuned_zh_3_0.html) |\n", - "|[Chinese](https://iso639-3.sil.org/code/zho) |[zh.answer_question.bert_base_chinese_finetuned_squad_colab.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_chinese_finetuned_squad_colab_zh_3_0.html) |[bert_qa_bert_base_chinese_finetuned_squad_colab](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_chinese_finetuned_squad_colab_zh_3_0.html) |\n", - "|[Persian](https://iso639-3.sil.org/code/fas) |[fa.answer_question.bert_base_fa_qa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_fa_qa_fa_3_0.html) |[bert_qa_bert_base_fa_qa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_base_fa_qa_fa_3_0.html) |\n", - "| Multilingual |[xx.answer_question.telugu_bertu_tydiqa.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_telugu_bertu_tydiqa_xx_3_0.html) |[bert_qa_telugu_bertu_tydiqa](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_telugu_bertu_tydiqa_xx_3_0.html) |\n", - "| Multilingual |[xx.answer_question.bert_multi_uncased_finetuned_xquadv1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_uncased_finetuned_xquadv1_xx_3_0.html) |[bert_qa_bert_multi_uncased_finetuned_xquadv1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_uncased_finetuned_xquadv1_xx_3_0.html) |\n", - "| Multilingual |[xx.answer_question.bert_multi_cased_finetuned_xquadv1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_cased_finetuned_xquadv1_xx_3_0.html) |[bert_qa_bert_multi_cased_finetuned_xquadv1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_bert_multi_cased_finetuned_xquadv1_xx_3_0.html) |\n", - "| Multilingual |[xx.answer_question.bert_multi_cased_finedtuned_xquad_tydiqa_goldp.bert](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_multi_cased_finedtuned_xquad_tydiqa_goldp_xx_3_0.html) |[bert_qa_bert_multi_cased_finedtuned_xquad_tydiqa_goldp](https://nlp.johnsnowlabs.com/2022/06/03/bert_qa_bert_multi_cased_finedtuned_xquad_tydiqa_goldp_xx_3_0.html) |\n", - "| Multilingual |[xx.answer_question.Part_1_mBERT_Model_E1.bert](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Part_1_mBERT_Model_E1_xx_3_0.html) |[bert_qa_Part_1_mBERT_Model_E1](https://nlp.johnsnowlabs.com/2022/06/02/bert_qa_Part_1_mBERT_Model_E1_xx_3_0.html) |" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4E8ChFP8nMmN" - }, - "source": [ - "### RoBertaForQuestionAnswering" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 38551, - "status": "ok", - "timestamp": 1664910292214, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "MtJPvinzl8Lz", - "outputId": "b0aef501-6d1e-47e4-f012-75350e4ab5e1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "roberta_qa_roberta_base_squad2_covid download started this may take some time.\n", - "Approximate size to download 442.8 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "document_assembler = MultiDocumentAssembler() \\\n", - " .setInputCols([\"question\", \"context\"]) \\\n", - " .setOutputCols([\"document_question\", \"document_context\"])\n", - "\n", - "spanClassifier = RoBertaForQuestionAnswering.pretrained(\"roberta_qa_roberta_base_squad2_covid\",\"en\") \\\n", - " .setInputCols([\"document_question\", \"document_context\"]) \\\n", - " .setOutputCol(\"answer\") \\\n", - " .setCaseSensitive(True)\n", - "\n", - "pipeline = Pipeline().setStages([document_assembler,\n", - " spanClassifier])\n", - "\n", - "data = spark.createDataFrame([[\"Do I have Covid?\", \"I have a fever and a cough and for the past few days, I have lost my sense of smell and taste. Later I was diagnosed with Covid.\"]]).toDF(\"question\", \"context\")\n", - "\n", - "result = pipeline.fit(data).transform(data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 3691, - "status": "ok", - "timestamp": 1664910329759, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "xeDpxyghjJVI", - "outputId": "20ee4a92-06bb-481d-825a-6a16b21dcb3c" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------------------------------+\n", - "|result |\n", - "+----------------------------------+\n", - "|[Later I was diagnosed with Covid]|\n", - "+----------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "result.select('answer.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "DpDBHMaQn0iW" - }, - "source": [ - "### AlbertForQuestionAnswering" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 50871, - "status": "ok", - "timestamp": 1664910383594, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "w4wnfbn8n3_5", - "outputId": "0e0ab7fd-421f-438d-a997-e0a20ee42791" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "albert_qa_xxlargev1_squad2_512 download started this may take some time.\n", - "Approximate size to download 736.4 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documentAssembler = MultiDocumentAssembler() \\\n", - " .setInputCols([\"question\", \"context\"]) \\\n", - " .setOutputCols([\"document_question\", \"document_context\"])\n", - "\n", - "spanClassifier = AlbertForQuestionAnswering.pretrained(\"albert_qa_xxlargev1_squad2_512\",\"en\") \\\n", - " .setInputCols([\"document_question\", \"document_context\"]) \\\n", - " .setOutputCol(\"answer\")\\\n", - " .setCaseSensitive(True)\n", - " \n", - "pipeline = Pipeline(stages=[documentAssembler, \n", - " spanClassifier])\n", - "\n", - "data = spark.createDataFrame([[\"Which name is also used to describe the Amazon rainforest in English?\",\"\"\"The Amazon rainforest (Portuguese: Floresta Amazônica or Amazônia; Spanish: Selva Amazónica, Amazonía or usually Amazonia; French: Forêt amazonienne; Dutch: Amazoneregenwoud), also known in English as Amazonia or the Amazon Jungle, is a moist broadleaf forest that covers most of the Amazon basin of South America. This basin encompasses 7,000,000 square kilometres (2,700,000 sq mi), of which 5,500,000 square kilometres (2,100,000 sq mi) are covered by the rainforest. This region includes territory belonging to nine nations. The majority of the forest is contained within Brazil, with 60% of the rainforest, followed by Peru with 13%, Colombia with 10%, and with minor amounts in Venezuela, Ecuador, Bolivia, Guyana, Suriname and French Guiana. States or departments in four nations contain \"Amazonas\" in their names. The Amazon represents over half of the planet's remaining rainforests, and comprises the largest and most biodiverse tract of tropical rainforest in the world, with an estimated 390 billion individual trees divided into 16,000 species.\"\"\"]]).toDF(\"question\", \"context\")\n", - "\n", - "result = pipeline.fit(data).transform(data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 17483, - "status": "ok", - "timestamp": 1664910401062, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "10ClpPGaoERB", - "outputId": "aba3f9ae-6290-47c6-ba05-25b66d8199bd" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------+\n", - "|result |\n", - "+-----------------+\n", - "|[theAmazonJungle]|\n", - "+-----------------+\n", - "\n" - ] - } - ], - "source": [ - "result.select('answer.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "rnWnzgUUXJsZ" - }, - "source": [ - "### BertForQuestionAnswering" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 30954, - "status": "ok", - "timestamp": 1664910431991, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "9fQvPY4JXJsa", - "outputId": "d6e1fcca-6050-4922-e704-f6ecba95ef71" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bert_qa_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_mrm8488 download started this may take some time.\n", - "Approximate size to download 391 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "document_assembler = MultiDocumentAssembler() \\\n", - " .setInputCols([\"question\", \"context\"]) \\\n", - " .setOutputCols([\"document_question\", \"document_context\"])\n", - "\n", - "spanClassifier = BertForQuestionAnswering.pretrained(\"bert_qa_bert_base_spanish_wwm_cased_finetuned_spa_squad2_es_mrm8488\",\"es\") \\\n", - " .setInputCols([\"document_question\", \"document_context\"]) \\\n", - " .setOutputCol(\"answer\") \\\n", - " .setCaseSensitive(True)\n", - "\n", - "\n", - "pipeline = Pipeline().setStages([document_assembler,\n", - " spanClassifier])\n", - "\n", - "# Question in Spanish: How many people speak Spanish?\n", - "# Context in Spanish: Spanish is the second most spoken language in the world with more than 442 million speakers\n", - "\n", - "example = spark.createDataFrame([[\"¿Cuántas personas hablan español?\", \"El español es el segundo idioma más hablado del mundo con más de 442 millones de hablantes\"]]).toDF(\"question\", \"context\")\n", - "\n", - "result = pipeline.fit(example).transform(example)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 2208, - "status": "ok", - "timestamp": 1664910434167, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Kgxml8bBXJsa", - "outputId": "ae9ebf5d-35f6-4031-da8f-230e2d930b91" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------+\n", - "|result |\n", - "+--------------+\n", - "|[442 millones]|\n", - "+--------------+\n", - "\n" - ] - } - ], - "source": [ - "result.select('answer.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "_kVOZDI3aK6V" - }, - "source": [ - "### DebertaForQuestionAnswering" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 19986, - "status": "ok", - "timestamp": 1664910553398, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "p3_R4F3iaK6W", - "outputId": "0ae9cbb7-13bc-4c0c-f88a-ff9215e227da" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "deberta_v3_xsmall_qa_squad2 download started this may take some time.\n", - "Approximate size to download 240.6 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documentAssembler = MultiDocumentAssembler() \\\n", - " .setInputCols([\"question\", \"context\"]) \\\n", - " .setOutputCols([\"document_question\", \"document_context\"])\n", - "\n", - "spanClassifier = DeBertaForQuestionAnswering .pretrained(\"deberta_v3_xsmall_qa_squad2\",\"en\") \\\n", - " .setInputCols([\"document_question\", \"document_context\"]) \\\n", - " .setOutputCol(\"answer\")\\\n", - " .setCaseSensitive(True)\n", - " \n", - "pipeline = Pipeline(stages=[documentAssembler, \n", - " spanClassifier])\n", - "\n", - "data = spark.createDataFrame([[\"What is my name?\", \"My name is Clara and I live in Berkeley.\"]]).toDF(\"question\", \"context\")\n", - "\n", - "result = pipeline.fit(data).transform(data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 7865, - "status": "ok", - "timestamp": 1664910561256, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "u28_2t-haK6W", - "outputId": "bc945e1e-d670-4c98-9387-851218a49f33" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-------+\n", - "|result |\n", - "+-------+\n", - "|[Clara]|\n", - "+-------+\n", - "\n" - ] - } - ], - "source": [ - "result.select('answer.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ZA1DFJXEavFV" - }, - "source": [ - "### DistilBertForQuestionAnswering" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 20860, - "status": "ok", - "timestamp": 1664910582104, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "omf7L7L4avFV", - "outputId": "51e0742c-4704-4be8-adf2-1dab46771695" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "distilbert_base_cased_qa_squad2 download started this may take some time.\n", - "Approximate size to download 232.8 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documentAssembler = MultiDocumentAssembler() \\\n", - " .setInputCols([\"question\", \"context\"]) \\\n", - " .setOutputCols([\"document_question\", \"document_context\"])\n", - "\n", - "spanClassifier = DistilBertForQuestionAnswering.pretrained(\"distilbert_base_cased_qa_squad2\",\"en\") \\\n", - " .setInputCols([\"document_question\", \"document_context\"]) \\\n", - " .setOutputCol(\"answer\")\\\n", - " .setCaseSensitive(True)\n", - " \n", - "pipeline = Pipeline(stages=[documentAssembler, \n", - " spanClassifier])\n", - "\n", - "data = spark.createDataFrame([[\"Where do I live?\", \"My name is Wolfgang and I live in Berlin\"]]).toDF(\"question\", \"context\")\n", - "\n", - "result = pipeline.fit(data).transform(data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1867, - "status": "ok", - "timestamp": 1664910583965, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "2YHTKHKYavFW", - "outputId": "1eb08447-1183-41ef-bce6-9eecf532ba55" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------+\n", - "|result |\n", - "+--------+\n", - "|[Berlin]|\n", - "+--------+\n", - "\n" - ] - } - ], - "source": [ - "result.select('answer.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "74686exgbfs9" - }, - "source": [ - "### LongformerForQuestionAnswering " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 130747, - "status": "ok", - "timestamp": 1664911424053, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "-XkL2N8Gbfs9", - "outputId": "e2da50e7-5a48-4ada-e182-0a2604bfd81b" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "longformer_qa_large_4096_finetuned_triviaqa download started this may take some time.\n", - "Approximate size to download 1.5 GB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documentAssembler = MultiDocumentAssembler() \\\n", - " .setInputCols([\"question\", \"context\"]) \\\n", - " .setOutputCols([\"document_question\", \"document_context\"])\n", - "\n", - "spanClassifier = LongformerForQuestionAnswering.pretrained(\"longformer_qa_large_4096_finetuned_triviaqa\",\"en\") \\\n", - " .setInputCols([\"document_question\", \"document_context\"]) \\\n", - " .setOutputCol(\"answer\")\\\n", - " .setCaseSensitive(True)\n", - "\n", - "pipeline = Pipeline(stages=[documentAssembler, \n", - " spanClassifier])\n", - "\n", - "data = spark.createDataFrame([[\"Where did Super Bowl 50 take place?\", \"\"\"Super Bowl 50 was an American football game to determine the champion of the National Football League (NFL) for the 2015 season. \n", - "The American Football Conference (AFC) champion Denver Broncos defeated the National Football Conference (NFC) champion Carolina Panthers 24–10 to earn their third Super Bowl title. \n", - "The game was played on February 7, 2016, at Levi's Stadium in the San Francisco Bay Area at Santa Clara, California.\n", - "As this was the 50th Super Bowl, the league emphasized the \"golden anniversary\" with various gold-themed initiatives,\n", - "as well as temporarily suspending the tradition of naming each Super Bowl game with Roman numerals (under which the game would have been known as \"Super Bowl L\"),\n", - "so that the logo could prominently feature the Arabic numerals 50.\"\"\"]]).toDF(\"question\", \"context\")\n", - "\n", - "result = pipeline.fit(data).transform(data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 53939, - "status": "ok", - "timestamp": 1664911477978, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "oImAnppEbfs9", - "outputId": "e1d3d2b0-c76e-4ef8-c383-3563d2b21df1" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------------+\n", - "|result |\n", - "+-----------------+\n", - "|[Levi 's Stadium]|\n", - "+-----------------+\n", - "\n" - ] - } - ], - "source": [ - "result.select('answer.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Bl65Z_EcdCbE" - }, - "source": [ - "### XlmRoBertaForQuestionAnswering \n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 63421, - "status": "ok", - "timestamp": 1664911541369, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "a7Xscel0dCbF", - "outputId": "88940ef5-6fa1-40be-ad7d-7aaf238dc2bb" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "xlm_roberta_base_qa_squad2 download started this may take some time.\n", - "Approximate size to download 834.5 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documentAssembler = MultiDocumentAssembler() \\\n", - " .setInputCols([\"question\", \"context\"]) \\\n", - " .setOutputCols([\"document_question\", \"document_context\"])\n", - "\n", - "spanClassifier = XlmRoBertaForQuestionAnswering.pretrained(\"xlm_roberta_base_qa_squad2\",\"en\") \\\n", - " .setInputCols([\"document_question\", \"document_context\"]) \\\n", - " .setOutputCol(\"answer\")\\\n", - " .setCaseSensitive(True)\n", - " \n", - "pipeline = Pipeline(stages=[documentAssembler, \n", - " spanClassifier])\n", - "\n", - "data = spark.createDataFrame([[\"What year was the Carolina Panthers franchise founded?\", \"\"\"The Panthers finished the regular season with a 15–1 record, and quarterback Cam Newton was named the NFL Most Valuable Player (MVP).\n", - "They defeated the Arizona Cardinals 49–15 in the NFC Championship Game and advanced to their second Super Bowl appearance since the franchise was founded in 1995.\n", - "The Broncos finished the regular season with a 12–4 record, and denied the New England Patriots a chance to defend their title from Super Bowl XLIX by defeating them 20–18 in the AFC Championship Game.\n", - "They joined the Patriots, Dallas Cowboys, and Pittsburgh Steelers as one of four teams that have made eight appearances in the Super Bowl.\"\"\"]]).toDF(\"question\", \"context\")\n", - "\n", - "result = pipeline.fit(data).transform(data)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 3809, - "status": "ok", - "timestamp": 1664911545151, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "0C5wCJt9dCbF", - "outputId": "b6e54ca4-d993-4131-c72d-b49ae2d671f8" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-------+\n", - "|result |\n", - "+-------+\n", - "|[1995.]|\n", - "+-------+\n", - "\n" - ] - } - ], - "source": [ - "result.select('answer.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ZpYgGOEgjayA" - }, - "source": [ - "## NERDL Model" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "CHq-SZJgkttM" - }, - "source": [ - "![image.png](data:image/png;base64,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)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "71rZVJit4HAb" - }, - "source": [ - "### Public NER (CoNLL 2003)\n", - "\n", - "

Named-Entity recognition is a well-known technique in information extraction it is also known as entity identificationentity chunking and entity extraction. Knowing the relevant tags for each article help in automatically categorizing the articles in defined hierarchies and enable smooth content discovery. " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "j7Qr_dVL4LDZ" - }, - "source": [ - "Entities\n", - "\n", - "``` PERSON, LOCATION, ORGANIZATION, MISC ```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 5964, - "status": "ok", - "timestamp": 1664911551077, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "fR6faruZfKFb", - "outputId": "64c70264-04ce-4c71-b46b-e924c5445253" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ner_dl download started this may take some time.\n", - "Approximate size to download 13.6 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "public_ner = NerDLModel.pretrained(\"ner_dl\", 'en') \\\n", - " .setInputCols([\"document\", \"token\", \"embeddings\"]) \\\n", - " .setOutputCol(\"ner\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 43, - "status": "ok", - "timestamp": 1664911551078, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Yaf2zNA9JfZF", - "outputId": "5384db93-343f-44d7-f43f-97ec602117a7" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{Param(parent='NerDLModel_d4424c9af5f4', name='includeAllConfidenceScores', doc='whether to include all confidence scores in annotation metadata or just the score of the predicted tag'): False,\n", - " Param(parent='NerDLModel_d4424c9af5f4', name='lazyAnnotator', doc='Whether this AnnotatorModel acts as lazy in RecursivePipelines'): False,\n", - " Param(parent='NerDLModel_d4424c9af5f4', name='includeConfidence', doc='whether to include confidence scores in annotation metadata'): False,\n", - " Param(parent='NerDLModel_d4424c9af5f4', name='batchSize', doc='Size of every batch'): 32,\n", - " Param(parent='NerDLModel_d4424c9af5f4', name='classes', doc='get the tags used to trained this NerDLModel'): ['O',\n", - " 'B-ORG',\n", - " 'B-LOC',\n", - " 'B-PER',\n", - " 'I-PER',\n", - " 'I-ORG',\n", - " 'B-MISC',\n", - " 'I-LOC',\n", - " 'I-MISC'],\n", - " Param(parent='NerDLModel_d4424c9af5f4', name='inputCols', doc='previous annotations columns, if renamed'): ['document',\n", - " 'token',\n", - " 'embeddings'],\n", - " Param(parent='NerDLModel_d4424c9af5f4', name='outputCol', doc='output annotation column. can be left default.'): 'ner',\n", - " Param(parent='NerDLModel_d4424c9af5f4', name='storageRef', doc='unique reference name for identification'): 'glove_100d'}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "public_ner.extractParamMap()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 33, - "status": "ok", - "timestamp": 1664911551078, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "HzAZjzMGJ0x5", - "outputId": "91a459d7-a1de-46f4-f199-d8a8ffe9f0a1" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['O', 'B-ORG', 'B-LOC', 'B-PER', 'I-PER', 'I-ORG', 'B-MISC', 'I-LOC', 'I-MISC']" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "public_ner.getClasses()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 3888, - "status": "ok", - "timestamp": 1664911653088, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "w-Li0LMw1rFS", - "outputId": "2b1073de-7cee-4ff1-e2a5-fa9eb9f78338" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "glove_100d download started this may take some time.\n", - "Approximate size to download 145.3 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "# ner_dl model is trained with glove_100d. So we use the same embeddings in the pipeline\n", - "glove_embeddings = WordEmbeddingsModel.pretrained('glove_100d').\\\n", - " setInputCols([\"document\", 'token']).\\\n", - " setOutputCol(\"embeddings\")\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " glove_embeddings,\n", - " public_ner])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1977, - "status": "ok", - "timestamp": 1664911655052, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "fiBI4YSl2Jud", - "outputId": "a887b65a-a1f8-469f-d828-36e1a31c8cf2" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------+---------+\n", - "| token|ner_label|\n", - "+------------+---------+\n", - "| Unions| O|\n", - "|representing| O|\n", - "| workers| O|\n", - "| at| O|\n", - "| Turner| B-ORG|\n", - "| Newall| I-ORG|\n", - "| say| O|\n", - "| they| O|\n", - "| are| O|\n", - "| '| O|\n", - "|disappointed| O|\n", - "| '| O|\n", - "| after| O|\n", - "| talks| O|\n", - "| with| O|\n", - "| stricken| O|\n", - "| parent| O|\n", - "| firm| O|\n", - "| Federal| B-ORG|\n", - "| Mogul| I-ORG|\n", - "| .| O|\n", - "| TORONTO| B-LOC|\n", - "| ,| O|\n", - "| Canada| B-LOC|\n", - "| A| O|\n", - "| second| O|\n", - "| team| O|\n", - "| of| O|\n", - "| rocketeers| O|\n", - "| competing| O|\n", - "| for| O|\n", - "| the| O|\n", - "| #36;10| O|\n", - "| million| O|\n", - "| Ansari| B-MISC|\n", - "| X| I-MISC|\n", - "| Prize| I-MISC|\n", - "| ,| O|\n", - "| a| O|\n", - "| contest| O|\n", - "| for| O|\n", - "| privately| O|\n", - "| funded| O|\n", - "| suborbital| O|\n", - "| space| O|\n", - "| flight| O|\n", - "| ,| O|\n", - "| has| O|\n", - "| officially| O|\n", - "| announced| O|\n", - "+------------+---------+\n", - "only showing top 50 rows\n", - "\n" - ] - } - ], - "source": [ - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.ner.result)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"ner_label\"))\n", - "\n", - "result_df.show(50, truncate=100)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "1LJGcXig26wl" - }, - "source": [ - "### NerDL OntoNotes 100D" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "2S-QiZwTnvuW" - }, - "source": [ - "This pipeline is based on NerDLApproach annotator with Char CNN - BiLSTM and GloVe Embeddings on the OntoNotes corpus and supports the identification of 18 entities.

Following NER types are supported in this pipeline:

TypeDescription
PERSONPeople, including fictional.
NORPNationalities or religious or political groups.
FACBuildings, airports, highways, bridges, etc.
ORGCompanies, agencies, institutions, etc.
GPECountries, cities, states.
LOCNon-GPE locations, mountain ranges, bodies of water.
PRODUCTObjects, vehicles, foods, etc. (Not services.)
EVENTNamed hurricanes, battles, wars, sports events, etc.
WORK_OF_ARTTitles of books, songs, etc.
LAWNamed documents made into laws.
LANGUAGEAny named language.
DATEAbsolute or relative dates or periods.
TIMETimes smaller than a day.
PERCENTPercentage, including ”%“.
MONEYMonetary values, including unit.
QUANTITYMeasurements, as of weight or distance.
ORDINAL“first”, “second”, etc.
CARDINALNumerals that do not fall under another type.
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8fIhFYG03lAB" - }, - "source": [ - "Entities\n", - "\n", - "``` 'CARDINAL', 'DATE', 'EVENT', 'FAC', 'GPE', 'LANGUAGE', 'LAW', 'LOC', 'MONEY', 'NORP', 'ORDINAL', 'ORG', 'PERCENT', 'PERSON', 'PRODUCT', 'QUANTITY', 'TIME', 'WORK_OF_ART' ```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 3567, - "status": "ok", - "timestamp": 1664911704123, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "KTH7biUa2ezJ", - "outputId": "751c3d89-bed4-485f-850d-5d88b042128a" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "onto_100 download started this may take some time.\n", - "Approximate size to download 13.5 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "onto_ner = NerDLModel.pretrained(\"onto_100\", 'en') \\\n", - " .setInputCols([\"document\", \"token\", \"embeddings\"]) \\\n", - " .setOutputCol(\"ner\")\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " glove_embeddings,\n", - " onto_ner])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1179, - "status": "ok", - "timestamp": 1664911706300, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "HQ6BJeBK3Gp-", - "outputId": "42cff7f7-49ad-434a-85cf-c50c38b64767" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------+-------------+\n", - "| token| ner_label|\n", - "+------------+-------------+\n", - "| Unions| O|\n", - "|representing| O|\n", - "| workers| O|\n", - "| at| O|\n", - "| Turner| B-ORG|\n", - "| Newall| I-ORG|\n", - "| say| O|\n", - "| they| O|\n", - "| are| O|\n", - "| '| O|\n", - "|disappointed| O|\n", - "| '| O|\n", - "| after| O|\n", - "| talks| O|\n", - "| with| O|\n", - "| stricken| O|\n", - "| parent| O|\n", - "| firm| O|\n", - "| Federal| B-ORG|\n", - "| Mogul| I-ORG|\n", - "| .| O|\n", - "| TORONTO| B-GPE|\n", - "| ,| O|\n", - "| Canada| B-GPE|\n", - "| A| O|\n", - "| second| B-ORDINAL|\n", - "| team| O|\n", - "| of| O|\n", - "| rocketeers| O|\n", - "| competing| O|\n", - "| for| O|\n", - "| the| O|\n", - "| #36;10| B-CARDINAL|\n", - "| million| I-CARDINAL|\n", - "| Ansari|B-WORK_OF_ART|\n", - "| X|I-WORK_OF_ART|\n", - "| Prize|I-WORK_OF_ART|\n", - "| ,| O|\n", - "| a| O|\n", - "| contest| O|\n", - "| for| O|\n", - "| privately| O|\n", - "| funded| O|\n", - "| suborbital| O|\n", - "| space| O|\n", - "| flight| O|\n", - "| ,| O|\n", - "| has| O|\n", - "| officially| O|\n", - "| announced| O|\n", - "+------------+-------------+\n", - "only showing top 50 rows\n", - "\n" - ] - } - ], - "source": [ - "result_df = result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.ner.result)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"token\"),\n", - " F.expr(\"cols['1']\").alias(\"ner_label\"))\n", - "\n", - "result_df.show(50, truncate=100)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "nziP0JBB34rq" - }, - "source": [ - "### NER with Bert (CoNLL 2003)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 24545, - "status": "ok", - "timestamp": 1664911751412, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "bF6czpoU3yFb", - "outputId": "ad537a37-c629-40bd-a286-6e6e5a268b45" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bert_base_cased download started this may take some time.\n", - "Approximate size to download 389.1 MB\n", - "[OK!]\n", - "ner_dl_bert download started this may take some time.\n", - "Approximate size to download 15.4 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "tokenizer = Tokenizer() \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"token\")\n", - "\n", - "bert_embeddings = BertEmbeddings.pretrained('bert_base_cased')\\\n", - " .setInputCols([\"document\", \"token\"])\\\n", - " .setOutputCol(\"embeddings\")\n", - "\n", - "onto_ner_bert = NerDLModel.pretrained(\"ner_dl_bert\", 'en') \\\n", - " .setInputCols([\"document\", \"token\", \"embeddings\"]) \\\n", - " .setOutputCol(\"ner\")\n", - "\n", - "nlpPipeline = Pipeline(\n", - " stages=[\n", - " documentAssembler, \n", - " tokenizer,\n", - " bert_embeddings,\n", - " onto_ner_bert\n", - " ])\n", - "\n", - "empty_df = spark.createDataFrame([['']]).toDF(\"text\")\n", - "\n", - "pipelineModel = nlpPipeline.fit(empty_df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1220, - "status": "ok", - "timestamp": 1664911752605, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "5bIZ_1yI4Ixv", - "outputId": "6921a375-d50e-4426-871c-d74d610e105b" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[('Peter', 'I-PER'),\n", - " ('Parker', 'I-PER'),\n", - " ('is', 'O'),\n", - " ('a', 'O'),\n", - " ('nice', 'O'),\n", - " ('persn', 'O'),\n", - " ('and', 'O'),\n", - " ('lives', 'O'),\n", - " ('in', 'O'),\n", - " ('New', 'I-LOC'),\n", - " ('York', 'I-LOC'),\n", - " ('.', 'O'),\n", - " ('Bruce', 'I-PER'),\n", - " ('Wayne', 'I-PER'),\n", - " ('is', 'O'),\n", - " ('also', 'O'),\n", - " ('a', 'O'),\n", - " ('nice', 'O'),\n", - " ('guy', 'O'),\n", - " ('and', 'O'),\n", - " ('lives', 'O'),\n", - " ('in', 'O'),\n", - " ('Gotham', 'I-LOC'),\n", - " ('City', 'I-LOC'),\n", - " ('.', 'O')]" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# fullAnnotate in LightPipeline\n", - "\n", - "light_model = LightPipeline(pipelineModel)\n", - "\n", - "light_result = light_model.annotate('Peter Parker is a nice persn and lives in New York. Bruce Wayne is also a nice guy and lives in Gotham City.')\n", - "\n", - "list(zip(light_result['token'], light_result['ner']))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5qinFfvSsy19" - }, - "source": [ - "### Getting the NER chunks with NER Converter" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "__OLhl663SDJ" - }, - "outputs": [], - "source": [ - "ner_converter = NerConverter() \\\n", - " .setInputCols([\"document\", \"token\", \"ner\"]) \\\n", - " .setOutputCol(\"ner_chunk\")\n", - "\n", - "nlpPipeline = Pipeline(\n", - " stages=[\n", - " documentAssembler, \n", - " tokenizer,\n", - " bert_embeddings,\n", - " onto_ner_bert,\n", - " ner_converter\n", - " ])\n", - "\n", - "empty_df = spark.createDataFrame([['']]).toDF(\"text\")\n", - "\n", - "pipelineModel = nlpPipeline.fit(empty_df)\n", - "\n", - "result = pipelineModel.transform(news_df.limit(10))\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 1705, - "status": "ok", - "timestamp": 1664911754640, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "nSIxpj4Osy2A", - "outputId": "cb24d626-f67e-4da6-9ca0-8cf735f5a01c" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-------------------------------------------+---------+\n", - "|chunk |ner_label|\n", - "+-------------------------------------------+---------+\n", - "|Turner Newall |ORG |\n", - "|Federal Mogul |ORG |\n", - "|TORONTO |LOC |\n", - "|Canada |LOC |\n", - "|Ansari X Prize |MISC |\n", - "|University of Louisville |ORG |\n", - "|Mike Fitzpatrick |PER |\n", - "|Southern California's |LOC |\n", - "|British Department for Education and Skills|ORG |\n", - "|DfES |ORG |\n", - "|Netsky |MISC |\n", - "|Sasser |MISC |\n", - "|Sophos |ORG |\n", - "|Jaschan |PER |\n", - "|Germany |LOC |\n", - "|Netsky |ORG |\n", - "|Sasser |MISC |\n", - "|GPG/OpenPGP |MISC |\n", - "|FOAF |ORG |\n", - "|PGP |ORG |\n", - "+-------------------------------------------+---------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "result.select(F.explode(F.arrays_zip(result.ner_chunk.result, \n", - " result.ner_chunk.metadata)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"chunk\"),\n", - " F.expr(\"cols['1']['entity']\").alias(\"ner_label\")).show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 175 - }, - "executionInfo": { - "elapsed": 1180, - "status": "ok", - "timestamp": 1664911756032, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "uauJN2Umsy2C", - "outputId": "47e57aa1-8503-4755-9460-9b97a444608b" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "
\n", - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
chunksentities
0Peter ParkerPER
1New YorkLOC
2Bruce WaynePER
3Gotham CityLOC
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - " chunks entities\n", - "0 Peter Parker PER\n", - "1 New York LOC\n", - "2 Bruce Wayne PER\n", - "3 Gotham City LOC" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# fullAnnotate in LightPipeline\n", - "\n", - "light_model = LightPipeline(pipelineModel)\n", - "\n", - "light_result = light_model.fullAnnotate('Peter Parker is a nice persn and lives in New York. Bruce Wayne is also a nice guy and lives in Gotham City.')\n", - "\n", - "\n", - "chunks = []\n", - "entities = []\n", - "\n", - "for n in light_result[0]['ner_chunk']:\n", - " \n", - " chunks.append(n.result)\n", - " entities.append(n.metadata['entity']) \n", - " \n", - " \n", - "import pandas as pd\n", - "\n", - "df = pd.DataFrame({'chunks':chunks, 'entities':entities})\n", - "\n", - "df" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "TkLVVip_7_FP" - }, - "source": [ - "### NER with BertForTokenClassification\n", - "\n", - "[BertForTokenClassification](https://nlp.johnsnowlabs.com/docs/en/transformers#bertfortokenclassification) can load Bert Models with a token classification head on top (a linear layer on top of the hidden-states output) e.g. for Named-Entity-Recognition (NER) tasks.\n", - "\n", - "For more examples of BertForTokenClassification models, please check [Transformers for Token Classification in Spark NLP notebook](https://github.com/JohnSnowLabs/spark-nlp-workshop/blob/master/tutorials/Certification_Trainings/Public/14.Transformers_for_Token_Classification_in_Spark_NLP.ipynb). \n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "vDQU8ngXTGwr" - }, - "source": [ - "Pretrained models can be loaded with `pretrained()` of the companion object. The default model is `\"bert_base_token_classifier_conll03\"`, if no name is provided.

\n", - "\n", - "**Here are Bert Based Token Classification models available in Spark NLP:**\n", - "\n", - "
\n", - "\n", - "| Title | Name | Language |\n", - "|:-----------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------|:-----------|\n", - "| BERT Token Classification - NER CoNLL (bert_base_token_classifier_conll03) | bert_base_token_classifier_conll03 | en |\n", - "| BERT Token Classification - NER OntoNotes (bert_base_token_classifier_ontonote) | bert_base_token_classifier_ontonote | en |\n", - "| BERT Token Classification Large - NER CoNLL (bert_large_token_classifier_conll03) | bert_large_token_classifier_conll03 | en |\n", - "| BERT Token Classification Large - NER OntoNotes (bert_large_token_classifier_ontonote) | bert_large_token_classifier_ontonote | en |\n", - "| BERT Token Classification - ParsBERT for Persian Language Understanding (bert_token_classifier_parsbert_armanner) | bert_token_classifier_parsbert_armanner | fa |\n", - "| BERT Token Classification - ParsBERT for Persian Language Understanding (bert_token_classifier_parsbert_ner) | bert_token_classifier_parsbert_ner | fa |\n", - "| BERT Token Classification - ParsBERT for Persian Language Understanding (bert_token_classifier_parsbert_peymaner) | bert_token_classifier_parsbert_peymaner | fa |\n", - "| BERT Token Classification - BETO Spanish Language Understanding (bert_token_classifier_spanish_ner) | bert_token_classifier_spanish_ner | es |\n", - "| BERT Token Classification - Swedish Language Understanding (bert_token_classifier_swedish_ner) | bert_token_classifier_swedish_ner | sv |\n", - "| BERT Token Classification - Turkish Language Understanding (bert_token_classifier_turkish_ner) | bert_token_classifier_turkish_ner | tr |\n", - "| DistilBERT Token Classification - NER CoNLL (distilbert_base_token_classifier_conll03) | distilbert_base_token_classifier_conll03 | en |\n", - "| DistilBERT Token Classification - NER OntoNotes (distilbert_base_token_classifier_ontonotes) | distilbert_base_token_classifier_ontonotes | en |\n", - "| DistilBERT Token Classification - DistilbertNER for Persian Language Understanding (distilbert_token_classifier_persian_ner) | distilbert_token_classifier_persian_ner | fa |\n", - "| BERT Token Classification - Few-NERD (bert_base_token_classifier_few_nerd) | bert_base_token_classifier_few_nerd | en |\n", - "| DistilBERT Token Classification - Few-NERD (distilbert_base_token_classifier_few_nerd) | distilbert_base_token_classifier_few_nerd | en |\n", - "| Named Entity Recognition for Japanese (BertForTokenClassification) | bert_token_classifier_ner_ud_gsd | ja |\n", - "| Detect PHI for Deidentification (BertForTokenClassifier) | bert_token_classifier_ner_deid | en |\n", - "| Detect Clinical Entities (BertForTokenClassifier) | bert_token_classifier_ner_jsl | en |\n", - "| Detect Drug Chemicals (BertForTokenClassifier) | bert_token_classifier_ner_drugs | en |\n", - "| Detect Clinical Entities (Slim version, BertForTokenClassifier) | bert_token_classifier_ner_jsl_slim | en |\n", - "| ALBERT Token Classification Base - NER CoNLL (albert_base_token_classifier_conll03) | albert_base_token_classifier_conll03 | en |\n", - "| ALBERT Token Classification Large - NER CoNLL (albert_large_token_classifier_conll03) | albert_large_token_classifier_conll03 | en |\n", - "| ALBERT Token Classification XLarge - NER CoNLL (albert_xlarge_token_classifier_conll03) | albert_xlarge_token_classifier_conll03 | en |\n", - "| DistilRoBERTa Token Classification - NER OntoNotes (distilroberta_base_token_classifier_ontonotes) | distilroberta_base_token_classifier_ontonotes | en |\n", - "| RoBERTa Token Classification Base - NER CoNLL (roberta_base_token_classifier_conll03) | roberta_base_token_classifier_conll03 | en |\n", - "| RoBERTa Token Classification Base - NER OntoNotes (roberta_base_token_classifier_ontonotes) | roberta_base_token_classifier_ontonotes | en |\n", - "| RoBERTa Token Classification Large - NER CoNLL (roberta_large_token_classifier_conll03) | roberta_large_token_classifier_conll03 | en |\n", - "| RoBERTa Token Classification Large - NER OntoNotes (roberta_large_token_classifier_ontonotes) | roberta_large_token_classifier_ontonotes | en |\n", - "| RoBERTa Token Classification For Persian (roberta_token_classifier_zwnj_base_ner) | roberta_token_classifier_zwnj_base_ner | fa |\n", - "| XLM-RoBERTa Token Classification Base - NER XTREME (xlm_roberta_token_classifier_ner_40_lang) | xlm_roberta_token_classifier_ner_40_lang | xx |\n", - "| XLNet Token Classification Base - NER CoNLL (xlnet_base_token_classifier_conll03) | xlnet_base_token_classifier_conll03 | en |\n", - "| XLNet Token Classification Large - NER CoNLL (xlnet_large_token_classifier_conll03) | xlnet_large_token_classifier_conll03 | en |\n", - "| Detect Adverse Drug Events (BertForTokenClassification) | bert_token_classifier_ner_ade | en |\n", - "| Detect Anatomical Regions (BertForTokenClassification) | bert_token_classifier_ner_anatomy | en |\n", - "| Detect Bacterial Species (BertForTokenClassification) | bert_token_classifier_ner_bacteria | en |\n", - "| XLM-RoBERTa Token Classification Base - NER CoNLL (xlm_roberta_base_token_classifier_conll03) | xlm_roberta_base_token_classifier_conll03 | en |\n", - "| XLM-RoBERTa Token Classification Base - NER OntoNotes (xlm_roberta_base_token_classifier_ontonotes) | xlm_roberta_base_token_classifier_ontonotes | en |\n", - "| Longformer Token Classification Base - NER CoNLL (longformer_base_token_classifier_conll03) | longformer_base_token_classifier_conll03 | en |\n", - "| Longformer Token Classification Base - NER CoNLL (longformer_large_token_classifier_conll03) | longformer_large_token_classifier_conll03 | en |\n", - "| Detect Chemicals in Medical text (BertForTokenClassification) | bert_token_classifier_ner_chemicals | en |\n", - "| Detect Chemical Compounds and Genes (BertForTokenClassifier) | bert_token_classifier_ner_chemprot | en |\n", - "| Detect Cancer Genetics (BertForTokenClassification) | bert_token_classifier_ner_bionlp | en |\n", - "| Detect Cellular/Molecular Biology Entities (BertForTokenClassification) | bert_token_classifier_ner_cellular | en |\n", - "| Detect concepts in drug development trials (BertForTokenClassification) | bert_token_classifier_drug_development_trials | en |\n", - "| Detect Cancer Genetics (BertForTokenClassification) | bert_token_classifier_ner_bionlp | en |\n", - "| Detect Adverse Drug Events (BertForTokenClassification) | bert_token_classifier_ner_ade | en |\n", - "| Detect Anatomical Regions (MedicalBertForTokenClassifier) | bert_token_classifier_ner_anatomy | en |\n", - "| Detect Cellular/Molecular Biology Entities (BertForTokenClassification) | bert_token_classifier_ner_cellular | en |\n", - "| Detect Chemicals in Medical text (BertForTokenClassification) | bert_token_classifier_ner_chemicals | en |\n", - "| Detect Chemical Compounds and Genes (BertForTokenClassifier) | bert_token_classifier_ner_chemprot | en |\n", - "| Detect PHI for Deidentification (BertForTokenClassifier) | bert_token_classifier_ner_deid | en |\n", - "| Detect Drug Chemicals (BertForTokenClassifier) | bert_token_classifier_ner_drugs | en |\n", - "| Detect Clinical Entities (BertForTokenClassifier) | bert_token_classifier_ner_jsl | en |\n", - "| Detect Clinical Entities (Slim version, BertForTokenClassifier) | bert_token_classifier_ner_jsl_slim | en |\n", - "| Detect Bacterial Species (BertForTokenClassification) | bert_token_classifier_ner_bacteria | en |" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "oBCnq6tnThMw" - }, - "source": [ - "**You can find all these models and more [HERE](https://nlp.johnsnowlabs.com/models?edition=Spark+NLP)**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 33616, - "status": "ok", - "timestamp": 1664911868468, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "EYaPujeVLUsu", - "outputId": "6e65404b-4f0c-4cc6-c50f-76960e38ea15" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bert_base_token_classifier_conll03 download started this may take some time.\n", - "Approximate size to download 385.4 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "# no need for token columns \n", - "tokenClassifier = BertForTokenClassification.pretrained('bert_base_token_classifier_conll03', 'en') \\\n", - " .setInputCols('document',\"token\") \\\n", - " .setOutputCol(\"ner\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 3202, - "status": "ok", - "timestamp": 1664911871653, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Ga2fLVNG8Az7", - "outputId": "207c4249-a13f-45a7-d77a-82cea0c2c139" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-------------------------------------------+---------+\n", - "|chunk |ner_label|\n", - "+-------------------------------------------+---------+\n", - "|Turner Newall |ORG |\n", - "|Federal Mogul |ORG |\n", - "|TORONTO |LOC |\n", - "|Canada |LOC |\n", - "|Ansari X Prize |MISC |\n", - "|University of Louisville |ORG |\n", - "|Mike Fitzpatrick |PER |\n", - "|Southern California's |LOC |\n", - "|British Department for Education and Skills|ORG |\n", - "|DfES |ORG |\n", - "|Music Manifesto |MISC |\n", - "|Netsky |MISC |\n", - "|Sasser |MISC |\n", - "|Sophos |ORG |\n", - "|Jaschan |PER |\n", - "|Germany |LOC |\n", - "|Netsky |MISC |\n", - "|Sasser |MISC |\n", - "|GPG/OpenPGP |MISC |\n", - "|PGP |MISC |\n", - "+-------------------------------------------+---------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], - "source": [ - "nlpPipeline = Pipeline(\n", - " stages=[\n", - " documentAssembler, \n", - " tokenizer,\n", - " tokenClassifier,\n", - " ner_converter\n", - " ])\n", - "\n", - "result = nlpPipeline.fit(news_df).transform(news_df.limit(10))\n", - "\n", - "result.select(F.explode(F.arrays_zip(result.ner_chunk.result, \n", - " result.ner_chunk.metadata)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias(\"chunk\"),\n", - " F.expr(\"cols['1']['entity']\").alias(\"ner_label\")).show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "URB45j2dAYql" - }, - "source": [ - "### Multi-Lingual NER \n", - "These NER Models are able to extract entities from a variety of languages\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "4XgIxV9O8nLb" - }, - "source": [ - "#### Multi-Lingual NER (XLM-RoBERTa)\n", - "[XlmRoBertaForTokenClassification](https://nlp.johnsnowlabs.com/docs/en/transformers#xlmrobertafortokenclassification) can load XLM-RoBERTa Models with a token classification head on top (a linear layer on top of the hidden-states output) e.g. for Named-Entity-Recognition (NER) tasks.\n", - "\n", - "\n", - "\n", - "\n", - "| Spark NLP Model Name | language | predicted_entities | Class | Number of Languages supported |\n", - "|:-----------------------------------------|:-----------|:-------------------------------------------------------|:--------------------------------|:-----------------------|\n", - "| ner_wikiner_glove_840B_300 | xx | ['B-LOC', 'I-LOC', 'B-ORG', 'I-ORG', 'B-PER', 'I-PER'] | NerDLModel |8 |\n", - "| ner_wikiner_xlm_roberta_base | xx | ['B-LOC', 'I-LOC', 'B-ORG', 'I-ORG', 'B-PER', 'I-PER'] | NerDLModel |8 |\n", - "| ner_xtreme_glove_840B_300 | xx | ['B-LOC', 'I-LOC', 'B-ORG', 'I-ORG', 'B-PER', 'I-PER'] | NerDLModel |40 |\n", - "| ner_xtreme_xlm_roberta_xtreme_base | xx | ['B-LOC', 'I-LOC', 'B-ORG', 'I-ORG', 'B-PER', 'I-PER'] | NerDLModel |40 | \n", - "| xlm_roberta_token_classifier_ner_40_lang | xx | ['LOC', 'ORG', 'PER', 'O'] | XlmRoBertaForTokenClassification |40 | \n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 68422, - "status": "ok", - "timestamp": 1664911940070, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "V5YtYY3w3OfJ", - "outputId": "8745aae9-9371-4a2e-edea-c2f16c8f03e6" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "xlm_roberta_token_classifier_ner_40_lang download started this may take some time.\n", - "Approximate size to download 921.6 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "tokenClassifier = XlmRoBertaForTokenClassification() \\\n", - " .pretrained('xlm_roberta_token_classifier_ner_40_lang', 'xx') \\\n", - " .setInputCols(['token', 'document']) \\\n", - " .setOutputCol('ner')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 4283, - "status": "ok", - "timestamp": 1664911944344, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "25M5P9ur2mf0", - "outputId": "bfd99210-c26f-49cb-b98f-ee97f171060f" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------+---------+\n", - "|token |ner_label|\n", - "+--------------+---------+\n", - "|Peter |PER |\n", - "|Parker |PER |\n", - "|is |O |\n", - "|a |O |\n", - "|nice |O |\n", - "|lad |O |\n", - "|and |O |\n", - "|lives |O |\n", - "|in |O |\n", - "|New |LOC |\n", - "|York |LOC |\n", - "|Das |O |\n", - "|Schloss |ORG |\n", - "|Charlottenburg|ORG |\n", - "|in |O |\n", - "|Berlin |LOC |\n", - "|ist |O |\n", - "|eines |O |\n", - "|der |O |\n", - "|schoensten |O |\n", - "|Staedte |O |\n", - "|in |O |\n", - "|Deutschland |LOC |\n", - "|sagen |O |\n", - "|viele |O |\n", - "|Menschen |O |\n", - "|Peter |PER |\n", - "|Parker |PER |\n", - "|est |O |\n", - "|un |O |\n", - "|gentil |O |\n", - "|garçon |O |\n", - "|et |O |\n", - "|vit |O |\n", - "|à |O |\n", - "|New |LOC |\n", - "|York |LOC |\n", - "|پیٹر |PER |\n", - "|پارکر |PER |\n", - "|ایک |O |\n", - "|اچھا |O |\n", - "|لڑکا |O |\n", - "|ہے |O |\n", - "|اور |O |\n", - "|وہ |O |\n", - "|نیو |LOC |\n", - "|یارک |LOC |\n", - "|میں |O |\n", - "|رہتا |O |\n", - "|ھے |O |\n", - "+--------------+---------+\n", - "\n" - ] - } - ], - "source": [ - "from pyspark.sql.types import StringType\n", - "from pyspark.sql import functions as F\n", - "\n", - "# No need for NER Converter\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " tokenizer,\n", - " tokenClassifier,])\n", - "\n", - "text = [\n", - "'Peter Parker is a nice lad and lives in New York', \n", - "'Das Schloss Charlottenburg in Berlin ist eines der schoensten Staedte in Deutschland sagen viele Menschen',\n", - "'Peter Parker est un gentil garçon et vit à New York',\n", - "'پیٹر پارکر ایک اچھا لڑکا ہے اور وہ نیو یارک میں رہتا ھے',\n", - "]\n", - "data_set = spark.createDataFrame(text, StringType()).toDF(\"text\")\n", - "result = nlpPipeline.fit(data_set).transform(data_set)\n", - "\n", - "\n", - "result.select(F.explode(F.arrays_zip(result.token.result, \n", - " result.ner.result)).alias(\"cols\")) \\\n", - " .select(F.expr(\"cols['0']\").alias('token'),\n", - " F.expr(\"cols['1']\").alias(\"ner_label\")).show(100,truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8FqaDA6asy2E" - }, - "source": [ - "## Highlight the entities" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "m0gqRk_uRcl9" - }, - "outputs": [], - "source": [ - "# Install spark-nlp-display\n", - "! pip install -q spark-nlp-display" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 15949, - "status": "ok", - "timestamp": 1664911974770, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "325EZWIh5X_n", - "outputId": "98d1b0fd-067e-4833-b32c-aea978af42d7" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "recognize_entities_dl download started this may take some time.\n", - "Approx size to download 160.1 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "from sparknlp.pretrained import PretrainedPipeline\n", - "\n", - "pipeline = PretrainedPipeline('recognize_entities_dl', lang='en')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 2054, - "status": "ok", - "timestamp": 1664911976788, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "A-rigiYR55D_", - "outputId": "6eb9216e-c6cf-46cf-9653-bce0b4a95e6e" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "dict_keys(['entities', 'document', 'token', 'ner', 'embeddings', 'sentence'])" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ann_text = pipeline.fullAnnotate('Peter Parker is a nice persn and lives in New York. Bruce Wayne is also a nice guy and lives in Gotham City.')[0]\n", - "ann_text.keys()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 299 - }, - "executionInfo": { - "elapsed": 25, - "status": "ok", - "timestamp": 1664911978443, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "JLXjjUFk57eO", - "outputId": "4f402e23-6231-4117-be0f-d1178c78a58d" - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - " Peter Parker PER is a nice persn and lives in New York LOC. Bruce Wayne PER is also a nice guy and lives in Gotham City LOC." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n", - " Peter Parker PER is a nice persn and lives in New York LOC. Bruce Wayne PER is also a nice guy and lives in Gotham City LOC." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "\n", - " Peter Parker PER is a nice persn and lives in New York. Bruce Wayne PER is also a nice guy and lives in Gotham City." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Color code for label: \n", - "\"LOC\": #008080\n", - "\"PER\": #800080\n" - ] - } - ], - "source": [ - "from sparknlp_display import NerVisualizer\n", - "\n", - "visualiser = NerVisualizer()\n", - "visualiser.display(ann_text, label_col='entities', document_col='document')\n", - "\n", - "# Change color of an entity label\n", - "visualiser.set_label_colors({'LOC':'#008080', 'PER':'#800080'})\n", - "visualiser.display(ann_text, label_col='entities')\n", - "\n", - "# Set label filter\n", - "visualiser.display(ann_text, label_col='entities', document_col='document',\n", - " labels=['PER'])\n", - "\n", - "print ('\\nColor code for label: \\n\"LOC\": {}\\n\"PER\": {}' .format(visualiser.get_label_color('LOC'),visualiser.get_label_color('PER')) )" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "v5ZbEW96mZ03" - }, - "source": [ - "## Using Pretrained ClassifierDL and SentimentDL models" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "FKjGyOcwmiQm" - }, - "source": [ - "| Name | Spark NLP Model Reference | Language |\n", - "|:------------------------------------------------------------------------------------|:-------------------------------------------|:-----------|\n", - "| TREC(50) Question Classifier | classifierdl_use_trec50 | en |\n", - "| TREC(6) Question Classifier | classifierdl_use_trec6 | en |\n", - "| Cyberbullying Classifier | classifierdl_use_cyberbullying | en |\n", - "| Emotion Detection Classifier | Emotion Classifier | en |\n", - "| Fake News Classifier | classifierdl_use_fakenews | en |\n", - "| Sarcasm Classifier | classifierdl_use_sarcasm | en |\n", - "| Spam Classifier | classifierdl_use_spam | en |\n", - "| Classifier for Adverse Drug Events | classifierdl_ade_biobert | en |\n", - "| PICO Classifier | classifierdl_pico_biobert | en |\n", - "| Classifier for Genders - BIOBERT | classifierdl_gender_biobert | en |\n", - "| Classifier for Genders - SBERT | classifierdl_gender_sbert | en |\n", - "| TREC(50) Question Classifier | classifierdl_use_trec50 | en |\n", - "| TREC(6) Question Classifier | classifierdl_use_trec6 | en |\n", - "| Cyberbullying Classifier | classifierdl_use_cyberbullying | en |\n", - "| Emotion Detection Classifier | classifierdl_use_emotion | en |\n", - "| Fake News Classifier | classifierdl_use_fakenews | en |\n", - "| Sarcasm Classifier | classifierdl_use_sarcasm | en |\n", - "| Spam Classifier | classifierdl_use_spam | en |\n", - "| Classifier for Adverse Drug Events | classifierdl_ade_biobert | en |\n", - "| Classifier for Adverse Drug Events using Clinical Bert | classifierdl_ade_clinicalbert | en |\n", - "| Classifier for Adverse Drug Events in Small Conversations | classifierdl_ade_conversational_biobert | en |\n", - "| Classifier for Genders - BIOBERT | classifierdl_gender_biobert | en |\n", - "| Classifier for Genders - SBERT | classifierdl_gender_sbert | en |\n", - "| PICO Classifier | classifierdl_pico_biobert | en |\n", - "| End-to-End (E2E) and data-driven NLG Challenge | multiclassifierdl_use_e2e | en |\n", - "| Toxic Comment Classification | multiclassifierdl_use_toxic | en |\n", - "| Toxic Comment Classification - Small | multiclassifierdl_use_toxic_sm | en |\n", - "| Intent Classification for Airline Traffic Information System queries (ATIS dataset) | classifierdl_use_atis | en |\n", - "| Identify intent in general text - SNIPS dataset | classifierdl_use_snips | en |\n", - "| News Classifier of Turkish text | classifierdl_bert_news | tr |\n", - "| News Classifier of German text | classifierdl_bert_news | de |\n", - "| Cyberbullying Classifier in Turkish texts. | classifierdl_berturk_cyberbullying | tr |\n", - "| Question Pair Classifier | classifierdl_electra_questionpair | en |\n", - "| Question Pair Classifier Pipeline | classifierdl_electra_questionpair_pipeline | en |\n", - "| News Classifier Pipeline for Turkish text | classifierdl_bert_news_pipeline | tr |" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 8393, - "status": "ok", - "timestamp": 1664911986815, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "1q7Ju4HHmagE", - "outputId": "5a82ba79-e637-411b-eb66-2d94f1ce618c" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "classifierdl_use_fakenews download started this may take some time.\n", - "Approximate size to download 21.4 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "fake_classifier = ClassifierDLModel.pretrained('classifierdl_use_fakenews', 'en') \\\n", - " .setInputCols([\"document\", \"sentence_embeddings\"]) \\\n", - " .setOutputCol(\"class\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "nLYQd97Qmt1a" - }, - "source": [ - "fake_news classifier is trained on `https://raw.githubusercontent.com/joolsa/fake_real_news_dataset/master/fake_or_real_news.csv.zip`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 16, - "status": "ok", - "timestamp": 1664911986816, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "4lJPUe-KmqBN", - "outputId": "cb97cb62-41b0-45ab-bc47-691fdf2106c4" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['FAKE', 'REAL']" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fake_classifier.getClasses()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 59205, - "status": "ok", - "timestamp": 1664912050172, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "xY03ThozmwIE", - "outputId": "871908e1-5384-47a5-dc69-5b21a5bf4fa4" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tfhub_use download started this may take some time.\n", - "Approximate size to download 923.7 MB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - "use = UniversalSentenceEncoder.pretrained(lang=\"en\") \\\n", - " .setInputCols([\"document\"])\\\n", - " .setOutputCol(\"sentence_embeddings\")\n", - "\n", - "nlpPipeline = Pipeline(stages=[documentAssembler, \n", - " use,\n", - " fake_classifier])\n", - "\n", - "empty_data = spark.createDataFrame([[\"\"]]).toDF(\"text\")\n", - "\n", - "fake_clf_model = nlpPipeline.fit(empty_data)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "dLXj1wBWm0gQ" - }, - "outputs": [], - "source": [ - "!wget -q https://raw.githubusercontent.com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Public/data/spam_ham_dataset.csv" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 359, - "status": "ok", - "timestamp": 1664912051072, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "HlFOegD3ofvP", - "outputId": "ab303357-4482-4bd0-84a5-3d01e4d060fe" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'document': ['BREAKING: Leaked Picture Of Obama Being Dragged Before A Judge In Handcuffs For Wiretapping Trump'],\n", - " 'sentence_embeddings': ['BREAKING: Leaked Picture Of Obama Being Dragged Before A Judge In Handcuffs For Wiretapping Trump'],\n", - " 'class': ['FAKE']}" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fake_lp_pipeline = LightPipeline(fake_clf_model)\n", - "\n", - "text = 'BREAKING: Leaked Picture Of Obama Being Dragged Before A Judge In Handcuffs For Wiretapping Trump'\n", - "\n", - "fake_lp_pipeline.annotate(text)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 232, - "status": "ok", - "timestamp": 1664912051299, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "MrOQLnBcofh5", - "outputId": "88ed92e7-3f07-44fd-b865-567de8654a41" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-------------------------------------------------------------------------------------------------+\n", - "|text |\n", - "+-------------------------------------------------------------------------------------------------+\n", - "|BREAKING: Leaked Picture Of Obama Being Dragged Before A Judge In Handcuffs For Wiretapping Trump|\n", - "+-------------------------------------------------------------------------------------------------+\n", - "\n" - ] - } - ], - "source": [ - "sample_data = spark.createDataFrame([[text]]).toDF(\"text\")\n", - "\n", - "sample_data.show(truncate=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 526, - "status": "ok", - "timestamp": 1664912051821, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "ZutmHe8tofOv", - "outputId": "b65f3a39-c765-4baf-8bb1-b3256a1695c5" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------+--------------------+--------------------+--------------------+\n", - "| text| document| sentence_embeddings| class|\n", - "+--------------------+--------------------+--------------------+--------------------+\n", - "|BREAKING: Leaked ...|[{document, 0, 96...|[{sentence_embedd...|[{category, 0, 96...|\n", - "+--------------------+--------------------+--------------------+--------------------+\n", - "\n" - ] - } - ], - "source": [ - "pred = fake_clf_model.transform(sample_data)\n", - "\n", - "pred.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 748, - "status": "ok", - "timestamp": 1664912052565, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "S1VaVxd7pCAI", - "outputId": "a367a2cc-fe82-4f78-c6bd-f37a3b76af31" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-------------------------------------------------------------------------------------------------+------+\n", - "|text |result|\n", - "+-------------------------------------------------------------------------------------------------+------+\n", - "|BREAKING: Leaked Picture Of Obama Being Dragged Before A Judge In Handcuffs For Wiretapping Trump|[FAKE]|\n", - "+-------------------------------------------------------------------------------------------------+------+\n", - "\n" - ] - } - ], - "source": [ - "pred.select('text','class.result').show(truncate=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "5wDEdQ99pIw0" - }, - "source": [ - "you can find more samples here >> `https://github.com/KaiDMML/FakeNewsNet/tree/master/dataset`\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 27, - "status": "ok", - "timestamp": 1664912052566, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "J1RzlrnzS9Ry", - "outputId": "54b72f89-43fd-43ce-8a6c-cf2117fef07f" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'document': ['Joseph Robinette Biden Jr. is an American politician who is the 46th and current president of the United States.'],\n", - " 'sentence_embeddings': ['Joseph Robinette Biden Jr. is an American politician who is the 46th and current president of the United States.'],\n", - " 'class': ['REAL']}" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fake_lp_pipeline = LightPipeline(fake_clf_model)\n", - "\n", - "text = \"Joseph Robinette Biden Jr. is an American politician who is the 46th and current president of the United States.\"\n", - "\n", - "fake_lp_pipeline.annotate(text)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8X5ftW_kpVS-" - }, - "source": [ - "## Generic classifier function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "2AsjZNMFpVy2" - }, - "outputs": [], - "source": [ - "def get_clf_lp(model_name, sentiment_dl=False, pretrained=True):\n", - "\n", - " documentAssembler = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - "\n", - " use = UniversalSentenceEncoder.pretrained(lang=\"en\") \\\n", - " .setInputCols([\"document\"])\\\n", - " .setOutputCol(\"sentence_embeddings\")\n", - "\n", - "\n", - " if pretrained:\n", - "\n", - " if sentiment_dl:\n", - "\n", - " document_classifier = SentimentDLModel.pretrained(model_name, 'en') \\\n", - " .setInputCols([\"document\", \"sentence_embeddings\"]) \\\n", - " .setOutputCol(\"class\")\n", - " else:\n", - " document_classifier = ClassifierDLModel.pretrained(model_name, 'en') \\\n", - " .setInputCols([\"document\", \"sentence_embeddings\"]) \\\n", - " .setOutputCol(\"class\")\n", - "\n", - " else:\n", - "\n", - " if sentiment_dl:\n", - "\n", - " document_classifier = SentimentDLModel.load(model_name) \\\n", - " .setInputCols([\"document\", \"sentence_embeddings\"]) \\\n", - " .setOutputCol(\"class\")\n", - " else:\n", - " document_classifier = ClassifierDLModel.load(model_name) \\\n", - " .setInputCols([\"document\", \"sentence_embeddings\"]) \\\n", - " .setOutputCol(\"class\")\n", - "\n", - " print ('classes:',document_classifier.getClasses())\n", - "\n", - " nlpPipeline = Pipeline(stages=[\n", - " documentAssembler, \n", - " use,\n", - " document_classifier\n", - " ])\n", - "\n", - " empty_data = spark.createDataFrame([[\"\"]]).toDF(\"text\")\n", - "\n", - " clf_pipelineFit = nlpPipeline.fit(empty_data)\n", - "\n", - " clf_lp_pipeline = LightPipeline(clf_pipelineFit)\n", - "\n", - " return clf_lp_pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 12017, - "status": "ok", - "timestamp": 1664912064562, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "Sv0HYuokpYWv", - "outputId": "5b809660-2674-45aa-96b7-9d4220984ef2" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tfhub_use download started this may take some time.\n", - "Approximate size to download 923.7 MB\n", - "[OK!]\n", - "classifierdl_use_trec50 download started this may take some time.\n", - "Approximate size to download 21.2 MB\n", - "[OK!]\n", - "classes: [' ENTY_color', ' ENTY_techmeth', ' DESC_manner', ' NUM_volsize', ' ENTY_letter', ' NUM_temp', ' ENTY_body', ' NUM_count', ' ENTY_instru', ' NUM_period', ' NUM_speed', ' DESC_reason', ' ENTY_symbol', ' ENTY_event', ' HUM_desc', ' NUM_perc', ' ENTY_dismed', ' NUM_ord', ' HUM_gr', ' LOC_mount', ' ABBR_abb', ' DESC_desc', ' NUM_dist', ' HUM_title', ' ENTY_lang', ' ENTY_sport', ' ENTY_plant', ' NUM_code', ' NUM_other', ' ENTY_word', ' ENTY_animal', ' ENTY_substance', ' ENTY_veh', ' ENTY_product', ' LOC_state', ' ENTY_religion', ' ENTY_currency', ' NUM_date', ' LOC_country', ' ENTY_cremat', ' NUM_money', ' LOC_other', ' DESC_def', ' LOC_city', ' HUM_ind', ' ENTY_other', ' ENTY_termeq', ' ENTY_food', ' ABBR_exp', ' NUM_weight']\n" - ] - } - ], - "source": [ - "clf_lp_pipeline = get_clf_lp('classifierdl_use_trec50')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "KPQpn6hGpeXR" - }, - "source": [ - "trained on the TREC datasets:\n", - "\n", - "Classify open-domain, fact-based questions into one of the following broad semantic categories: \n", - "\n", - "```Abbreviation, Description, Entities, Human Beings, Locations or Numeric Values.```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 32, - "status": "ok", - "timestamp": 1664912064563, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "qhszgL_epe7W", - "outputId": "a0adb084-08f4-417a-9bb0-c2f892cc4f7c" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[' NUM_count']" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text = 'What was the number of member nations of the U.N. in 2000?'\n", - "\n", - "clf_lp_pipeline.annotate(text)['class']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 35 - }, - "executionInfo": { - "elapsed": 378, - "status": "ok", - "timestamp": 1664912064920, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "lU8mhnX-pn5-", - "outputId": "d0c47dde-37dc-4c45-c116-c3b0e7d22514" - }, - "outputs": [ - { - "data": { - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - }, - "text/plain": [ - "' NUM_count'" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "clf_lp_pipeline.fullAnnotate(text)[0]['class'][0].result" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 32, - "status": "ok", - "timestamp": 1664912064921, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "boKPGhgoppto", - "outputId": "f2e6d882-42e4-4179-9cf3-e48ae075a3c3" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{' ENTY_dismed': '3.768739E-22',\n", - " ' ENTY_product': '2.4015744E-24',\n", - " ' ENTY_techmeth': '1.5787039E-22',\n", - " ' NUM_speed': '7.948464E-23',\n", - " ' NUM_volsize': '2.5315113E-25',\n", - " ' LOC_state': '6.3784123E-25',\n", - " ' NUM_code': '1.4549451E-25',\n", - " ' NUM_count': '0.9992601',\n", - " ' ENTY_food': '1.3031208E-24',\n", - " ' ENTY_animal': '1.6743833E-24',\n", - " ' NUM_period': '6.8075115E-21',\n", - " ' ENTY_religion': '5.9194734E-23',\n", - " ' LOC_country': '5.3062683E-21',\n", - " ' LOC_mount': '3.2177816E-25',\n", - " ' ENTY_termeq': '9.790085E-26',\n", - " ' ENTY_color': '1.1446835E-22',\n", - " ' ENTY_lang': '6.333391E-24',\n", - " ' ENTY_sport': '8.0773835E-25',\n", - " ' DESC_def': '2.4284432E-27',\n", - " ' HUM_gr': '4.4863106E-21',\n", - " ' ENTY_symbol': '4.1271923E-25',\n", - " ' ENTY_currency': '8.156541E-29',\n", - " ' ENTY_veh': '5.414701E-22',\n", - " ' LOC_other': '5.5141072E-11',\n", - " ' ENTY_word': '5.3265024E-23',\n", - " ' NUM_temp': '2.0907158E-23',\n", - " ' NUM_dist': '1.2542656E-24',\n", - " ' DESC_desc': '1.0926973E-12',\n", - " ' DESC_manner': '9.258374E-23',\n", - " ' NUM_ord': '2.2395288E-25',\n", - " ' NUM_other': '3.9771262E-27',\n", - " ' DESC_reason': '1.1718967E-6',\n", - " ' NUM_weight': '1.5373857E-24',\n", - " ' ENTY_instru': '5.9354656E-21',\n", - " ' ENTY_letter': '1.1453239E-25',\n", - " ' ENTY_event': '3.706315E-25',\n", - " ' ENTY_substance': '6.890844E-25',\n", - " ' ABBR_exp': '5.6048268E-24',\n", - " ' ENTY_body': '6.423101E-23',\n", - " ' ENTY_other': '7.378E-4',\n", - " ' NUM_money': '1.6745677E-25',\n", - " ' LOC_city': '4.7003377E-22',\n", - " ' NUM_date': '5.2122506E-16',\n", - " ' NUM_perc': '6.3761288E-24',\n", - " ' ABBR_abb': '7.101014E-26',\n", - " ' ENTY_plant': '5.543376E-24',\n", - " ' HUM_title': '1.0681953E-24',\n", - " ' ENTY_cremat': '1.1165376E-24',\n", - " ' HUM_ind': '8.063818E-7',\n", - " ' HUM_desc': '4.3701275E-23',\n", - " 'sentence': '0'}" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "clf_lp_pipeline.fullAnnotate(text)[0]['class'][0].metadata" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 20, - "status": "ok", - "timestamp": 1664912064922, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "P87b4fzRpr6-", - "outputId": "2a07fdc8-4a2e-4bfe-9a80-152ca249baa7" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[' HUM_ind']" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text = 'What animal was the first mammal successfully cloned from adult cells?'\n", - "\n", - "clf_lp_pipeline.annotate(text)['class']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 11360, - "status": "ok", - "timestamp": 1664912076270, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "bNgGwNDwpuPV", - "outputId": "39db1753-994b-46d5-84e0-00743eb71f02" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tfhub_use download started this may take some time.\n", - "Approximate size to download 923.7 MB\n", - "[OK!]\n", - "classifierdl_use_cyberbullying download started this may take some time.\n", - "Approximate size to download 21.3 MB\n", - "[OK!]\n", - "classes: ['sexism', 'neutral', 'racism']\n" - ] - } - ], - "source": [ - "clf_lp_pipeline = get_clf_lp('classifierdl_use_cyberbullying')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 362, - "status": "ok", - "timestamp": 1664912076600, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "MPGnM_gipwPf", - "outputId": "ab83a3dd-65d8-4390-8457-50c7ef196a9e" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['sexism']" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text ='RT @EBeisner @ahall012 I agree with you!! I would rather brush my teeth with sandpaper then watch football with a girl!!'\n", - "\n", - "clf_lp_pipeline.annotate(text)['class']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 6402, - "status": "ok", - "timestamp": 1664912082988, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "3u9ktm9xp2aF", - "outputId": "4947d747-787d-4932-ca58-37fd709ed84d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tfhub_use download started this may take some time.\n", - "Approximate size to download 923.7 MB\n", - "[OK!]\n", - "classifierdl_use_fakenews download started this may take some time.\n", - "Approximate size to download 21.4 MB\n", - "[OK!]\n", - "classes: ['FAKE', 'REAL']\n" - ] - } - ], - "source": [ - "clf_lp_pipeline = get_clf_lp('classifierdl_use_fakenews')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 54, - "status": "ok", - "timestamp": 1664912082989, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "CNkFNiS4p5GM", - "outputId": "8f2624e0-9e47-4e6b-c090-07813eda3171" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['FAKE']" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text ='Donald Trump a KGB Spy? 11/02/2016 In today’s video, Christopher Greene of AMTV reports Hillary Clinton campaign accusation that Donald Trump is a KGB spy is about as weak and baseless a claim as a Salem witch hunt or McCarthy era trial. It’s only because Hillary Clinton is losing that she is lobbing conspiracy theory. Citizen Quasar The way I see it, one of two things will happen: 1. Trump will win by a landslide but the election will be stolen via electronic voting, just like I have been predicting for over a decade, and the American People will accept the skewed election results just like they accept the TSA into their crotches. 2. Somebody will bust a cap in Hillary’s @$$ killing her and the election will be postponed. Follow AMTV!'\n", - "\n", - "clf_lp_pipeline.annotate(text)['class']\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 39, - "status": "ok", - "timestamp": 1664912082990, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "L77nGOzsp859", - "outputId": "f8bbbec1-41f7-4d3f-b4f5-af5ed8ad8f87" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['REAL']" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text ='Sen. Marco Rubio (R-Fla.) is adding a veteran New Hampshire political operative to his team as he continues mulling a possible 2016 presidential bid, the latest sign that he is seriously preparing to launch a campaign later this year.Jim Merrill, who worked for former GOP presidential nominee Mitt Romney and ran his 2008 and 2012 New Hampshire primary campaigns, joined Rubio’s fledgling campaign on Monday, aides to the senator said.Merrill will be joining Rubio’s Reclaim America PAC to focus on Rubio’s New Hampshire and broader Northeast political operations.\"Marco has always been well received in New Hampshire, and should he run for president, he would be very competitive there,\" Terry Sullivan, who runs Reclaim America, said in a statement. \"Jim certainly knows how to win in New Hampshire and in the Northeast, and will be a great addition to our team at Reclaim America.”News of Merrill’s hire was first reported by The New York Times.'\n", - "\n", - "clf_lp_pipeline.annotate(text)['class']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 9046, - "status": "ok", - "timestamp": 1664912092005, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "awBvudTRqApS", - "outputId": "b4ca676b-400e-445b-b3b6-652187c638eb" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tfhub_use download started this may take some time.\n", - "Approximate size to download 923.7 MB\n", - "[OK!]\n", - "sentimentdl_use_twitter download started this may take some time.\n", - "Approximate size to download 11.4 MB\n", - "[OK!]\n", - "classes: ['positive', 'negative']\n" - ] - } - ], - "source": [ - "sentiment_lp_pipeline = get_clf_lp('sentimentdl_use_twitter', sentiment_dl=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 42, - "status": "ok", - "timestamp": 1664912092006, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "5RQ4aVPNqDHn", - "outputId": "c02f64f4-94c4-4af0-8a26-7ebda1c310b5" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['positive']" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text ='I am SO happy the news came out in time for my birthday this weekend! My inner 7-year-old cannot WAIT!'\n", - "\n", - "sentiment_lp_pipeline.annotate(text)['class']" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 11183, - "status": "ok", - "timestamp": 1664912103161, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "YON-nknFqG5m", - "outputId": "49552554-f9b4-46c4-c4bf-4c1cc5821b6b" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tfhub_use download started this may take some time.\n", - "Approximate size to download 923.7 MB\n", - "[OK!]\n", - "classifierdl_use_emotion download started this may take some time.\n", - "Approximate size to download 21.3 MB\n", - "[OK!]\n", - "classes: ['joy', 'fear', 'surprise', 'sadness']\n" - ] - } - ], - "source": [ - "sentiment_lp_pipeline = get_clf_lp('classifierdl_use_emotion', sentiment_dl=False)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 357, - "status": "ok", - "timestamp": 1664912103493, - "user": { - "displayName": "Merve Ertas Uslu", - "userId": "01451729557099986551" - }, - "user_tz": -120 - }, - "id": "yW4Yim4HqJXn", - "outputId": "542aebb2-1f41-4fe6-ee19-91f7312d1fb5" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['surprise']" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sentiment_lp_pipeline.annotate(text)['class']" - ] - } - ], - "metadata": { - "accelerator": "TPU", - "colab": { - "collapsed_sections": [], - "machine_shape": "hm", - "provenance": [], - "toc_visible": true - }, - "gpuClass": "standard", - "kernelspec": { - "display_name": "base", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.12 (main, Apr 5 2022, 06:56:58) \n[GCC 7.5.0]" - }, - "vscode": { - "interpreter": { - "hash": "3d597f4c481aa0f25dceb95d2a0067e73c0966dcbd003d741d821a7208527ecf" - } - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/examples/bakSentenceDetectorDL.ipynb b/examples/bakSentenceDetectorDL.ipynb deleted file mode 100644 index ea02f287ab815a..00000000000000 --- a/examples/bakSentenceDetectorDL.ipynb +++ /dev/null @@ -1,787 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "E0pAkKvH6v7K" - }, - "source": [ - "![JohnSnowLabs](https://nlp.johnsnowlabs.com/assets/images/logo.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "OzsBWso169YV" - }, - "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/spark-nlp-workshop/blob/master/tutorials/Certification_Trainings/Public/9.SentenceDetectorDL.ipynb)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": { - "id": "jirVPUT0F9bB" - }, - "source": [ - "# SentenceDetectorDL" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "2mg5E3wl8yHp" - }, - "source": [ - "`SentenceDetectorDL` (SDDL) is based on a general-purpose neural network model for sentence boundary detection. The task of sentence boundary detection is to identify sentences within a text. Many natural language processing tasks take a sentence as an input unit, such as part-of-speech tagging, dependency parsing, named entity recognition or machine translation.\n", - "\n", - "In this model, we treated the sentence boundary detection task as a classification problem using a DL CNN architecture. We also modified the original implemenation a little bit to cover broken sentences and some impossible end of line chars.\n", - "\n", - "We are releasing two pretrained SDDL models: `english` and `multilanguage` that are trained on `SETimes corpus (Tyers and Alperen, 2010)` and ` Europarl. Wong et al. (2014)` datasets.\n", - "\n", - "Here are the test metrics on various languages for `multilang` model" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "KvNuyGXpD7Nt" - }, - "source": [ - "![image.png](data:image/png;base64,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)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "adrTGL-6ECtF" - }, - "source": [ - "**Supported Languages**\n", - "\n", - "`bg Bulgarian`\n", - "\n", - "`bs Bosnian`\n", - "\n", - "`da Danish`\n", - "\n", - "`de German`\n", - "\n", - "`el Greek`\n", - "\n", - "`en English`\n", - "\n", - "`es Spanish`\n", - "\n", - "`fi Finnish`\n", - "\n", - "`fr French`\n", - "\n", - "`hr Croatian`\n", - "\n", - "`it Italian`\n", - "\n", - "`mk Macedonian`\n", - "\n", - "`nl Dutch`\n", - "\n", - "`pt Portuguese`\n", - "\n", - "`ro Romanian`\n", - "\n", - "`sq Albanian`\n", - "\n", - "`sr Serbian`\n", - "\n", - "`sv Swedish`\n", - "\n", - "`tr Turkish`\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "s8h1ee-GaEsn" - }, - "outputs": [], - "source": [ - "! pip install -q pyspark==3.3.0 spark-nlp==4.3.0" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 254 - }, - "executionInfo": { - "elapsed": 23293, - "status": "ok", - "timestamp": 1664975024014, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "6_cR3Syj8wTd", - "outputId": "67700eee-d59b-48b8-c0cc-54dd7dc2f23d" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Spark NLP version 4.3.0\n", - "Apache Spark version: 3.3.0\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - "

SparkSession - in-memory

\n", - " \n", - "
\n", - "

SparkContext

\n", - "\n", - "

Spark UI

\n", - "\n", - "
\n", - "
Version
\n", - "
v3.3.0
\n", - "
Master
\n", - "
local[*]
\n", - "
AppName
\n", - "
Spark NLP
\n", - "
\n", - "
\n", - " \n", - "
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import sparknlp\n", - "\n", - "from pyspark.ml import PipelineModel\n", - "from sparknlp.annotator import *\n", - "from sparknlp.base import *\n", - "\n", - "spark = sparknlp.start()\n", - "\n", - "print(\"Spark NLP version\", sparknlp.version())\n", - "print(\"Apache Spark version:\", spark.version)\n", - "\n", - "spark" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 16765, - "status": "ok", - "timestamp": 1664975040774, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "zS46q8E0Aidy", - "outputId": "f067a993-5fcf-4e84-e41d-2c17202ade55" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sentence_detector_dl download started this may take some time.\n", - "Approximate size to download 354.6 KB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "documenter = DocumentAssembler()\\\n", - " .setInputCol(\"text\")\\\n", - " .setOutputCol(\"document\")\n", - " \n", - "sentencerDL = SentenceDetectorDLModel\\\n", - " .pretrained(\"sentence_detector_dl\", \"en\") \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"sentences\")\n", - "\n", - "sd_pipeline = PipelineModel(stages=[documenter, sentencerDL])" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "executionInfo": { - "elapsed": 16, - "status": "ok", - "timestamp": 1664975040775, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "kHWj4IxqBnwK" - }, - "outputs": [], - "source": [ - "sd_model = LightPipeline(sd_pipeline)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 388, - "status": "ok", - "timestamp": 1664975041148, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "sBJqnxE6-1uz", - "outputId": "9ce4d659-70e9-459a-cd36-fc2f382bb716" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\t0\t15\tJohn loves Mary.\n", - "1\t16\t31\tmary loves Peter\n", - "2\t43\t61\tPeter loves Helen .\n", - "3\t62\t78\tHelen loves John;\n", - "4\t91\t119\tTotal: four. people involved.\n" - ] - } - ], - "source": [ - "text = \"\"\"John loves Mary.mary loves Peter\n", - " Peter loves Helen .Helen loves John; \n", - " Total: four. people involved.\"\"\"\n", - "\n", - "for anno in sd_model.fullAnnotate(text)[0][\"sentences\"]:\n", - " print(\"{}\\t{}\\t{}\\t{}\".format(\n", - " anno.metadata[\"sentence\"], anno.begin, anno.end, anno.result))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "-ihAtVvIDSJh" - }, - "source": [ - "### Testing with a broken text (random `\\n` chars added)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 796, - "status": "ok", - "timestamp": 1664975041942, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "NzRiZYqiCX4t", - "outputId": "e381bffc-04f3-4522-fa12-e4d99d8dd308" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\t1\t104\tThere are many NLP tasks like text summarization, question-answering, sentence prediction to name a few.\n", - "1\t106\t170\tOne method to get these tasks done is using a pre-trained model.\n", - "2\t172\t362\tInstead of training a model from scratch for NLP tasks using millions of annotated texts each time, a general language representation is created by training a model on a huge amount of data.\n", - "3\t364\t398\tThis is called a pre-trained model.\n", - "4\t400\t479\tThis pre-trained model is then fine-tuned for each NLP tasks according to need.\n", - "5\t481\t520\tLet’s just peek into the pre-BERT world…\n", - "6\t522\t634\tFor creating models, we need words to be represented in a form understood by the training network, ie, numbers.\n", - "7\t636\t731\tThus many algorithms were used to convert words into vectors or more precisely, word embeddings.\n", - "8\t734\t798\tOne of the earliest algorithms used for this purpose is word2vec.\n", - "9\t800\t872\tHowever, the drawback of word2vec models was that they were context-free.\n", - "10\t874\t941\tOne problem caused by this is that they cannot accommodate polysemy.\n", - "11\t943\t1022\tFor example, the word ‘letter’ has a different meaning according to the context.\n", - "12\t1024\t1106\tIt can mean ‘single element of alphabet’ or ‘document addressed to another person’.\n", - "13\t1108\t1163\tBut in word2vec both the letter returns same embeddings.\n" - ] - } - ], - "source": [ - "text = '''\n", - "There are many NLP tasks like text summarization, question-answering, sentence prediction to name a few. One method to get\\n these tasks done is using a pre-trained model. Instead of training \n", - "a model from scratch for NLP tasks using millions of annotated texts each time, a general language representation is created by training a model on a huge amount of data. This is called a pre-trained model. This pre-trained model is \n", - "then fine-tuned for each NLP tasks according to need.\n", - "Let’s just peek into the pre-BERT world…\n", - "For creating models, we need words to be represented in a form \\n understood by the training network, ie, numbers. Thus many algorithms were used to convert words into vectors or more precisely, word embeddings. \n", - "One of the earliest algorithms used for this purpose is word2vec. However, the drawback of word2vec models was that they were context-free. One problem caused by this is that they cannot accommodate polysemy. For example, the word ‘letter’ has a different meaning according to the context. It can mean ‘single element of alphabet’ or ‘document addressed to another person’. But in word2vec both the letter returns same embeddings.\n", - "'''\n", - "\n", - "for anno in sd_model.fullAnnotate(text)[0][\"sentences\"]:\n", - " \n", - " print(\"{}\\t{}\\t{}\\t{}\".format(\n", - " anno.metadata[\"sentence\"], anno.begin, anno.end, anno.result.replace('\\n',''))) # removing \\n to beutify printing\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "P1uBCqrnElmi" - }, - "source": [ - "## Compare with Spacy Sentence Splitter" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "executionInfo": { - "elapsed": 6, - "status": "ok", - "timestamp": 1664975041943, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "8PtDPgliWEdu" - }, - "outputs": [], - "source": [ - "# !pip install spacy" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "executionInfo": { - "elapsed": 15720, - "status": "ok", - "timestamp": 1664975057658, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "5tHHalKGEoTu" - }, - "outputs": [], - "source": [ - "import spacy\n", - "\n", - "nlp = spacy.load(\"en_core_web_sm\")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 20, - "status": "ok", - "timestamp": 1664975057659, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "euCxCFU-Erpv", - "outputId": "4cc0b189-2211-43a6-93db-186ea1bb0f5b" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "John loves Mary.mary loves Peter\n", - "Peter loves Helen .Helen\n", - "loves John; \n", - "Total: four.\n", - "people involved.\n" - ] - } - ], - "source": [ - "text = \"\"\"John loves Mary.mary loves Peter\n", - "Peter loves Helen .Helen loves John; \n", - "Total: four. people involved.\"\"\"\n", - "\n", - "for sent in nlp(text).sents:\n", - " print(sent)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Rq1LuycdbpAf" - }, - "source": [ - "## Test with another random broken sentence " - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 404, - "status": "ok", - "timestamp": 1664975058045, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "S6EUTjAlFFVd", - "outputId": "6f5b24f6-8cf0-493c-dc62-9a25097ad007" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "with Spark NLP SentenceDetectorDL\n", - "===================================\n", - "0\tA California woman who vanished in Utah’s Zion National Park earlier,this month was found and reunited with her family officials said Sunday.\n", - "1\tHolly Suzanne Courtier, 38, was located within the park after a visitor saw her and alerted rangers, the National. Park Service said in a statement.\n", - "2\tAdditional details about how she survived or where she was found were not immediately available.\n", - "3\tIn the statement, Courtier’s relatives said they were “overjoyed” that she’d been found.\n", - "4\tCourtier, of Los Angeles, disappeared after a private shuttle dropped her off on Oct. 6. at the Grotto park area inside the 232-square-mile national park.\n", - "5\tShe was scheduled to be picked up later that afternoon but didn't show up, park officials said.\n", - "6\tThe search included K.9. units and federal, state and local rescue teams;\n", - "7\tVolunteers also joined the effort.\n", - "\n", - "with Spacy Sentence Detection\n", - "===================================\n", - "0 \t A California woman who vanished in Utah’s Zion National Park earlier,this month was found and reunited with her family officials said Sunday.\n", - "1 \t Holly Suzanne Courtier, 38, was located within the park after a visitor saw her and alerted rangers, the National.\n", - "2 \t Park Service said in a statement.\n", - "3 \t Additional details about how she survived or where she was found were not immediately available.\n", - "4 \t In the statement, Courtier’s relatives said they were “overjoyed” that she’d been found.\n", - "5 \t Courtier, of Los Angeles, disappeared after a private shuttle dropped her off on Oct. 6.\n", - "6 \t at the Grotto park area inside the 232-square-mile national park.\n", - "7 \t She was scheduled to be picked up later that afternoon but didn't show up, park officials said.\n", - "8 \t The search included K.9.\n", - "9 \t units and federal, state and local rescue teams; Volunteers also joined the effort.\n" - ] - } - ], - "source": [ - "random_broken_text = '''\n", - "A California woman who vanished in Utah’s Zion National Park earlier,\n", - "this month was found and reunited with her family \n", - "officials said Sunday. Holly Suzanne Courtier, \n", - "38, was located within the park after a visitor saw \n", - "her and alerted rangers, the National. Park Service said in a statement.\n", - "Additional details about how she \n", - "survived or where she was found were not immediately available. In the statement, \n", - "Courtier’s relatives said they were “overjoyed” that she’d been found.\n", - "Courtier, of Los Angeles, disappeared after a private shuttle dropped her off on Oct. 6. at the Grotto park area \n", - "inside the 232-square-mile national park. She was scheduled to be picked up later that \n", - "afternoon but didn't show up, park officials said. The search included K.9. units and federal, \n", - "state and local rescue teams; Volunteers also joined the effort.\n", - "'''\n", - "\n", - "print ('with Spark NLP SentenceDetectorDL')\n", - "print ('===================================')\n", - "\n", - "for anno in sd_model.fullAnnotate(random_broken_text)[0][\"sentences\"]:\n", - " \n", - " print(\"{}\\t{}\".format(\n", - " anno.metadata[\"sentence\"], anno.result.replace('\\n',''))) # removing \\n to beutify printing\n", - "\n", - "print()\n", - "print ('with Spacy Sentence Detection')\n", - "print ('===================================')\n", - "for i,sent in enumerate(nlp(random_broken_text).sents):\n", - " print(i, '\\t',str(sent).replace('\\n',''))# removing \\n to beutify printing" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "WiU0yHsvmxSv" - }, - "source": [ - "## Multilanguage Sentence Detector DL" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 6293, - "status": "ok", - "timestamp": 1664975064334, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "ULFgE7KmkbMa", - "outputId": "42e9545e-4542-470c-fb5c-a3d3b9d537d0" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sentence_detector_dl download started this may take some time.\n", - "Approximate size to download 514.9 KB\n", - "[OK!]\n" - ] - } - ], - "source": [ - "sentencerDL_multilang = SentenceDetectorDLModel\\\n", - " .pretrained(\"sentence_detector_dl\", \"xx\") \\\n", - " .setInputCols([\"document\"]) \\\n", - " .setOutputCol(\"sentences\")\n", - "\n", - "sd_pipeline_multi = PipelineModel(stages=[documenter, sentencerDL_multilang])\n", - "\n", - "sd_model_multi = LightPipeline(sd_pipeline_multi)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 758, - "status": "ok", - "timestamp": 1664975065076, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "YPR4MqEZbPo7", - "outputId": "bd3410e4-5c56-4c82-9c86-af3a6e676c33" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "with Spark NLP SentenceDetectorDL\n", - "===================================\n", - "0\tΌπως ίσως θα γνωρίζει, όταν εγκαθιστάς μια νέα εφαρμογή, θα έχεις διαπιστώσει λίγο μετά, ότι το PC αρχίζει να επιβραδύνεται.\n", - "1\tΣτη συνέχεια, όταν επισκέπτεσαι την οθόνη ή από την διαχείριση εργασιών, θα διαπιστώσεις ότι η εν λόγω εφαρμογή έχει προστεθεί στη λίστα των προγραμμάτων που εκκινούν αυτόματα, όταν ξεκινάς το PC.\n", - "2\tΠροφανώς, κάτι τέτοιο δεν αποτελεί μια ιδανική κατάσταση, ιδίως για τους λιγότερο γνώστες, οι οποίοι ίσως δεν θα συνειδητοποιήσουν ότι κάτι τέτοιο συνέβη.\n", - "3\tΌσο περισσότερες εφαρμογές στη λίστα αυτή, τόσο πιο αργή γίνεται η εκκίνηση, ιδίως αν πρόκειται για απαιτητικές εφαρμογές.\n", - "4\tΤα ευχάριστα νέα είναι ότι η τελευταία και πιο πρόσφατη preview build της έκδοσης των Windows 10 που θα καταφθάσει στο πρώτο μισό του 2021, οι εφαρμογές θα ενημερώνουν το χρήστη ότι έχουν προστεθεί στη λίστα των εφαρμογών που εκκινούν μόλις ανοίγεις το PC.\n", - "\n", - "with Spacy Sentence Detection\n", - "===================================\n", - "0 \t Όπως ίσως θα γνωρίζει, όταν εγκαθιστάς μια νέα εφαρμογή, θα έχεις διαπιστώσει λίγο μετά, ότι το PC αρχίζει να επιβραδύνεται.\n", - "1 \t Στη συνέχεια, όταν επισκέπτεσαι την οθόνη ή από την διαχείριση εργασιών, θα διαπιστώσεις ότι η εν λόγω εφαρμογή έχει προστεθεί στη λίστα των προγραμμάτων που εκκινούν αυτόματα, όταν ξεκινάς το PC.Προφανώς, κάτι τέτοιο δεν αποτελεί μια ιδανική κατάσταση, ιδίως για τους λιγότερο γνώστες, οι οποίοι ίσως δεν θα συνειδητοποιήσουν ότι κάτι τέτοιο συνέβη.\n", - "2 \t Όσο περισσότερες εφαρμογές στη λίστα αυτή, τόσο πιο αργή γίνεται η εκκίνηση, ιδίως αν πρόκειται για απαιτητικές εφαρμογές.\n", - "3 \t Τα ευχάριστα νέα είναι ότι η τελευταία και πιο πρόσφατη preview build της έκδοσης των Windows 10 που θα καταφθάσει\n", - "4 \t στο πρώτο μισό του 2021, οι εφαρμογές θα ενημερώνουν το χρήστη ότι έχουν προστεθεί στη λίστα των εφαρμογών που εκκινούν μόλις ανοίγεις το PC.\n" - ] - } - ], - "source": [ - "gr_text= '''\n", - "Όπως ίσως θα γνωρίζει, όταν εγκαθιστάς μια νέα εφαρμογή, θα έχεις διαπιστώσει \n", - "λίγο μετά, ότι το PC αρχίζει να επιβραδύνεται. Στη συνέχεια, όταν επισκέπτεσαι την οθόνη ή από την διαχείριση εργασιών, θα διαπιστώσεις ότι η εν λόγω εφαρμογή έχει προστεθεί στη \n", - "λίστα των προγραμμάτων που εκκινούν αυτόματα, όταν ξεκινάς το PC.\n", - "Προφανώς, κάτι τέτοιο δεν αποτελεί μια ιδανική κατάσταση, ιδίως για τους λιγότερο γνώστες, οι \n", - "οποίοι ίσως δεν θα συνειδητοποιήσουν ότι κάτι τέτοιο συνέβη. Όσο περισσότερες εφαρμογές στη λίστα αυτή, τόσο πιο αργή γίνεται η \n", - "εκκίνηση, ιδίως αν πρόκειται για απαιτητικές εφαρμογές. Τα ευχάριστα νέα είναι ότι η τελευταία και πιο πρόσφατη preview build της έκδοσης των Windows 10 που θα καταφθάσει στο πρώτο μισό του 2021, οι εφαρμογές θα \n", - "ενημερώνουν το χρήστη ότι έχουν προστεθεί στη λίστα των εφαρμογών που εκκινούν μόλις ανοίγεις το PC.\n", - "'''\n", - "\n", - "print ('with Spark NLP SentenceDetectorDL')\n", - "print ('===================================')\n", - "\n", - "for anno in sd_model_multi.fullAnnotate(gr_text)[0][\"sentences\"]:\n", - " \n", - " print(\"{}\\t{}\".format(\n", - " anno.metadata[\"sentence\"], anno.result.replace('\\n',''))) # removing \\n to beutify printing\n", - "\n", - "print()\n", - "print ('with Spacy Sentence Detection')\n", - "print ('===================================')\n", - "for i,sent in enumerate(nlp(gr_text).sents):\n", - " print(i, '\\t',str(sent).replace('\\n',''))# removing \\n to beutify printing" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "executionInfo": { - "elapsed": 9, - "status": "ok", - "timestamp": 1664975065077, - "user": { - "displayName": "Halil SAGLAMLAR", - "userId": "07259164328506563794" - }, - "user_tz": -180 - }, - "id": "sUc7n1wsktJs", - "outputId": "aeb2e4b3-1696-4025-829c-6f8ea9dac4b8" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "with Spark NLP SentenceDetectorDL\n", - "===================================\n", - "0\tB чeтвъpтъĸ Gооglе oбяви няĸoлĸo aĸтyaлизaции нa cвoятa тъpcaчĸa, зaявявaйĸи чe e въвeлa изĸycтвeн интeлeĸт (Аl) и мaшиннo oбyчeниe зa пoдoбpявaнe нa пoтpeбитeлcĸoтo изживявaнe.\n", - "1\tΠoтpeбитeлитe вeчe мoгaт дa cи тaнaниĸaт, cвиpят или пeят мeлoдия нa пeceн нa Gооglе чpeз мoбилнoтo пpилoжeниe, ĸaтo дoĸocнaт иĸoнaтa нa миĸpoфoнa и зaдaдaт въпpoca: Koя e тaзи пeceн?\n", - "2\tTaнaниĸaнeтo в пpoдължeниe нa 10-15 ceĸyнди щe дaдe шaнc нa aлгopитъмa c мaшиннo oбyчeниe нa Gооglе дa нaмepи и извeдe peзyлтaт ĸoя e пpипявaнaтa пeceн.\n", - "3\tΠoнacтoящeм фyнĸциятa e дocтъпнa нa aнглийcĸи eзиĸ зa Іоѕ и нa oĸoлo 20 eзиĸa зa Аndrоіd, ĸaтo в бъдeщe и зa двeтe oпepaциoнни cиcтeми щe бъдe пpeдлoжeн eднaĸъв нaбop oт пoддъpжaни eзици, ĸaзвaт oт Gооglе.\n", - "4\tAl aĸтyaлизaциитe нa тъpceщия гигaнт cъщo oбxвaщaт пpaвoпиca и oбщитe зaявĸи зa тъpceнe.\n", - "5\tCpeд пoдoбpeниятa e вĸлючeн нoв пpaвoпиceн aлгopитъм, ĸoйтo изпoлзвa нeвpoннa мpeжa c дълбoĸo oбyчeниe, зa ĸoятo Gооglе твъpди, чe идвa cъc знaчитeлнo пoдoбpeнa cпocoбнocт зa дeшифpиpaнe нa пpaвoпиcни гpeшĸи.\n", - "\n", - "with Spacy Sentence Detection\n", - "===================================\n", - "0 \t B чeтвъpтъĸ Gооglе oбяви няĸoлĸo aĸтyaлизaции нa cвoятa тъpcaчĸa, зaявявaйĸи чe e въвeлa изĸycтвeн интeлeĸт\n", - "1 \t (Аl) и мaшиннo oбyчeниe зa пoдoбpявaнe нa пoтpeбитeлcĸoтo изживявaнe.\n", - "2 \t Πoтpeбитeлитe вeчe мoгaт дa cи тaнaниĸaт, cвиpят или пeят мeлoдия нa пeceн нa Gооglе чpeз мoбилнoтo пpилoжeниe, ĸaтo дoĸocнaт иĸoнaтa нa миĸpoфoнa и зaдaдaт въпpoca:\n", - "3 \t Koя e тaзи пeceн?Taнaниĸaнeтo в пpoдължeниe нa 10-15 ceĸyнди щe дaдe шaнc нa aлгopитъмa c мaшиннo oбyчeниe\n", - "4 \t нa\n", - "5 \t Gооglе дa нaмepи и извeдe peзyлтaт ĸoя e пpипявaнaтa пeceн.\n", - "6 \t Πoнacтoящeм фyнĸциятa e дocтъпнa нa aнглийcĸи eзиĸ\n", - "7 \t зa\n", - "8 \t Іоѕ и нa oĸoлo 20 eзиĸa зa Аndrоіd, ĸaтo в бъдeщe и зa двeтe oпepaциoнни cиcтeми щe бъдe пpeдлoжeн eднaĸъв нaбop oт пoддъpжaни eзици, ĸaзвaт oт Gооglе.\n", - "9 \t Al aĸтyaлизaциитe нa тъpceщия гигaнт cъщo oбxвaщaт пpaвoпиca и oбщитe зaявĸи зa тъpceнe.\n", - "10 \t Cpeд пoдoбpeниятa e вĸлючeн нoв пpaвoпиceн aлгopитъм, ĸoйтo изпoлзвa нeвpoннa мpeжa c дълбoĸo oбyчeниe, зa ĸoятo Gооglе твъpди, чe идвa cъc знaчитeлнo пoдoбpeнa cпocoбнocт\n", - "11 \t зa дeшифpиpaнe\n", - "12 \t нa пpaвoпиcни гpeшĸи.\n" - ] - } - ], - "source": [ - "cyrillic_text = '''\n", - "B чeтвъpтъĸ Gооglе oбяви няĸoлĸo aĸтyaлизaции нa cвoятa тъpcaчĸa, зaявявaйĸи чe e \n", - "въвeлa изĸycтвeн интeлeĸт (Аl) и мaшиннo oбyчeниe зa пoдoбpявaнe нa пoтpeбитeлcĸoтo изживявaнe.\n", - "Πoтpeбитeлитe вeчe мoгaт дa cи тaнaниĸaт, cвиpят или пeят мeлoдия нa пeceн нa Gооglе чpeз мoбилнoтo пpилoжeниe, \n", - "ĸaтo дoĸocнaт иĸoнaтa нa миĸpoфoнa и зaдaдaт въпpoca: Koя e тaзи пeceн?\n", - "Taнaниĸaнeтo в пpoдължeниe нa 10-15 ceĸyнди щe дaдe шaнc нa aлгopитъмa c мaшиннo oбyчeниe нa Gооglе дa нaмepи и извeдe peзyлтaт ĸoя e пpипявaнaтa пeceн.\n", - "Πoнacтoящeм фyнĸциятa e дocтъпнa нa aнглийcĸи eзиĸ зa Іоѕ и нa oĸoлo 20 eзиĸa зa Аndrоіd, \n", - "ĸaтo в бъдeщe и зa двeтe oпepaциoнни cиcтeми щe бъдe пpeдлoжeн eднaĸъв нaбop oт пoддъpжaни eзици, ĸaзвaт oт Gооglе.\n", - "Al aĸтyaлизaциитe нa тъpceщия гигaнт cъщo oбxвaщaт пpaвoпиca и oбщитe зaявĸи зa тъpceнe.\n", - "Cpeд пoдoбpeниятa e вĸлючeн нoв пpaвoпиceн aлгopитъм, ĸoйтo изпoлзвa нeвpoннa мpeжa \n", - "c дълбoĸo oбyчeниe, зa ĸoятo Gооglе твъpди, чe идвa cъc знaчитeлнo пoдoбpeнa cпocoбнocт зa \n", - "дeшифpиpaнe нa пpaвoпиcни гpeшĸи.\n", - "'''\n", - "\n", - "print ('with Spark NLP SentenceDetectorDL')\n", - "print ('===================================')\n", - "\n", - "for anno in sd_model_multi.fullAnnotate(cyrillic_text)[0][\"sentences\"]:\n", - " \n", - " print(\"{}\\t{}\".format(\n", - " anno.metadata[\"sentence\"], anno.result.replace('\\n',''))) # removing \\n to beutify printing\n", - "\n", - "print()\n", - "print ('with Spacy Sentence Detection')\n", - "print ('===================================')\n", - "for i,sent in enumerate(nlp(cyrillic_text).sents):\n", - " print(i, '\\t',str(sent).replace('\\n',''))# removing \\n to beutify printing" - ] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "collapsed_sections": [], - "provenance": [] - }, - "kernelspec": { - "display_name": "base", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.12 (main, Apr 5 2022, 06:56:58) \n[GCC 7.5.0]" - }, - "vscode": { - "interpreter": { - "hash": "3d597f4c481aa0f25dceb95d2a0067e73c0966dcbd003d741d821a7208527ecf" - } - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/examples/python/annotation/text/english/named-entity-recognition/ZeroShot_NER.ipynb b/examples/python/annotation/text/english/named-entity-recognition/ZeroShot_NER.ipynb new file mode 100644 index 00000000000000..fe22efffec7348 --- /dev/null +++ b/examples/python/annotation/text/english/named-entity-recognition/ZeroShot_NER.ipynb @@ -0,0 +1,275 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "db5f4f9a-7776-42b3-8758-85624d4c15ea", + "metadata": {}, + "source": [ + "![JohnSnowLabs](https://johnsnowlabs.com/assets/images/logo.png)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "21e9eafb", + "metadata": {}, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/spark-nlp/blob/master/examples/python/annotation/text/english/named-entity-recognition/ZeroShot_NER.ipynb)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "212325cc-182f-4565-abed-9b46864d6d69", + "metadata": {}, + "source": [ + "# Named Entity Recognition with ZeroShotNer" + ] + }, + { + "cell_type": "markdown", + "id": "216EshxBJ9ra", + "metadata": {}, + "source": [ + "## Colab Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6e6c12b", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -q pyspark==3.3.0 spark-nlp==4.3.0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc39c840", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Spark NLP version: 4.2.8\n", + "Apache Spark version: 3.3.0\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "

SparkSession - in-memory

\n", + " \n", + "
\n", + "

SparkContext

\n", + "\n", + "

Spark UI

\n", + "\n", + "
\n", + "
Version
\n", + "
v3.3.0
\n", + "
Master
\n", + "
local[*]
\n", + "
AppName
\n", + "
Spark NLP
\n", + "
\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sparknlp\n", + "\n", + "spark = sparknlp.start()\n", + "\n", + "print(\"Spark NLP version: \", sparknlp.version())\n", + "print(\"Apache Spark version: \", spark.version)\n", + "\n", + "spark" + ] + }, + { + "cell_type": "markdown", + "id": "5a32aee6", + "metadata": {}, + "source": [ + "# Zero-shot Named Entity Recognition" + ] + }, + { + "cell_type": "markdown", + "id": "43420eee-1c29-4148-b1c8-fa7884eff9b3", + "metadata": {}, + "source": [ + "`Zero-shot` is a new inference paradigm which allows us to use a model for prediction without any previous training step.\n", + "\n", + "For doing that, several examples (_hypotheses_) are provided and sent to the Language model, which will use `NLI (Natural Language Inference)` to check if the any information found in the text matches the examples (confirm the hypotheses).\n", + "\n", + "NLI usually works by trying to _confirm or reject an hypotheses_. The _hypotheses_ are the `prompts` or examples we are going to provide. If any piece of information confirm the constructed hypotheses (answer the examples we are given), then the hypotheses is confirmed and the Zero-shot is triggered.\n", + "\n", + "Let's see it in action.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2948d346-d522-43b9-9cd7-99430882621f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "finner_roberta_zeroshot download started this may take some time.\n", + "[OK!]\n" + ] + } + ], + "source": [ + "from sparknlp.base import *\n", + "from sparknlp.annotator import *\n", + "from pyspark.ml import Pipeline\n", + "\n", + "documentAssembler = DocumentAssembler()\\\n", + " .setInputCol(\"text\")\\\n", + " .setOutputCol(\"document\")\n", + "\n", + "sen = SentenceDetector()\\\n", + " .setInputCols([\"document\"])\\\n", + " .setOutputCol(\"sentence\")\n", + "\n", + "sparktokenizer = Tokenizer()\\\n", + " .setInputCols(\"sentence\")\\\n", + " .setOutputCol(\"token\")\n", + "\n", + "zero_shot_ner = ZeroShotNerModel.pretrained(\"finner_roberta_zeroshot\", \"en\")\\\n", + " .setInputCols([\"sentence\", \"token\"])\\\n", + " .setOutputCol(\"zero_shot_ner\")\\\n", + " .setEntityDefinitions(\n", + " {\n", + " \"DATE\": ['When was the company acquisition?', 'When was the company purchase agreement?'],\n", + " \"ORG\": [\"Which company was acquired?\"],\n", + " \"PRODUCT\": [\"Which product?\"],\n", + " \"PROFIT_INCREASE\": [\"How much has the gross profit increased?\"],\n", + " \"REVENUES_DECLINED\": [\"How much has the revenues declined?\"],\n", + " \"OPERATING_LOSS_2020\": [\"Which was the operating loss in 2020\"],\n", + " \"OPERATING_LOSS_2019\": [\"Which was the operating loss in 2019\"]\n", + " })\n", + "\n", + "nerconverter = NerConverter()\\\n", + " .setInputCols([\"sentence\", \"token\", \"zero_shot_ner\"])\\\n", + " .setOutputCol(\"ner_chunk\")\n", + "\n", + "pipeline = Pipeline(stages=[\n", + " documentAssembler,\n", + " sen,\n", + " sparktokenizer,\n", + " zero_shot_ner,\n", + " nerconverter\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b005b29f-f0c0-44dd-baac-590166d6bf8c", + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.sql.types import StructType,StructField, StringType\n", + "sample_text = [\"In March 2012, as part of a longer-term strategy, the Company acquired Vertro, Inc., which owned and operated the ALOT product portfolio.\",\n", + " \"In February 2017, the Company entered into an asset purchase agreement with NetSeer, Inc.\",\n", + " \"While our gross profit margin increased to 81.4% in 2020 from 63.1% in 2019, our revenues declined approximately 27% in 2020 as compared to 2019.\",\n", + " \"We reported an operating loss of approximately $8,048,581 million in 2020 as compared to an operating loss of $7,738,193 in 2019.\"]\n", + "\n", + "p_model = pipeline.fit(spark.createDataFrame([[\"\"]]).toDF(\"text\"))\n", + "\n", + "res = p_model.transform(spark.createDataFrame(sample_text, StringType()).toDF(\"text\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "183fb2db-1cee-4f78-a486-dd6c9f6abd57", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+------------------+-------------------+\n", + "|chunk |ner_label |\n", + "+------------------+-------------------+\n", + "|March 2012 |DATE |\n", + "|Vertro |ORG |\n", + "|ALOT |PRODUCT |\n", + "|February 2017 |DATE |\n", + "|NetSeer |ORG |\n", + "|81.4% |PROFIT_INCREASE |\n", + "|27% |REVENUES_DECLINED |\n", + "|$8,048,581 million|OPERATING_LOSS_2020|\n", + "|$7,738,193 |OPERATING_LOSS_2019|\n", + "|2019 |DATE |\n", + "+------------------+-------------------+\n", + "\n" + ] + } + ], + "source": [ + "from pyspark.sql import functions as F\n", + "\n", + "res.select(F.explode(F.arrays_zip(res.ner_chunk.result, res.ner_chunk.begin, res.ner_chunk.end, res.ner_chunk.metadata)).alias(\"cols\")) \\\n", + " .select(F.expr(\"cols['0']\").alias(\"chunk\"),\n", + " F.expr(\"cols['3']['entity']\").alias(\"ner_label\"))\\\n", + " .filter(\"ner_label!='O'\")\\\n", + " .show(truncate=False)" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "provenance": [] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "nlpdev", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + }, + "vscode": { + "interpreter": { + "hash": "cf73c0c97d90b2660ff29b0c9bed4b851524d3484a00df4555e25832aa5cf188" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/python/sparknlp/annotator/ner/zero_shot_ner_model.py b/python/sparknlp/annotator/ner/zero_shot_ner_model.py index 508f33820c32ef..91412258299775 100644 --- a/python/sparknlp/annotator/ner/zero_shot_ner_model.py +++ b/python/sparknlp/annotator/ner/zero_shot_ner_model.py @@ -25,6 +25,9 @@ class ZeroShotNerModel(RoBertaForQuestionAnswering, HasEngine): specifying a set of questions for each entity. The model is based on RoBertaForQuestionAnswering. + For more extended examples see the + `Examples `__. + Pretrained models can be loaded with ``pretrained`` of the companion object: .. code-block:: python diff --git a/src/main/scala/com/johnsnowlabs/nlp/annotators/ner/dl/ZeroShotNerModel.scala b/src/main/scala/com/johnsnowlabs/nlp/annotators/ner/dl/ZeroShotNerModel.scala index b99a7809e81f43..2dd777c72510fb 100644 --- a/src/main/scala/com/johnsnowlabs/nlp/annotators/ner/dl/ZeroShotNerModel.scala +++ b/src/main/scala/com/johnsnowlabs/nlp/annotators/ner/dl/ZeroShotNerModel.scala @@ -40,6 +40,9 @@ import scala.collection.JavaConverters._ * specifying a set of questions for each entity. The model is based on * RoBertaForQuestionAnswering. * + * For more extended examples see the + * [[https://github.com/JohnSnowLabs/spark-nlp/blob/master/examples/python/annotation/text/english/named-entity-recognition/ZeroShot_NER.ipynb Examples]] + * * Pretrained models can be loaded with `pretrained` of the companion object: * {{{ * val zeroShotNer = ZeroShotNerModel.pretrained()