Построение моделей классификации текста с помощью Spark-NLP

машинное обучение

Автор|ГОСТ Компилировать|ВКонтакте Источник | Аналитика Видья

Обзор

  • Создайте Spark NLP от John Snow Labs на AWS Electronic Medical Records и используйте библиотеку для выполнения простой текстовой классификации статей BBC.

вводить

Обработка естественного языка — один из важных процессов для групп специалистов по данным по всему миру. Поскольку данные продолжают расти, большинство организаций перешли на платформы больших данных, такие как apache hadoop, и облачные предложения, такие как AWS, Azure и GCP.

Эти платформы не только способны обрабатывать большие данные, но и позволяют организациям выполнять крупномасштабную аналитику неструктурированных данных, таких как классификация текста. Но когда дело доходит до машинного обучения, между системами больших данных и инструментами машинного обучения все еще существует разрыв.

Популярные библиотеки Python для машинного обучения, такие как scikit-learn и Gensim, оптимизированы для работы на одном компьютере и не предназначены для распределенных сред.

Apache Spark MLlib — это один из многих инструментов, которые помогают заполнить этот пробел, предоставляя большинство моделей машинного обучения, таких как линейная регрессия, логистическая регрессия, машины опорных векторов, случайные леса, K-средние, LDA и т. д., для выполнения наиболее распространенных машинного обучения. задания.

Помимо алгоритмов машинного обучения, Spark MLlib также предоставляет большое количество преобразователей признаков, таких как Tokenizer, StopWordRemover, n-grams and countvector, TF-IDF и Word2Vec и т. д.

Хотя этих преобразователей и экстракторов достаточно для построения базового конвейера НЛП, для построения более комплексного и производственного конвейера нам нужны более продвинутые методы, такие как определение стемминга, лексикализация, тегирование частей речи и распознавание именованных сущностей.

Spark NLP предоставляет различные аннотаторы для выполнения сложных задач NLP. Для получения дополнительной информации см. список аннотаторов и их использование на веб-сайте.

НЛП. Джон Сноу labs.com/docs/en/buttons…

Настройка среды

Давайте перейдем к тому, как настроить Spark NLP на AWS EMR.

1. Перед запуском кластера EMR нам нужно создать действие начальной загрузки. Действия начальной загрузки используются для установки дополнительного программного обеспечения или настройки конфигурации узлов кластера. Ниже приведены действия начальной загрузки, которые можно использовать для настройки Spark NLP в кластере EMR.

#!/bin/bashsudo yum install -y python36-devel python36-pip python36-setuptools python36-virtualenvsudo python36 -m pip install --upgrade pip
#
sudo python36 -m pip install pandas
#
sudo python36 -m pip install boto3
#
sudo python36 -m pip install re
#
sudo python36 -m pip install spark-nlp==2.4.5

После создания сценария оболочки скопируйте его в папку на AWS S3. Вы также можете установить другие пакеты Python по мере необходимости.

2. Мы можем использовать консоль AWS, API или библиотеку boto3 в python для запуска кластера EMR. Преимущество использования Python заключается в том, что код можно повторно использовать всякий раз, когда необходимо создать экземпляр кластера или добавить его в рабочий процесс.

Ниже приведен код Python для создания экземпляра кластера EMR.

import boto3region_name='region_name'def get_security_group_id(group_name, region_name):
    ec2 = boto3.client('ec2', region_name=region_name)
    response = ec2.describe_security_groups(GroupNames=[group_name])
    return response['SecurityGroups'][0]['GroupId']emr = boto3.client('emr', region_name=region_name)cluster_response = emr.run_job_flow(
        Name='cluster_name', # 更新值
        ReleaseLabel='emr-5.27.0',
        LogUri='s3_path_for_logs', # 更新值
        Instances={
            'InstanceGroups': [
                {
                    'Name': "Master nodes",
                    'Market': 'ON_DEMAND',
                    'InstanceRole': 'MASTER',
                    'InstanceType': 'm5.2xlarge', # 根据要求进行变更
                    'InstanceCount': 1 #对于主节点高可用性,设置计数大于1
                },
                {
                    'Name': "Slave nodes",
                    'Market': 'ON_DEMAND',
                    'InstanceRole': 'CORE',
                    'InstanceType': 'm5.2xlarge', # 根据要求进行变更
                    'InstanceCount': 2
                }
            ],
            'KeepJobFlowAliveWhenNoSteps': True,
            'Ec2KeyName' : 'key_pair_name', # 更新值
            'EmrManagedMasterSecurityGroup': get_security_group_id('ElasticMapReduce-master', region_name=region_name)
            'EmrManagedSlaveSecurityGroup': get_security_group_id('ElasticMapReduce-master', region_name=region_name)
        },
        BootstrapActions=[    {
                    'Name':'install_dependencies',
                    'ScriptBootstrapAction':{
                            'Args':[],
                            'Path':'path_to_bootstrapaction_on_s3' # 更新值
                            }
                }],
        Steps = [],
        VisibleToAllUsers=True,
        JobFlowRole='EMR_EC2_DefaultRole',
        ServiceRole='EMR_DefaultRole',
        Applications=[
            { 'Name': 'hadoop' },
            { 'Name': 'spark' },
            { 'Name': 'hive' },
            { 'Name': 'zeppelin' },
            { 'Name': 'presto' }
        ],
        Configurations=[
            # YARN
            {
                "Classification": "yarn-site", 
                "Properties": {"yarn.nodemanager.vmem-pmem-ratio": "4",
                               "yarn.nodemanager.pmem-check-enabled": "false",
                               "yarn.nodemanager.vmem-check-enabled": "false"}
            },

            # HADOOP
            {
                "Classification": "hadoop-env", 
                "Configurations": [
                        {
                            "Classification": "export", 
                            "Configurations": [], 
                            "Properties": {"JAVA_HOME": "/usr/lib/jvm/java-1.8.0"}
                        }
                    ], 
                "Properties": {}
            },

            # SPARK
            {
                "Classification": "spark-env", 
                "Configurations": [
                        {
                            "Classification": "export", 
                            "Configurations": [], 
                            "Properties": {"PYSPARK_PYTHON":"/usr/bin/python3",
                                           "JAVA_HOME": "/usr/lib/jvm/java-1.8.0"}
                        }
                    ], 
                "Properties": {}
            },
            {
                "Classification": "spark",
                "Properties": {"maximizeResourceAllocation": "true"},
                "Configurations": []
             },
            {
                "Classification": "spark-defaults",
                "Properties": {
                    "spark.dynamicAllocation.enabled": "true" #default is also true
                }
            }
        ]
    )

