Всякий раз, когда мы думаем о реализации решения для классификации текста в какой-либо области, основная проблема в классификации текста заключается в том, как мы будем определять функции и как обучать нашу модель с использованием этих функций. Это означает, что если мы просто говорим о проблеме классификации, то мы можем прямо или просто определить признаки, потому что в этом случае у нас есть простое различение признаков.
Простой пример проблемы классификации
Например, предположим, что доктор осматривает какого-то человека, и этот человек является обычным пациентом этого врача. Таким образом, врач знает свою историю болезни, такую как сахар, артериальное давление и многие другие параметры, по которым он может классифицировать, есть ли у пациента риск сердечного приступа или нет.
Здесь, в этом примере, история болезни — не что иное, как функции для нашей модели машинного обучения. Здесь врач рассматривает не одну особенность, а более чем одну. поэтому в машинном обучении мы можем сказать, что это вектор признаков.
Результат содержит два типа выходных данных, например, у пациента есть риск сердечного приступа и нет никакого риска. Итак, это проблема бинарной классификации.
Приведенный выше пример является очень общим с точки зрения объяснения важности выбора функций для обучения модели, и он показывает, что для любого классического примера проблемы классификации у нас есть различение функций, но когда мы рассматриваем текстовую классификацию, важно выбрать функции из текстовые данные. Потому что в этом случае у нас есть несколько предложений и соответствующие им ярлыки.
Пример задачи классификации текста
Здесь я представил один классический пример задачи классификации текста. Анализ настроений для финансовых новостей, и в этом у нас есть набор данных с заголовками новостей и их настроениями. Каждый заголовок новостей относится к одной из трех категорий: позитивной, негативной или нейтральной. Таким образом, набор данных будет иметь набор заголовков новостей и соответствующую категорию. Я думаю, что этого достаточно информации о наборе данных, который необходим для понимания и дальнейшего чтения.
Детали реализации
Теперь давайте перейдем к деталям реализации, и в этом я использовал библиотеки 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-кратную проверку для сравнения оценки точности и создал карту попаданий, используя матрицу путаницы. Я использовал общедоступный анализ настроений для набора данных финансовых новостей.