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 解决了这个问题。有关如何正确实施词干分析器和词干还原器的更详细说明,在网络上进行快速搜索会发现所有情况下的良好示例。
我是文本分析的新手,正在尝试创建一个词袋模型(使用 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 解决了这个问题。有关如何正确实施词干分析器和词干还原器的更详细说明,在网络上进行快速搜索会发现所有情况下的良好示例。