Примечание. Убедитесь, что у вас есть правильный доступ к корзине S3, используемой для регистрации и хранения сценариев действий начальной загрузки.

Классификация текстов статей BBC на основе Spark-NLP

Теперь, когда у нас есть готовый кластер, давайте создадим простой пример классификации текста на данных BBC, используя Spark NLP и Spark MLlib.

1. Инициализировать искру

Мы импортируем необходимые библиотеки и инициализируем сеанс spark с другими параметрами конфигурации. Значения конфигурации зависят от моей локальной среды. Отрегулируйте параметры соответствующим образом.

# 导入Spark NLP
from sparknlp.base import *
from sparknlp.annotator import *
from sparknlp.pretrained import PretrainedPipeline
import sparknlp
from pyspark.sql import SparkSession
from pyspark.ml import Pipeline# 使用Spark NLP启动Spark会话
#spark = sparknlp.start()spark = SparkSession.builder \
    .appName("BBC Text Categorization")\
    .config("spark.driver.memory","8G")\ change accordingly
    .config("spark.memory.offHeap.enabled",True)\
    .config("spark.memory.offHeap.size","8G") \
    .config("spark.driver.maxResultSize", "2G") \
    .config("spark.jars.packages", "com.johnsnowlabs.nlp:spark-nlp_2.11:2.4.5")\
    .config("spark.kryoserializer.buffer.max", "1000M")\
    .config("spark.network.timeout","3600s")\
    .getOrCreate()

2. Загрузите текстовые данные

Мы будем использовать данные BBC. Вы можете скачать данные по этой ссылке. После загрузки следующих данных используйте искровой код для загрузки;

woohoo.kareform.com/v с ветром/нет…

# 文件位置和类型
file_location = r'path\to\bbc-text.csv'
file_type = "csv"# CSV
infer_schema = "true"
first_row_is_header = "true"
delimiter = ","df = spark.read.format(file_type) \
  .option("inferSchema", infer_schema) \
  .option("header", first_row_is_header) \
  .option("sep", delimiter) \
  .load(file_location)df.count()

3. Разделите набор данных на обучающий и тестовый наборы.

В отличие от python, использующего scikit, учится разделять данные, Spark Dataframe имеет встроенную функциюrandomSplit()для выполнения той же операции.

(trainingData, testData) = df.randomSplit([0.7, 0.3], seed = 100)

Функция randomSplit() принимает два аргумента, а именно. Массив весов и начальное число. В нашем примере мы будем использовать разделение 70/30, где 70% — это обучающие данные, а 30% — тестовые данные.

4. Конвейер NLP с использованием Spark NLP

Давайте перейдем к построению конвейера NLP с использованием Spark NLP. Одним из самых больших преимуществ Spark NLP является его естественная интеграция с модулем Spark MLLib, который помогает создавать комплексные конвейеры машинного обучения, состоящие из преобразователей и оценщиков.

Этот конвейер может включать модули извлечения признаков, такие как CountVectorizer или HashingTF и IDF. Мы также можем включить в этот конвейер модель машинного обучения.

Ниже приведен пример, состоящий из конвейера NLP с моделями извлечения признаков и машинного обучения;

from pyspark.ml.feature import HashingTF, IDF, StringIndexer, SQLTransformer,IndexToString
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import MulticlassClassificationEvaluator# 转换text列为nlp文件
document_assembler = DocumentAssembler() \
    .setInputCol("text") \
    .setOutputCol("document")#将文档转换为标识数组
