了解sklearn.feature_extraction.text的CountVectorizer类中的_count_vocab方法

时间:2013-11-15 17:46:23

标签: python scikit-learn feature-extraction

我在CountVectorizer中使用fit_transform方法,我正在阅读代码以尝试了解它正在做什么。我在CountVectorizer中的_count_vocab方法中有点困惑,特别是在嵌套的for循环下。对于原始文档,我有一个句子列表,而fixed_vocab = False。

def _count_vocab(self, raw_documents, fixed_vocab):
    """Create sparse feature matrix, and vocabulary where fixed_vocab=False"""
    if fixed_vocab:
        vocabulary = self.vocabulary_
    else:
        # Add a new value when a new vocabulary item is seen
        vocabulary = defaultdict(None)
        vocabulary.default_factory = vocabulary.__len__

    analyze = self.build_analyzer()
    j_indices = _make_int_array()
    indptr = _make_int_array()
    indptr.append(0)
    for doc in raw_documents:
        for feature in analyze(doc):
            try:
                j_indices.append(vocabulary[feature])
            except KeyError:
                # Ignore out-of-vocabulary items for fixed_vocab=True
                continue
        indptr.append(len(j_indices))
    if not fixed_vocab:
        # disable defaultdict behaviour
        vocabulary = dict(vocabulary)
        if not vocabulary:
            raise ValueError("empty vocabulary; perhaps the documents only"
                             " contain stop words")

    # some Python/Scipy versions won't accept an array.array:
    if j_indices:
        j_indices = np.frombuffer(j_indices, dtype=np.intc)
    else:
        j_indices = np.array([], dtype=np.int32)
    indptr = np.frombuffer(indptr, dtype=np.intc)
    values = np.ones(len(j_indices))

    X = sp.csr_matrix((values, j_indices, indptr),
                      shape=(len(indptr) - 1, len(vocabulary)),
                      dtype=self.dtype)
    X.sum_duplicates()
    return vocabulary, X

这里的词汇表是一个空的defaultdict对象。因此,j_indices不会附加元素,因为词汇表是空的,因此词汇[feature]返回错误并忽略错误,继续循环迭代的下一个。它将继续为raw_documents中的所有doc以及analyze(doc)返回的标记中的所有功能执行此操作。在这个j_indices和indptr的末尾是空的array.array对象。

我认为_count_vocab会创建自己的词汇对象,并在遇到新的词汇单词时附加值,但它看起来不像。

在这种情况下,我应该提供我自己的词汇表吗?既然我没有,我在哪里可以得到单词词典?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

  

vocabulary[feature]返回错误并忽略错误

由于vocabularydefaultdict,因此没有错误。会发生什么

>>> vocabulary = defaultdict(None)
>>> vocabulary.default_factory = vocabulary.__len__
>>> j_indices = []
>>> analyzed = ["foo", "bar", "baz", "foo", "quux"]
>>> for feature in analyzed:
...     j = vocabulary[feature]
...     print("%s %d" % (feature, j))
...     j_indices.append(j)
...     
foo 0
bar 1
baz 2
foo 0
quux 3

结果

>>> dict(vocabulary)
{'bar': 1, 'foo': 0, 'baz': 2, 'quux': 3}
>>> j_indices
[0, 1, 2, 0, 3]

所以这段代码可以正常工作。案例KeyError fixed_vocab=True捕获。