如何防止TfidfVectorizer将数字作为词汇获取

Mar*_*oma 4 python scikit-learn

我像这样使用TfidfVectorizer:

from sklearn.feature_extraction.text import TfidfVectorizer
stop_words = stopwords.words("english")
vectorizer = TfidfVectorizer(stop_words=stop_words, min_df=200)
xs['train'] = vectorizer.fit_transform(docs['train'])
xs['test'] = vectorizer.transform(docs['test']).toarray()
Run Code Online (Sandbox Code Playgroud)

但是在检查时,vectorizer.vocabulary_我注意到它学习纯数字功能:

[(u'00', 0), (u'000', 1), (u'0000', 2), (u'00000', 3), (u'000000', 4)
Run Code Online (Sandbox Code Playgroud)

我不要这个 我该如何预防?

Iul*_*urt 5

您可以token_pattern在初始化矢量化程序时定义。默认的是u'(?u)\b\w\w+\b'(?u)部分只是打开re.UNICODE标志)。可以摆弄直到您得到所需。

就像是:

vectorizer = TfidfVectorizer(stop_words=stop_words,
                             min_df=200,
                             token_pattern=u'(?u)\b\w*[a-zA-Z]\w*\b')
Run Code Online (Sandbox Code Playgroud)

另一个选择(如果数字出现在样本中很重要)是在矢量化之前屏蔽所有数字。

re.sub('\b[0-9][0-9.,-]*\b', 'NUMBER-SPECIAL-TOKEN', sample)
Run Code Online (Sandbox Code Playgroud)

这样,数字将在引导程序的词汇表中碰到相同的位置,您也不会完全忽略它们。