tokenizer = Tokenizer() \
  .setInputCols(["document"]) \
  .setOutputCol("token")

# 清理标识
normalizer = Normalizer() \
    .setInputCols(["token"]) \
    .setOutputCol("normalized")# 删除停用词
stopwords_cleaner = StopWordsCleaner()\
      .setInputCols("normalized")\
      .setOutputCol("cleanTokens")\
      .setCaseSensitive(False)
stemmer = Stemmer() \
    .setInputCols(["cleanTokens"]) \
    .setOutputCol("stem")# 将自定义文档结构转换为标识数组。
finisher = Finisher() \
    .setInputCols(["stem"]) \
    .setOutputCols(["token_features"]) \
    .setOutputAsArray(True) \
    .setCleanAnnotations(False)# 生成频率
hashingTF = HashingTF(inputCol="token_features", outputCol="rawFeatures", numFeatures=1000)# 生成逆文档频率
idf = IDF(inputCol="rawFeatures", outputCol="features", minDocFreq=5)# 将标签(字符串)转换为整数。
label_stringIdx = StringIndexer(inputCol = "category", outputCol = "label")# 定义一个简单的多项式逻辑回归模型。尝试不同的超参数组合,看看哪个更适合你的数据。你也可以尝试不同的算法来比较分数。
lr = LogisticRegression(maxIter=10, regParam=0.3, elasticNetParam=0.0)# 将索引(整数)转换为相应的类标签
label_to_stringIdx = IndexToString(inputCol="label", outputCol="article_class")# 定义nlp管道
nlp_pipeline = Pipeline(
    stages=[document_assembler, 
            tokenizer,
            normalizer,
            stopwords_cleaner, 
            stemmer, 
            finisher,
            hashingTF,
            idf,
            label_stringIdx,
            lr,
            label_to_stringIdx])

5. Обучите модель

Теперь, когда наш конвейер НЛП готов, давайте обучим нашу модель на обучающих данных.

# 在训练数据上拟合管道
pipeline_model = nlp_pipeline.fit(trainingData)

6. Выполняйте прогнозы

После завершения обучения мы можем предсказать метки классов на тестовых данных.

# 对测试数据进行预测
predictions =  pipeline_model.transform(testData)

7. Оцените модель

Оценка обученной модели очень важна для понимания того, как модель работает с невидимыми данными. Мы рассмотрим 3 популярных показателя оценки: точность, точность и полнота.

  1. Точность
# 导入evaluator
from pyspark.ml.evaluation import MulticlassClassificationEvaluatorevaluator = MulticlassClassificationEvaluator(
    labelCol="label", predictionCol="prediction", metricName="accuracy")
accuracy = evaluator.evaluate(predictions)
print("Accuracy = %g" % (accuracy))
print("Test Error = %g " % (1.0 - accuracy))

  1. Точность
evaluator = MulticlassClassificationEvaluator(
    labelCol="label", predictionCol="prediction", metricName="weightedPrecision")
accuracy = evaluator.evaluate(predictions)
print("Accuracy = %g" % (accuracy))
print("Test Error = %g " % (1.0 - accuracy))

  1. отзывать
evaluator = MulticlassClassificationEvaluator(
    labelCol="label", predictionCol="prediction", metricName="weightedRecall")
accuracy = evaluator.evaluate(predictions)
print("Accuracy = %g" % (accuracy))
print("Test Error = %g " % (1.0 - accuracy))

В зависимости от варианта использования в бизнесе вы можете решить, какую метрику использовать для оценки модели.

Например, если модель машинного обучения предназначена для выявления рака по определенным параметрам, то лучше использовать отзыв, потому что компания не может допустить ложноотрицательных результатов (человек болен раком, а модель не обнаруживает рак), а если машина модели обучения предназначены для создания пользовательских рекомендаций, и компании могут позволить себе ложные срабатывания (8 из 10 рекомендаций соответствуют профилям пользователей), поэтому точность можно использовать в качестве метрики оценки.

8. Сохраните модель конвейера

После успешного обучения, тестирования и оценки модели вы можете сохранить модель на диск и использовать ее в различных приложениях Spark. Чтобы сохранить модель на диск, используйте следующий код;

pipeline_model.save('/path/to/storage_location')

в заключении

Spark NLP предоставляет большое количество аннотаторов и преобразователей для построения конвейеров предварительной обработки данных. Sparal NLP легко интегрируется со Spark MLLib, что позволяет нам создавать комплексные проекты обработки естественного языка в распределенной среде.

В этой статье мы рассмотрели, как установить Spark NLP на AWS EMR и реализовать текстовую классификацию данных BBC. Мы также рассмотрели различные метрики оценки в Spark MLlib и узнали, как сохранить модель для дальнейшего использования.

Надеюсь, вам понравилась эта статья.

Оригинальная ссылка:Woohoo.Со слов аналитиков vi.com/blog/2020/0…

Добро пожаловать на сайт блога Panchuang AI:panchuang.net/

sklearn машинное обучение китайские официальные документы:sklearn123.com/

Добро пожаловать на станцию ​​сводки ресурсов блога Panchuang:docs.panchuang.net/