portaldacalheta.pt
  • Основен
  • Управление На Проекти
  • Дизайн На Марката
  • Процес На Проектиране
  • Начин На Живот
Технология

Изградете програма за класификация на текст: Урок за NLP



Дълбокото обучение е технология, която се превърна в съществена част от работните процеси на машинното обучение. Възползвайки се от подобрения на паралелни изчислителни мощности и поддържащи инструменти, сложни и дълбоки невронни мрежи, които някога са били непрактични, сега стават жизнеспособни.

Появата на мощни и достъпни библиотеки като Tensorflow , Факла , и Deeplearning4j също отвори разработка за потребители извън академичните среди и изследователските отдели на големи технологични компании. В свидетелство за нарастващото му разпространение, компании като Huawei и Apple вече включват специални процесори, оптимизирани за задълбочено обучение, в своите най-нови устройства за захранване на приложения за дълбоко обучение.



Дълбокото обучение доказа своята сила в много области. Най-вече Google AlphaGo успя да победи човешки играчи в игра на Go, игра, чиято умопомрачителна сложност някога се смяташе за почти непреодолима бариера пред компютрите в съревнованието му срещу човешките играчи. Проект Flow Machines от Sony разработи невронна мрежа, която може да композира музика в стила на известни музиканти от миналото. FaceID , функция за сигурност, разработена от Apple, използва дълбоко обучение за разпознаване на лицето на потребителя и за проследяване на промените в лицето на потребителя с течение на времето.



В тази статия ще приложим задълбочено обучение към две от любимите ми теми: обработка на естествен език и вино. Ще изградим модел за разбиране на прегледите на естествения език от експерти и ще изведем сорта на виното, което те преглеждат.



Дълбоко обучение за НЛП

Дълбокото обучение се използва широко в обработка на естествен език (NLP), защото е много подходящ за изучаване на сложната основна структура на изречението и семантична близост на различни думи. Например, настоящото състояние на техниката за анализ на настроенията използва дълбоко обучение, за да улови трудно моделируеми лингвистични понятия като отрицания и смесени настроения.

Дълбокото обучение има няколко предимства пред другите алгоритми за НЛП:



  1. Гъвкави модели: Моделите за дълбоко обучение са много по-гъвкави от другите модели на ML. Можем лесно да експериментираме с различни структури, като добавяме и премахваме слоеве, ако е необходимо. Моделите за дълбоко обучение също позволяват изграждането на модели с гъвкави резултати. Гъвкавостта е ключова за разработването на модели, които са подходящи за разбиране на сложни езикови структури. Също така е от съществено значение за разработването на NLP приложения като преводи, чат ботове и приложения за преобразуване на текст в реч.
  2. Изискват се по-малко знания за домейн: Докато човек със сигурност се нуждае от известни знания и интуиция за домейн, за да разработи добър модел за дълбоко обучение, способността на алгоритмите за дълбоко обучение да научи йерархиите на функциите самостоятелно означава, че разработчикът не се нуждае от толкова задълбочени познания за проблемното пространство, за да развие дълбоко изучаване на НЛП алгоритми. За проблемно пространство, сложно като естествения език, това е много добре дошло предимство.
  3. По-лесно текущо обучение: Алгоритмите за задълбочено обучение са лесни за обучение, тъй като навлизат нови данни. Някои алгоритми за машинно обучение изискват целия набор от данни да бъде изпратен чрез модела за актуализация, което би създало проблем за големи масиви от данни на живо.

Проблемът днес

Днес ще изградим алгоритъм за задълбочено обучение, за да определим сорта на виното, което се преглежда, въз основа на текста на рецензията. Ще използваме набора от данни за списанието за вино на адрес https://www.kaggle.com/zynicide/wine-reviews което се предоставя от потребителя на Kaggle zackthoutt .

Концептуално въпросът е, можем ли да вземем преглед на виното като ...



Ароматите включват тропически плодове, метла, жупел и сушена билка. Небцето не е прекалено изразително, предлагайки неузрели ябълки, цитрусови плодове и изсушен градински чай заедно с оживена киселинност.

... и да разберете, че става въпрос за бяла смес? Някои ентусиасти на виното може да разпознаят издайническите белези на бели вина като ябълка, цитрусови плодове и подчертана киселинност, но можем ли да обучим нашата невронна мрежа да разпознава тези сигнали? Освен това, можем ли да обучим нашата невронна мрежа да разпознава фините разлики между преглед на бяла смес и преглед на пино гриджио?



