stemmer 和 lemmatizer 似乎都不太好用,我该怎么办?

Neither stemmer nor lemmatizer seem to work very well, what should I do?

我是文本分析的新手,正在尝试创建一个词袋模型(使用 sklearn 的 CountVectorizer 方法)。我有一个数据框,其中有一列文本包含 'acid'、'acidic'、'acidity'、'wood'、'woodsy'、'woody'.

我认为 'acid' 和 'wood' 应该是最终输出中包含的唯一单词,但是词干提取和词形还原似乎都无法实现这一点。

词干生成 'acid','wood','woodi',woodsi' 并且词形还原会产生更差的输出 '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 with Lemmatizer:

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 和词干分析器的一个简单 under-performing 问题。

尝试不同的方法,例如... 词干分析器:

  • 搬运工(->来自 nltk.stem 导入 PorterStemmer)
  • 兰开斯特(-> 从 nltk.stem 导入 LancasterStemmer)

词形还原器:

  • spacy(-> 导入 spacy)
  • IWNLP(->来自 spacy_iwnlp 导入 spaCyIWNLP)
  • HanTa(-> from HanTa import HanoverTagger /注:或多或少受过德语训练)

有同样的问题并切换到不同的 Stemmer 和 Lemmatizer 解决了这个问题。有关如何正确实施词干分析器和词干还原器的更详细说明,在网络上进行快速搜索会发现所有情况下的良好示例。