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

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

Настройване на вашата среда

Трябва да сте запознати с Основи на Python да проследя. Навигирайте до Google Colab или отворете Jupyter Notebook. След това създайте нов бележник. Изпълнете следната команда, за да инсталирате необходимите библиотеки във вашата среда.

Пълният изходен код на този проект е достъпен тук GitHub хранилище.

! pip инсталирайте tensorflow scikit-learn pandas numpy pickle5
instagram viewer

Ще използвате NumPy и pandas библиотека за манипулиране на набора от данни. TensorFlow за създаване и обучение на модела за машинно обучение. Scikit-learn за разделяне на набора от данни на набори за обучение и тестване. И накрая, ще използвате pickle5, за да сериализирате и запазите обекта на токенизатора.

Импортиране на необходимите библиотеки

Импортирайте необходимите библиотеки, които ще използвате за предварителна обработка на данните и създаване на модела.

импортиране numpy като np
импортиране панди като пд
импортиране тензорен поток като tf
от sklearn.model_selection импортиране train_test_split
от sklearn.metrics импортиране оценка_на_точност
от tensorflow.keras.preprocessing.text импортиране Токенизатор
от tensorflow.keras.preprocessing.sequence импортиране pad_sequences
от tensorflow.keras.models импортиране Последователен
от tensorflow.keras.layers импортиране Вграждане, Conv1D, GlobalMaxPooling1D, Dense, Dropout
импортиране туршия5 като туршия

Ще използвате класовете, които импортирате от модулите по-късно в кода.

Зареждане на набора от данни

Тук ще използвате набора от данни на Trip Advisor Hotel Reviews от Kaggle за изграждане на модела за анализ на настроението.

df = pd.read_csv('/content/tripadvisor_hotel_reviews.csv')
печат (df.head())

Заредете набора от данни и отпечатайте първите му пет реда. Отпечатването на първите пет реда ще ви помогне да проверите имената на колоните на вашия набор от данни. Това ще бъде от решаващо значение при предварителната обработка на набора от данни.

Наборът от данни за отзиви за хотели на Trip Advisor има колона с индекс, колона с отзиви и колона с оценка.

Предварителна обработка на данни

Изберете Преглед и Рейтинг колони от набора от данни. Създайте нова колона въз основа на колоната Рейтинг и я наименувайте настроения. Ако оценката е по-голяма от 3, маркирайте настроението като положителен. Ако оценката е по-малка от 3, маркирайте я като отрицателен. Ако оценката е точно 3, маркирайте го като неутрален.

Изберете само колоните за преглед и настроение от набора от данни. Разбъркайте произволно редовете и нулирайте индекса на рамката с данни. Разбъркването и нулирането гарантират, че данните се разпределят на случаен принцип, което е необходимо за правилното обучение и тестване на модела.

df = df[["Преглед", "Рейтинг"]]
df["чувство"] = df["Рейтинг"].Приложи(ламбда х: 'положителен'ако x > 3
друго"отрицателен"ако x < 3
друго"неутрален")
df = df[["Преглед", "чувство"]]
df = df.проба (frac=1).reset_index (drop=Вярно)

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

tokenizer = Токенизатор (брой_думи=5000, oov_token='')
tokenizer.fit_on_texts (df["Преглед"])
word_index = токенизатор.word_index
последователности = tokenizer.texts_to_sequences (df["Преглед"])
padded_sequences = pad_sequences (последователности, maxlen=100, съкращаване="пост")

Преобразувайте етикетите за настроение в кодиране One-hot.

sentiment_labels = pd.get_dummies (df["чувство"]).стойности

Еднократното кодиране представлява категорични данни във формат, с който вашите модели могат да работят по-лесно.

Разделяне на набора от данни на комплекти за обучение и тестване

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

x_train, x_test, y_train, y_test = train_test_split (paded_sequences, sentiment_labels, test_size=0.2)

Размерът на разделянето на набора от данни е 0,2. Това означава, че 80% от данните ще обучат модела. А останалите 20% ще тестват производителността на модела.

Създаване на невронна мрежа

Създавам невронна мрежа с шест слоя.

модел = Sequential()
model.add (Вграждане(5000, 100, input_length=100))
model.add (Conv1D(64, 5, активиране="relu"))
model.add (GlobalMaxPooling1D())
model.add (Плътен(32, активиране="relu"))
model.add (Отпадане(0.5))
model.add (Плътен(3, активиране="softmax"))
model.compile (оптимизатор="адам", загуба='categorical_crossentropy', показатели=["точност"])
model.summary()

Първият слой на невронната мрежа е слой за вграждане. Този слой научава плътно представяне на думите в речника. Вторият слой е слой Conv1D с 64 филтъра и размер на ядрото 5. Този слой извършва конволюционни операции върху входните последователности, като използва малък плъзгащ се прозорец с размер 5.

Третият слой редуцира последователността от карти на характеристики до един вектор. Приема максималната стойност за всяка карта на характеристиките. Четвъртият слой извършва линейна трансформация на входния вектор. Петият слой произволно задава част от входните единици на 0 по време на обучение. Това помага за предотвратяване на претоварването. Последният слой преобразува изхода в разпределение на вероятностите в трите възможни класа: положителен, неутрален и отрицателен.

Обучение на невронната мрежа

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

model.fit (x_train, y_train, epochs=10, batch_size=32, validation_data=(x_test, y_test))

След всяка епоха се оценява представянето на модела върху набора за тестване.

Оценяване на ефективността на обучения модел

Използвай model.predict() метод за прогнозиране на етикетите на настроението за тестовия набор. Изчислете резултата за точност, като използвате accuracy_score() функция от scikit-learn.

y_pred = np.argmax (model.predict (x_test), axis=-1)
печат ("Точност:", accuracy_score (np.argmax (y_test, axis=-1), y_пред))

Точността на този модел е около 84%.

Запазване на модела

Запазете модела с помощта на model.save() метод. Използвайте pickle, за да сериализирате и запазите обекта на токенизатора.

model.save('sentiment_analysis_model.h5')
с отворен('tokenizer.pickle', "wb") като дръжка:
pickle.dump (токенизатор, манипулатор, протокол=кисел. HIGHEST_PROTOCOL)

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

Използване на модела за класифициране на настроението на вашия собствен текст

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

# Заредете запазения модел и токенизатор
импортиране keras

модел = keras.models.load_model('sentiment_analysis_model.h5')
с отворен('tokenizer.pickle', 'rb') като дръжка:
tokenizer = pickle.load (дръжка)

Дефинирайте функция за предсказване на настроението на въведен текст.

дефпредсказване_настроение(текст):
# Токенизиране и подпълване на въведения текст
text_sequence = tokenizer.texts_to_sequences([текст])
text_sequence = pad_sequences (text_sequence, maxlen=100)

# Направете прогноза, като използвате обучения модел
прогнозиран_рейтинг = model.predict (текстова_последователност)[0]
ако np.argmax (предвиден_рейтинг) == 0:
връщане"Отрицателен"
елиф np.argmax (предвиден_рейтинг) == 1:
връщане"Неутрален"
друго:
връщане'Положителен'

Накрая предскажете собствения си текст.

въвеждане на текст = „Наистина ми хареса престоят ми в този хотел. Персоналът беше невероятен и стаята беше фантастична!"
предсказано_настроение = предсказано_настроение (въведен_текст)
печат (предвидено_чувство)

Прогнозираното настроение на прегледа по-горе е както следва:

Моделът е в състояние да класифицира правилно настроенията и на трите отзива.

Прогнозиране на настроения с помощта на предварително обучени модели

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