Могу ли я использовать CountVectorizer в scikit-научиться считать частоту документов, которые не использовались для извлечения токенов?

я работал с CountVectorizer класс в scikit-learn.

Я понимаю, что при использовании способом, показанным ниже, конечный результат будет состоять из массива, содержащего количество объектов или токенов.

эти жетоны извлекаются из набора ключевых слов, т. е.

tags = [
  "python, tools",
  "linux, tools, ubuntu",
  "distributed systems, linux, networking, tools",
]

следующий шаг:

from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(tokenizer=tokenize)
data = vec.fit_transform(tags).toarray()
print data

где мы получаем

[[0 0 0 1 1 0]
 [0 1 0 0 1 1]
 [1 1 1 0 1 0]]

это прекрасно, но моя ситуация немного отличается.

Я хочу извлечь функции так же, как и выше, но я не хочу, чтобы строки в data быть теми же документами, из которых были извлечены функции.

другими словами, как я могу получить подсчеты другого набора документов, скажем,

list_of_new_documents = [
  ["python, chicken"],
  ["linux, cow, ubuntu"],
  ["machine learning, bird, fish, pig"]
]

и

[[0 0 0 1 0 0]
 [0 1 0 0 0 1]
 [0 0 0 0 0 0]]

Я прочитал документацию для CountVectorizer класс, и наткнулся на vocabulary аргумент, который представляет собой сопоставление терминов с индексами объектов. Кажется, я не понимаю. аргумент, чтобы помочь мне, однако.

любой совет приветствуется.
PS: все кредиты из-за блог Матиаса Фридриха для примера, который я использовал выше.

3 ответов


вы правы, что vocabulary это то, что вы хотите. Он работает следующим образом:

>>> cv = sklearn.feature_extraction.text.CountVectorizer(vocabulary=['hot', 'cold', 'old'])
>>> cv.fit_transform(['pease porridge hot', 'pease porridge cold', 'pease porridge in the pot', 'nine days old']).toarray()
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 0],
       [0, 0, 1]], dtype=int64)

таким образом, вы передаете ему дикт с нужными функциями в качестве ключей.

если вы используете CountVectorizer на одном наборе документов, а затем вы хотите использовать набор функций из этих документов для нового набора, используйте vocabulary_ атрибут вашего исходного CountVectorizer и передать его в новый. Таким образом, в вашем примере вы можете сделать

newVec = CountVectorizer(vocabulary=vec.vocabulary_)

для создания новой разметки с помощью словарный запас с первого раза.


вы должны позвонить fit_transform или просто fit на исходном источнике словаря, чтобы векторизатор изучал vocab.

тогда вы можете использовать это fit векторизатор на любом новом источнике данных через transform() метод.

вы можете получить словарный запас, производимый fit (т. е. отображение слова в идентификатор токена) через vectorizer.vocabulary_ (при условии, что вы назовете свой CountVectorizer имя vectorizer.


>>> tags = [
  "python, tools",
  "linux, tools, ubuntu",
  "distributed systems, linux, networking, tools",
]

>>> list_of_new_documents = [
  ["python, chicken"],
  ["linux, cow, ubuntu"],
  ["machine learning, bird, fish, pig"]

]

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> vect = CountVectorizer()
>>> tags = vect.fit_transform(tags)

# vocabulary learned by CountVectorizer (vect)
>>> print(vect.vocabulary_)
{'python': 3, 'tools': 5, 'linux': 1, 'ubuntu': 6, 'distributed': 0, 'systems': 4, 'networking': 2}

# counts for tags
>>> tags.toarray()
array([[0, 0, 0, 1, 0, 1, 0],
       [0, 1, 0, 0, 0, 1, 1],
       [1, 1, 1, 0, 1, 1, 0]], dtype=int64)

# to use `transform`, `list_of_new_documents` should be a list of strings 
# `itertools.chain` flattens shallow lists more efficiently than list comprehensions

>>> from itertools import chain
>>> new_docs = list(chain.from_iterable(list_of_new_documents)
>>> new_docs = vect.transform(new_docs)

# finally, counts for new_docs!
>>> new_docs.toarray()
array([[0, 0, 0, 1, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0, 0]])

чтобы проверить, что CountVectorizer использует словарный запас, полученный из tags on new_docs: print vect.vocabulary_ еще раз или сравните выход new_docs.toarray() до tags.toarray()