Подобни алгоритми

Проблемът, с който работим днес, е по същество проблем с класификацията на НЛП. Има няколко алгоритми за класификация на NLP, които са приложени към различни проблеми в NLP. Например, наивен Байес са били използвани в различни алгоритми за откриване на нежелана поща, и поддържащи векторни машини (SVM) са използвани за класифициране на текстове като бележки за напредъка в здравните институции. Би било интересно да се приложи проста версия на тези алгоритми, която да служи като изходна линия за нашия модел за дълбоко обучение.

Наивен Байес

Популярно изпълнение на наивни Bayes за NLP включва предварителна обработка на текста с помощта на TF-IDF и след това стартиране на многочленни наивни Bayes на предварително обработените изходи. Това позволява алгоритъмът да се изпълнява на най-изявените думи в документа. Можем да приложим наивния Bayes, както следва:



import numpy as np from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import CountVectorizer import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfTransformer df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() varietal_list = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = np.array(varietal_list) count_vect = CountVectorizer() x_train_counts = count_vect.fit_transform(description_list) tfidf_transformer = TfidfTransformer() x_train_tfidf = tfidf_transformer.fit_transform(x_train_counts) train_x, test_x, train_y, test_y = train_test_split(x_train_tfidf, varietal_list, test_size=0.3) clf = MultinomialNB().fit(train_x, train_y) y_score = clf.predict(test_x) n_right = 0 for i in range(len(y_score)): if y_score[i] == test_y[i]: n_right += 1 print('Accuracy: %.2f%%' % ((n_right/float(len(test_y)) * 100)))

Изпълнете горния код и трябва да видите нещо като следното: 73,56%

Като се има предвид, че разглеждаме 10 класа, това е доста добър резултат.



Можем също да използваме машина за поддръжка на вектори и да видим как би се справил. За да видите как се представя, просто заменете дефиницията на класификатора с

clf = SVC(kernel='linear').fit(train_x, train_y)

Изпълнете това и трябва да видите следния изход:

какво мога да направя с ruby ​​on rails

Точност: 80,66%

Не е твърде изтъркан.

Нека видим дали можем да изградим модел за задълбочено обучение, който да надмине или поне да съответства на тези резултати. Ако се справим с това, това би било чудесна индикация, че нашият модел за задълбочено обучение е ефективен поне за възпроизвеждане на резултатите от популярните модели за машинно обучение, информирани от експертизата на домейна.

Изграждане на модела

Днес ще използваме Трудно с Tensorflow за изграждане на нашия модел. Keras е библиотека на Python, която прави изграждането на модели за дълбоко обучение много лесно в сравнение с относително ниското ниво на интерфейса на API на Tensorflow. В допълнение към плътните слоеве, ние също ще използваме вграждащи и конволюционни слоеве, за да научим основната семантична информация на думите и потенциалните структурни модели в данните.

Почистване на данни

Първо, ще трябва да преструктурираме данните по начин, който може лесно да бъде обработен и разбран от нашата невронна мрежа. Можем да направим това, като заменим думите с уникално идентифициращи числа. В комбинация с вектор за вграждане, ние можем да представим думите по начин, който е едновременно гъвкав и семантично чувствителен.

На практика ще искаме да бъдем малко по-умни по отношение на тази предварителна обработка. Би имало смисъл да се съсредоточим върху често използваните думи и също така да филтрираме най-често използваните думи (напр. The, this, a).

Можем да приложим тази функционалност, като използваме Defaultdict и NLTK. Напишете следния код в отделен модул Python. Поставих го в lib/get_top_x_words.py.

from nltk import word_tokenize from collections import defaultdict def count_top_x_words(corpus, top_x, skip_top_n): count = defaultdict(lambda: 0) for c in corpus: for w in word_tokenize(c): count[w] += 1 count_tuples = sorted([(w, c) for w, c in count.items()], key=lambda x: x[1], reverse=True) return [i[0] for i in count_tuples[skip_top_n: skip_top_n + top_x]] def replace_top_x_words_with_vectors(corpus, top_x): topx_dict = {top_x[i]: i for i in range(len(top_x))} return [ [topx_dict[w] for w in word_tokenize(s) if w in topx_dict] for s in corpus ], topx_dict def filter_to_top_x(corpus, n_top, skip_n_top=0): top_x = count_top_x_words(corpus, n_top, skip_n_top) return replace_top_x_words_with_vectors(corpus, top_x)

