Sklearn:将词形还原器添加到 CountVectorizer
Sklearn: adding lemmatizer to CountVectorizer
我在我的计数向量器中添加了词形还原,如 Sklearn page 中所述。
from nltk import word_tokenize
from nltk.stem import WordNetLemmatizer
class LemmaTokenizer(object):
def __init__(self):
self.wnl = WordNetLemmatizer()
def __call__(self, articles):
return [self.wnl.lemmatize(t) for t in word_tokenize(articles)]
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer,
strip_accents = 'unicode',
stop_words = 'english',
lowercase = True,
token_pattern = r'\b[a-zA-Z]{3,}\b', # keeps words of 3 or more characters
max_df = 0.5,
min_df = 10)
但是,当使用 fit_transform
创建 dtm 时,出现以下错误(我无法理解)。在将词形还原添加到我的矢量化器之前,dtm 代码始终有效。我深入阅读了手册,并尝试了一些代码,但找不到任何解决方案。
dtm_tf = tf_vectorizer.fit_transform(articles)
更新:
遵循@MaxU 下面的建议后,代码 运行 没有错误,但是我的输出中没有省略数字和标点符号。我 运行 单独测试以查看 LemmaTokenizer()
之后的其他功能中哪些有效,哪些无效。这是结果:
strip_accents = 'unicode', # works
stop_words = 'english', # works
lowercase = True, # works
token_pattern = r'\b[a-zA-Z]{3,}\b', # does not work
max_df = 0.5, # works
min_df = 10 # works
看起来,只是 token_pattern
变得不活跃了。这是没有 token_pattern
的更新和工作代码(我只需要先安装 'punkt' 和 'wordnet' 包):
from nltk import word_tokenize
from nltk.stem import WordNetLemmatizer
class LemmaTokenizer(object):
def __init__(self):
self.wnl = WordNetLemmatizer()
def __call__(self, articles):
return [self.wnl.lemmatize(t) for t in word_tokenize(articles)]
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer(),
strip_accents = 'unicode', # works
stop_words = 'english', # works
lowercase = True, # works
max_df = 0.5, # works
min_df = 10) # works
对于那些想要删除少于 3 个字符的数字、标点符号和单词(但不知道如何删除)的人,这是一种在 Pandas 数据帧[=20] 中为我做的方法=]
# when working from Pandas dataframe
df['TEXT'] = df['TEXT'].str.replace('\d+', '') # for digits
df['TEXT'] = df['TEXT'].str.replace(r'(\b\w{1,2}\b)', '') # for words
df['TEXT'] = df['TEXT'].str.replace('[^\w\s]', '') # for punctuation
应该是:
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer(),
# NOTE: ----------------------> ^^
而不是:
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer,
感谢您的代码,它对我有帮助。
这是处理非活动 token_pattern
的另一种方法:
import re
class LemmaTokenizer:
def __init__(self):
self.wnl = WordNetLemmatizer()
def __call__(self, doc):
regex_num_ponctuation = '(\d+)|([^\w\s])'
regex_little_words = r'(\b\w{1,2}\b)'
return [self.wnl.lemmatize(t) for t in word_tokenize(doc)
if not re.search(regex_num_ponctuation, t) and not re.search(regex_little_words, t)]
使用 Regex 进入 class LemmaTokenizer。
我在我的计数向量器中添加了词形还原,如 Sklearn page 中所述。
from nltk import word_tokenize
from nltk.stem import WordNetLemmatizer
class LemmaTokenizer(object):
def __init__(self):
self.wnl = WordNetLemmatizer()
def __call__(self, articles):
return [self.wnl.lemmatize(t) for t in word_tokenize(articles)]
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer,
strip_accents = 'unicode',
stop_words = 'english',
lowercase = True,
token_pattern = r'\b[a-zA-Z]{3,}\b', # keeps words of 3 or more characters
max_df = 0.5,
min_df = 10)
但是,当使用 fit_transform
创建 dtm 时,出现以下错误(我无法理解)。在将词形还原添加到我的矢量化器之前,dtm 代码始终有效。我深入阅读了手册,并尝试了一些代码,但找不到任何解决方案。
dtm_tf = tf_vectorizer.fit_transform(articles)
更新:
遵循@MaxU 下面的建议后,代码 运行 没有错误,但是我的输出中没有省略数字和标点符号。我 运行 单独测试以查看 LemmaTokenizer()
之后的其他功能中哪些有效,哪些无效。这是结果:
strip_accents = 'unicode', # works
stop_words = 'english', # works
lowercase = True, # works
token_pattern = r'\b[a-zA-Z]{3,}\b', # does not work
max_df = 0.5, # works
min_df = 10 # works
看起来,只是 token_pattern
变得不活跃了。这是没有 token_pattern
的更新和工作代码(我只需要先安装 'punkt' 和 'wordnet' 包):
from nltk import word_tokenize
from nltk.stem import WordNetLemmatizer
class LemmaTokenizer(object):
def __init__(self):
self.wnl = WordNetLemmatizer()
def __call__(self, articles):
return [self.wnl.lemmatize(t) for t in word_tokenize(articles)]
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer(),
strip_accents = 'unicode', # works
stop_words = 'english', # works
lowercase = True, # works
max_df = 0.5, # works
min_df = 10) # works
对于那些想要删除少于 3 个字符的数字、标点符号和单词(但不知道如何删除)的人,这是一种在 Pandas 数据帧[=20] 中为我做的方法=]
# when working from Pandas dataframe
df['TEXT'] = df['TEXT'].str.replace('\d+', '') # for digits
df['TEXT'] = df['TEXT'].str.replace(r'(\b\w{1,2}\b)', '') # for words
df['TEXT'] = df['TEXT'].str.replace('[^\w\s]', '') # for punctuation
应该是:
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer(),
# NOTE: ----------------------> ^^
而不是:
tf_vectorizer = CountVectorizer(tokenizer=LemmaTokenizer,
感谢您的代码,它对我有帮助。
这是处理非活动 token_pattern
的另一种方法:
import re
class LemmaTokenizer:
def __init__(self):
self.wnl = WordNetLemmatizer()
def __call__(self, doc):
regex_num_ponctuation = '(\d+)|([^\w\s])'
regex_little_words = r'(\b\w{1,2}\b)'
return [self.wnl.lemmatize(t) for t in word_tokenize(doc)
if not re.search(regex_num_ponctuation, t) and not re.search(regex_little_words, t)]
使用 Regex 进入 class LemmaTokenizer。