Я новичок в анализе текста и пытаюсь создать модель мешка слов (используя метод 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()
Это может быть простая проблема с недостаточной производительностью wordnetlemmatizer и парадигматизатора.
Попробуйте разные, например... Стеммеры:
Лемматизаторы:
Была та же проблема, и переход на другой Stemmer и Lemmatizer решил проблему. Для получения более подробных инструкций о том, как правильно реализовать стеммеры и лемматизаторы, быстрый поиск в Интернете показывает хорошие примеры для всех случаев.