Сега сме готови да изградим модела. Искаме слой за вграждане, конволюционен слой и плътен слой, за да се възползваме от всички функции за дълбоко обучение, които могат да бъдат полезни за нашето приложение. С Keras можем да изградим модела много просто:

from keras.models import Sequential from keras.layers import Dense, Conv1D, Flatten from keras.layers.embeddings import Embedding from keras.preprocessing import sequence from keras.utils import to_categorical import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from lib.get_top_xwords import filter_to_top_x df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() mapped_list, word_list = filter_to_top_x(description_list, 2500, 10) varietal_list_o = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = to_categorical(varietal_list_o) max_review_length = 150 mapped_list = sequence.pad_sequences(mapped_list, maxlen=max_review_length) train_x, test_x, train_y, test_y = train_test_split(mapped_list, varietal_list, test_size=0.3) max_review_length = 150 embedding_vector_length = 64 model = Sequential() model.add(Embedding(2500, embedding_vector_length, input_length=max_review_length)) model.add(Conv1D(50, 5)) model.add(Flatten()) model.add(Dense(100, activation='relu')) model.add(Dense(max(varietal_list_o) + 1, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(train_x, train_y, epochs=3, batch_size=64) y_score = model.predict(test_x) y_score = [[1 if i == max(sc) else 0 for i in sc] for sc in y_score] n_right = 0 for i in range(len(y_score)): if all(y_score[i][j] == test_y[i][j] for j in range(len(y_score[i]))): n_right += 1 print('Accuracy: %.2f%%' % ((n_right/float(len(test_y)) * 100)))

Изпълнете кода и трябва да видите следния изход.

Точност: 77,20%

Спомнете си, че точността на наивните Bayes и SVC беше съответно 73,56% и 80,66%. Така че нашата невронна мрежа се държи много против някои от най-често срещаните методи за класификация на текста там.

Заключение

Днес разгледахме изграждането на класификационен модел за задълбочено обучение, за да анализираме отзиви за вино.

Установихме, че успяхме да изградим модел, който е в състояние да се конкурира и да надмине някои от другите алгоритми за машинно обучение. Надяваме се, че сте вдъхновени да използвате тази информация за изграждане на приложения, които анализират по-сложни набори от данни и генерират по-сложни резултати!

Забележка: Можете да намерите кода, който използвах за тази статия GitHub .

Разбиране на основите

Какво представлява обработката на естествен език?

Обработката на естествен език е гамата от изчислителни техники, използвани за анализ или създаване на човешки език и реч.

Какво прави успешният процес на изкупуване на мениджмънт?

Финансови Процеси

Какво прави успешният процес на изкупуване на мениджмънт?
Топ 10 грешки, които Django Developers правят

Топ 10 грешки, които Django Developers правят

Технология

Популярни Публикации
Изцеление на скъсани вериги за доставки: производство извън Китай
Изцеление на скъсани вериги за доставки: производство извън Китай
Включете Angular 2: Надстройка от 1.5
Включете Angular 2: Надстройка от 1.5
Урок за работен поток за проектиране за разработчици: Осигурете по-добър UI / UX навреме
Урок за работен поток за проектиране за разработчици: Осигурете по-добър UI / UX навреме
PHP Frameworks: Избор между Symfony и Laravel
PHP Frameworks: Избор между Symfony и Laravel
Шевморфизъм, плосък дизайн и възходът на типографския дизайн
Шевморфизъм, плосък дизайн и възходът на типографския дизайн
 
.NET Core - да станем диви и с отворен код. Microsoft, какво ти отне толкова време ?!
.NET Core - да станем диви и с отворен код. Microsoft, какво ти отне толкова време ?!
Крайно ръководство за езика за обработка, част I: Основите
Крайно ръководство за езика за обработка, част I: Основите
Ractive.js - Уеб приложения, направени лесно
Ractive.js - Уеб приложения, направени лесно
Защо има толкова много Pythons?
Защо има толкова много Pythons?
Съвети и инструменти за оптимизиране на приложения за Android
Съвети и инструменти за оптимизиране на приложения за Android
Популярни Публикации
  • как да научите angularjs от нулата
  • обработка (език за програмиране)
  • капиталовото бюджетиране е процесът на анализ на:
  • C# урок за единичен тест
  • php конвертирате utf8 в ascii
Категории
  • Управление На Проекти
  • Дизайн На Марката
  • Процес На Проектиране
  • Начин На Живот
  • © 2022 | Всички Права Запазени

    portaldacalheta.pt