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

Простой пример проблемы классификации

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

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

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

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

Пример задачи классификации текста

Здесь я представил один классический пример задачи классификации текста. Анализ настроений для финансовых новостей, и в этом у нас есть набор данных с заголовками новостей и их настроениями. Каждый заголовок новостей относится к одной из трех категорий: позитивной, негативной или нейтральной. Таким образом, набор данных будет иметь набор заголовков новостей и соответствующую категорию. Я думаю, что этого достаточно информации о наборе данных, который необходим для понимания и дальнейшего чтения.

Детали реализации

Теперь давайте перейдем к деталям реализации, и в этом я использовал библиотеки NLTK и RE, которые используются в стандартном NLP и в основном используются для предварительной обработки данных, такой как удаление стоп-слов и всего из текстовых данных.

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

allData.columns = ['sentiment', 'sentence']

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

import re
import nltk

nltk.download('stopwords')

from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer


corpus = []

for i in range(0, len(allData)):
  sentence = re.sub('[^a-zA-Z]', ' ', str(allData['sentence'][i]))
  sentence = sentence.lower()
  sentence = sentence.split()
  ps = PorterStemmer()
  sentence = [ps.stem(word) for word in sentence if not word in set(stopwords.words('english'))]
  sentence = ' '.join(sentence)
  corpus.append(sentence)
print("size of the corpus ", len(corpus))
#Creating the bag of words model
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(max_features= 1000)
X = cv.fit_transform(corpus).toarray()
y = allData.iloc[:,0].values
#print(X)
#print(X[12])
print("Dimension of Matrix :" , X.shape)
print(y)
print("Size of the result list y",len(y))

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

Теперь для подготовки вектора признаков из пакета словесной модели мы можем выбрать max_features (здесь это 1000). Таким образом, он создаст вектор признаков из этих первых 1000 токенов. Для каждого предложения будут определены такие функции, как [0, X, 0, Y,…] (здесь X, Y — числа). Это просто появление токена в этом конкретном предложении.

#Creating the bag of words model
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(max_features= 1000)
X = cv.fit_transform(corpus).toarray()
y = allData.iloc[:,0].values

Итак, в приведенном выше фрагменте кода X — это не что иное, как матрица векторов признаков для всех предложений, а Y — это не что иное, как список семантики, и теперь у нас есть X и Y, поэтому мы можем применить стандартные алгоритмы классификации и обучить модель и сравнить точность.

Использование логистической регрессии

Здесь я использовал логистическую регрессию, и я не рассматриваю для этого построчные детали реализации.

%%time
#using Logistic regression with simple validation set..
from sklearn.model_selection import train_test_split as tts
x_train, x_test, y_train, y_test = tts(X, y, test_size=0.20, random_state = 0)

print("Creating a testing data set and training dataset using train_test_split lib")


from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
print("Importing the logistic regression and accuracy_score")


# train a logistic regression model on the training set
# instantiate model
lrm_model = LogisticRegression(solver = 'newton-cg', multi_class = 'multinomial')

print(lrm_model)

# fit model
lrm_model.fit(x_train, y_train)

# make class predictions for the testing set
lrm_predictions = lrm_model.predict(x_test)

# calculate accuracy
model_accuracy = accuracy_score(y_test, lrm_predictions)

# calculate accuracy on training data
lrm_predictions_on_training_data = lrm_model.predict(x_train)
model_accuracy_on_training_data = accuracy_score(y_train, lrm_predictions_on_training_data)


#print(lrm_predictions)

print("-----------------------------------------------")
print("Using Logistic Regression:")
print("-----------------------------------------------")
print("Size of the Feature Vector  :", len(X[0]))
print()
print("Size of the Dataset         :",len(X))
print()
print("Accuracy score of the model :",model_accuracy)
print()
print("Accuracy score on training data:",model_accuracy_on_training_data)
print()

Для получения более подробной информации о реализации вы можете проверить мой проект kaggle. Я упомянул ссылку в ссылках. В этом я использовал K-кратную проверку для сравнения оценки точности и создал карту попаданий, используя матрицу путаницы. Я использовал общедоступный анализ настроений для набора данных финансовых новостей.

Использованная литература: