【问题标题】:CountVectorizer: "I" not showing up in vectorized textCountVectorizer:“我”未出现在矢量化文本中
【发布时间】:2015-05-22 04:36:07
【问题描述】:

我是 scikit-learn 的新手,目前正在学习朴素贝叶斯(多项式)。现在,我正在对 sklearn.feature_extraction.text 中的文本进行矢量化处理,由于某种原因,当我对某些文本进行矢量化处理时,“I”这个词不会出现在输出的数组中。

代码:

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”或其他类似名称时,它会显示出来。

【问题讨论】:

    标签: scikit-learn feature-extraction


    【解决方案1】:

    这是由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
    

    要保留“我”,请使用不同的模式,例如

    >>> 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”。

    【讨论】:

    • 模式 '(?u)\\b\\w+\\b' 更好,因为它不会用 unicode 字母混淆单词。
    【解决方案2】:

    这是因为大写字母检测在 CountVectorizer 中默认关闭 lowercase=True

    使用

    vectorizer_train = CountVectorizer(min_df=0, lowercase=False)
    

    【讨论】:

    • 即使小写=True,它也应该捕获'i'的计数。接受的答案有正确的解决方案。
    猜你喜欢
    • 2017-05-29
    • 2019-01-04
    • 2013-03-10
    • 2020-08-16
    • 1970-01-01
    • 2014-07-23
    • 2017-04-30
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多