Ни стеммер, ни лемматизатор не работают очень хорошо, что мне делать?

Я новичок в анализе текста и пытаюсь создать модель мешка слов (используя метод sklearn CountVectorizer). У меня есть фрейм данных со столбцом текста со такими словами, как «кислотный», «кислотный», «кислотный», «деревянный», «древесный», «древесный».

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

Стемминг производит «кислоту», «древесину», «дерево», «дерево». а лемматизация дает худший результат «кислотный», «кислотный», «кислотный», «древесный», «древесный», «древесный». Я предполагаю, что это связано с тем, что часть речи не указана точно, хотя я не уверен, куда следует отнести эту спецификацию. Я включил его в строку X = vectorizer.fit_transform(df['text'],'a') (я считаю, что большинство слов должны быть прилагательными), однако это не влияет на вывод.

Что я могу сделать, чтобы улучшить результат?

Мой полный код ниже;

!pip install nltk
nltk.download('omw-1.4')  
import nltk
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from nltk.stem import WordNetLemmatizer 

Фрейм данных:

df = pd.DataFrame()
df['text']=['acid', 'acidic', 'acidity', 'wood', 'woodsy', 'woody']

CountVectorizer со Stemmer:

analyzer = CountVectorizer().build_analyzer()
stemmer = nltk.stem.SnowballStemmer('english')
lemmatizer = WordNetLemmatizer()

def stemmed_words(doc):
    return (stemmer.stem(w) for w in analyzer(doc))

vectorizer = CountVectorizer(stop_words='english',analyzer=stemmed_words)
X = vectorizer.fit_transform(df['text'])
df_bow_sklearn = pd.DataFrame(X.toarray(),columns=vectorizer.get_feature_names())
df_bow_sklearn.head()

CountVectorizer с лемматизатором:

analyzer = CountVectorizer().build_analyzer()
stemmer = nltk.stem.SnowballStemmer('english')
lemmatizer = WordNetLemmatizer()

def lemed_words(doc):
    return(lemmatizer.lemmatize(w) for w in analyzer(doc))

vectorizer = CountVectorizer(stop_words='english',analyzer=lemed_words)
X = vectorizer.fit_transform(df['text'],'a')
df_bow_sklearn = pd.DataFrame(X.toarray(),columns=vectorizer.get_feature_names())
df_bow_sklearn.head()
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
0
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это может быть простая проблема с недостаточной производительностью wordnetlemmatizer и парадигматизатора.

Попробуйте разные, например... Стеммеры:

  • Портер ( -> из nltk.stem импортировать PorterStemmer)
  • Lancaster (-> из nltk.stem импортировать LancasterStemmer)

Лемматизаторы:

  • spacy ( -> импортировать spacy)
  • IWNLP ( -> из spacy_iwnlp импортировать spaCyIWNLP)
  • HanTa ( -> из HanTa import HanoverTagger /Примечание: более или менее обучен немецкому языку)

Была та же проблема, и переход на другой Stemmer и Lemmatizer решил проблему. Для получения более подробных инструкций о том, как правильно реализовать стеммеры и лемматизаторы, быстрый поиск в Интернете показывает хорошие примеры для всех случаев.

Другие вопросы по теме