Среди различных библиотек с открытым исходным кодом, которые облегчают задачи классификации и регрессии и позволяют реализовывать проекты машинного обучения и машинного обучения,
scikit-learn, несомненно, является одним из самых универсальных и простых в использовании пакетов в любой ИТ-экосистеме.
На самом деле, scikit-learn демократизирует машинное обучение для (мл) непосвященного разработчика полного стека в большей степени, чем мы хотим признать.
Имея значительный репозиторий оценок и алгоритмов, он делает задачу НЛП или модуль машинного обучения удивительно быстр,
и достаточно эффективен для большого сегмента функциональных целей.

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

Итак, давайте быстро взглянем на scikit-learn во всей его синтаксической простоте и прямом подходе к эффективной классификации текстов с большими наборами данных.
Для иллюстрации мы возьмем набор данных обзора медицины, который содержит названия лекарств, состояния пациентов и обзоры первое.
Мы пропустим достаточно большой выборочный набор через реализованный оценщик skicit-learn и обучим модели учиться на обзорах, чтобы обратно предсказывать условие — не самое практическое применение этого набора данных, но оно подходит для нашей задачи. целей на данный момент.

Следует отметить, что именно этот набор данных был выбран из-за его высокой размерности, помимо размера корпуса, который как раз подходит
к нашему программному случаю.

Конкретный набор данных и цитаты для набора данных см. в конце статьи.

Теперь о самом коде; пожалуйста, обратитесь к репозиторию github https://github.com/kundanj/text-class-ooc-sk для соответствующего кода.

Необходимо: навыки работы с Python, см. README для установки скрипта в репозитории git.

Классификация крупного текста:

Для начала давайте перейдем непосредственно к pandas и позволим ему делать то, что у него получается лучше всего — нарезать CSV-файлы, чтобы получить нужные нам данные.

df=pd.read_csv(FILE_PATH + “/../data/drugsComTrain_raw.csv”)
all_conditions = df[‘condition’]
all_reviews = df[‘review’]

Возможно, беглый взгляд на данные подскажет нам, с чем мы имеем дело.

print(all_reviews.head(10))
print(all_conditions.head(10))
print(all_reviews.shape)

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

Для быстрого основного списка классов/условий

for category in all_conditions:
    if category not in classes:
        classes.append(category)

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

y_all = [ classes.index(x) for x in all_conditions ]

Как принято упоминать в конвейере НЛП, перед извлечением признаков может быть проведена определенная предварительная обработка образцов текста, которая может включать токенизацию (слово/символ) с последующим удалением стоп-слов, лемматизацией и т. д. Большинство из них уже выполняются HashVectorizer (преобразование в нижний регистр, игнорирование пунктуации и т. д.)
Однако эффект пользовательской предварительной обработки (например, стоп-слова) может зависеть от конкретной проблемы и может быть включен в конвейер в каждом конкретном случае.
> Мы также обязаны сделать здесь еще одно предостережение — подход Bag of Words/n-gram игнорирует позиционную информацию в текстах, что означает, что контекстуальная релевантность, семантические значения и т. д. игнорируются.

Обратите внимание, что вместо разделения данных обучения вы можете использовать отдельные данные тестирования, которые поставляются с этим набором данных.
Большинство вызовов функций, описанных выше, являются семантикой параметров, за исключением n-граммы, о которой нужно кратко упомянуть — вместо этого из функций, состоящих только из одного слова, мы также берем двойные слова, например. чтобы потенциально учесть нюанс между «головной болью» и «хронической головной болью».

    #as the name suggests, split training data
    X_train, X_test, Y_train, Y_test = train_test_split(clean_corpus(all_reviews), y_all, test_size=0.15, random_state=42)
    vectorizer = HashingVectorizer(ngram_range=(1,2), strip_accents='ascii', n_features=2**18)
    X_train_hashed = vectorizer.transform(X_train)
    tfidf_transformer=TfidfTransformer()
    X_train = tfidf_transformer.fit_transform(X_train_hashed)
    X_test_hashed = vectorizer.transform(X_test)
    X_test = tfidf_transformer.transform(X_test_hashed)

Наконец модель. Мы используем классификатор SGD, в данном случае оптимизатор линейного SVM. Мы будем использовать SGD как средство подбора линейного классификатора.
Не углубляясь в математику моделей, которая здесь выходит за рамки, линейная модель подразумевает форму алгебраического уравнения, в которой предполагаемая цель представляет собой линейную сумму. взвешенных функций — подумайте о коэффициентах и ​​перехватах.
SGD выбран из-за его полезности при обработке большого количества выборок и функций. И это хорошо вписывается в механизм partial_fit для дополнительного обучения.
Мы используем линейный SVM для функции потерь, как указано параметром «шарнир».

Кроме того, программно SGD имеет удобную адаптируемость к инкрементной подгонке, как мы увидим в приведенном ниже блоке кода. SGD относится к определенному набору оценщиков, которые поддаются инкрементному обучению, т.е. когда весь корпус не загружается в алгоритм сразу.

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

Мы получаем точность 71%, что является хорошей отправной точкой. Если вам нужно поиграть с моделью, используйте model.predict для классификации заболеваний на основе симптомов или используйте приведенные ниже конструкции кода.

    epoch = 5
    batchsize = 1000
    model = SGDClassifier(loss="hinge", penalty="l2")
    batches = int(X_train.shape[0]/batchsize) + 1
    samples = X_train.shape[0]
    for i in range(epoch):
        for j in range(batches):
            #print('in j...', j, j*batchsize, '----2is:',samples, (j+1)*batchsize )
            model.partial_fit(X_train[j*batchsize:min(samples,(j+1)*batchsize)], Y_train[j*batchsize:min(samples,(j+1)*batchsize)], classes=range(len(classes)))
    print ("Accuracy on testing data :", epoch, model.score(X_test, Y_test))

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

    test_stmt = []
    test_stmt.append(input_statement)
    X_testing_counts = vectorizer.transform(clean_corpus(test_stmt))
    X_testing = tfidf_transformer.transform(X_testing_counts)
    predicted = model.predict(X_testing)
    for doc, category in zip(test_stmt, predicted):
    return classes[category]

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

Набор данных и цитирование:

«https://www.kaggle.com/jessicali9530/kuc-hackathon-winter-2018?select=drugsComTest_raw.csv»

Благодарности за набор данных:
Набор данных изначально был опубликован в репозитории машинного обучения UCI. Образец цитирования: Феликс Грассер, Сурья Каллумади, Хаген Мальберг и Себастьян Заунседер. 2018. Аспектный анализ настроений в обзорах лекарств с применением междоменного обучения и перекрестного обучения. В материалах Международной конференции по цифровому здравоохранению 2018 г. (DH '18). ACM, Нью-Йорк, штат Нью-Йорк, США, 121–125.

«Предложения по подаче заявок на Mlearning.ai
Как стать писателем на Mlearning.aimedium.com»



Нестандартная текстовая классификация с несколькими метками с помощью scikit-learn