我刚开始进行文本分析,正在尝试创建词袋模型(使用sklearn的CountVectorizer方法)。我有一个数据框架,其中包含一个文本列,包含像'acid','acidic','acidity','wood','woodsy','woody'这样的单词。
我认为'acid'和'wood'应该是最终输出中唯一包含的单词,但是stemming和lemmatizing似乎都无法实现这一点。
Stemming产生了'acid','wood','woodi','woodsi',而lemmatizing则产生了更差的输出结果:'acid','acidic','acidity','wood','woodsy','woody'。我猜想这是由于没有准确指定词性,但我不确定这个规范应该放在哪里。我已经在行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:
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()