Могу ли я использовать 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()