CountVectorizer:向量化文本中没有出现"I"

14

我是scikit-learn的新手,目前正在学习朴素贝叶斯(Multinomial)。现在,我正在使用sklearn.feature_extraction.text从文本中进行向量化,但出现了一个问题:当我对一些文本进行向量化时,输出数组中没有单词“我”的出现。

代码:

x_train = ['I am a Nigerian hacker', 'I like puppies']

# convert x_train to vectorized text
vectorizer_train = CountVectorizer(min_df=0)
vectorizer_train.fit(x_train)
x_train_array = vectorizer_train.transform(x_train).toarray()

# print vectorized text, feature names
print x_train_array
print vectorizer_train.get_feature_names()

输出:

1 1 0 1 0
0 0 1 0 1
[u'am', u'hacker', u'like', u'nigerian', u'puppies']

为什么“我”似乎不会出现在功能名称中?当我将其更改为“Ia”或其他类似名称时,它确实会出现。

2个回答

26
这是由于 CountVectorizer 的默认 token_pattern 会删除单个字符的标记造成的:
>>> vectorizer_train
CountVectorizer(analyzer=u'word', binary=False, charset=None,
        charset_error=None, decode_error=u'strict',
        dtype=<type 'numpy.int64'>, encoding=u'utf-8', input=u'content',
        lowercase=True, max_df=1.0, max_features=None, min_df=0,
        ngram_range=(1, 1), preprocessor=None, stop_words=None,
        strip_accents=None, token_pattern=u'(?u)\\b\\w\\w+\\b',
        tokenizer=None, vocabulary=None)
>>> pattern = re.compile(vectorizer_train.token_pattern, re.UNICODE)
>>> print(pattern.match("I"))
None

要保留"I",请使用不同的模式,例如:

>>> vectorizer_train = CountVectorizer(min_df=0, token_pattern=r"\b\w+\b")
>>> vectorizer_train.fit(x_train)
CountVectorizer(analyzer=u'word', binary=False, charset=None,
        charset_error=None, decode_error=u'strict',
        dtype=<type 'numpy.int64'>, encoding=u'utf-8', input=u'content',
        lowercase=True, max_df=1.0, max_features=None, min_df=0,
        ngram_range=(1, 1), preprocessor=None, stop_words=None,
        strip_accents=None, token_pattern='\\b\\w+\\b', tokenizer=None,
        vocabulary=None)
>>> vectorizer_train.get_feature_names()
[u'a', u'am', u'hacker', u'i', u'like', u'nigerian', u'puppies']
请注意,现在还保留了无信息的单词“a”。

7
使用模式'(?u)\b\w+\b'更好,因为它不会对带有Unicode字母的单词造成影响。 - usamec

1
这是因为在CountVectorizer中,默认情况下大写字母检测被关闭,即lowercase=True
使用:
vectorizer_train = CountVectorizer(min_df=0, lowercase=False)

即使 lowercase=True,它也应该捕获'i'的计数。 接受的答案有正确的解决方案。 - Rushdi Shams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接