为什么当有两个单词时,CountVectorizer会为bigram抛出“空词汇表错误”?

时间:2017-05-12 19:30:15

标签: python scikit-learn countvectorizer

我有一个CountVectorizer:

word_vectorizer = CountVectorizer(stop_words=None, ngram_range=(2,2), analyzer='word')

实现该矢量化器:

X = word_vectorizer.fit_transform(group['cleanComments'])

引发此错误:

Traceback (most recent call last):

  File "<ipython-input-63-d261e44b8cce>", line 1, in <module>
    runfile('C:/Users/taca/Documents/Work/Python/Text Analytics/owccomments.py', wdir='C:/Users/taca/Documents/Work/Python/Text Analytics')

  File "C:\Users\taca\AppData\Local\Continuum\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile
    execfile(filename, namespace)

  File "C:\Users\taca\AppData\Local\Continuum\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/taca/Documents/Work/Python/Text Analytics/owccomments.py", line 38, in <module>
    X = word_vectorizer.fit_transform(group['cleanComments'])

  File "C:\Users\taca\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py", line 839, in fit_transform
    self.fixed_vocabulary_)

  File "C:\Users\taca\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn\feature_extraction\text.py", line 781, in _count_vocab
    raise ValueError("empty vocabulary; perhaps the documents only"

ValueError: empty vocabulary; perhaps the documents only contain stop words

当nGram从中拉出的文档是这个字符串时出现此错误:“重复q”。它发生在文档''。

的任何时候

为什么CountVectorizer不会将q(或任何单个字母)作为有效单词?是否有任何综合的地方列出了为CountVectorizer抛出此错误的可能原因?

编辑: 我做了更多的挖掘错误本身,看起来它与词汇有关。我假设标准词汇不接受单个字母作为单词,但我不确定如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

_count_vocab()函数抛出此错误,这是CountVectorizer类的一种方法。该类附带一个token_pattern,它定义了什么算作一个单词。 token_pattern参数的文档说明:

  

默认正则表达式选择2个或更多字母数字字符的标记

我们可以在__init__的默认参数中明确地看到这一点:

token_pattern=r"(?u)\b\w\w+\b"

如果您想允许使用单字母字词,只需从此模式中删除第一个\w,并在实例化token_pattern时明确设置CountVectorizer

CountVectorizer(token_pattern=r"(?u)\b\w+\b", 
                stop_words=None, ngram_range=(2,2), analyzer='word')