Следуя вашему примеру, у вас есть карта между идентификаторами сообщений и предложениями
>>> text = ['This is the first sentence', 'This is the second sentence',
'This is the third sentence']
>>> message_map = dict(zip(range(len(text)), text))
>>> message_map
{0: 'This is the first sentence', 1: 'This is the second sentence', 2: 'This is the third sentence'}
Затем вы хотите подсчитать, сколько раз текстовая функция появляется в каждом предложении, используя CountVectorizer
.Вы можете запустить тот же анализ, что и у вас:
>>> vectorizer = CountVectorizer()
>>> # Learn the vocabulary dictionary and return term-document matrixtransform
>>> vectors = vectorizer.fit_transform(message_map.values()).toarray()
>>> vectors
array([[1, 1, 0, 1, 1, 0, 1],
[0, 1, 1, 1, 1, 0, 1],
[0, 1, 0, 1, 1, 1, 1]], dtype=int64)
>>> # get a mapping of the feature associated with each count entry
>>> features = vectorizer.get_feature_names()
>>> features
['first', 'is', 'second', 'sentence', 'the', 'third', 'this']
В документации fit_transform()
у вас есть:
fit_transform (self, raw_documents, y = Нет)
Параметры: raw_documents: iterable
Итерируемый, который возвращает объекты str, unicode или file.
Возвращает: X:массив, [n_samples, n_features]
матрица термина документа.
Это означает, что каждый из векторов соответствует предложению во входном тексте (то естьmessage_map.values()
) в том же порядке.Если вы хотите сопоставить идентификатор с каждым вектором, вы можете просто сделать (обратите внимание, что порядок сохраняется):
>>> vector_map = dict(zip(message_map.keys(), vectors.tolist()))
>>> vector_map
{0: [1, 1, 0, 1, 1, 0, 1], 1: [0, 1, 1, 1, 1, 0, 1], 2: [0, 1, 0, 1, 1, 1, 1]}
Я полагаю, что вы просите, чтобы соответствовать корпусу, а затем преобразовать новые предложенияв вектор количества объектов.Имейте в виду, что любое новое слово, которого нет в исходном корпусе, будет игнорироваться, как показано в этом примере:
from sklearn.feature_extraction.text import CountVectorizer
corpus= ['This is the first sentence', 'This is the second sentence']
vectorizer = CountVectorizer()
vectorizer.fit(corpus)
message_map = {0:'This is the first sentence', 1:'This is the second sentence', 2:'This is the third sentence'}
vector_map = { k: vectorizer.transform([v]).toarray().tolist()[0] for k, v in message_map.items()}
И вы получите:
>>> vector_map
{0: [1, 1, 0, 1, 1, 1], 1: [0, 1, 1, 1, 1, 1], 2: [0, 1, 0, 1, 1, 1]}
Обратите внимание, что теперьу вас на одну функцию меньше, чем раньше, потому что слово third
больше не является частью функций.
>>> vectorizer.get_feature_names()
['first', 'is', 'second', 'sentence', 'the', 'this']
Это может стать проблемой при вычислении сходства между векторами, поскольку вы отбрасываете словаэто может быть полезно для различения векторов.
С другой стороны, вы можете использовать словарь английского языка или его подмножество в качестве корпуса и вписать его в vectorizer
.Однако результирующие векторы станут более разреженными, и, опять же, это может вызвать проблемы при сравнении векторов.Но это будет зависеть от метода, который вы используете для расчета расстояния между векторами.