Соотнесите вектор текста в словаре с ключом в словаре - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть текст, который я получаю из базы данных sqlite3.Я хочу сравнить сходство текста, сначала получив вектор текста с CountVectorizer.У меня также есть словарь, где я храню текст, связанный с messageID (как ключ словаря).Как я могу связать каждый вектор текста с messageID?Например, с векторным массивом, который выглядит так:

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

Я хотел бы знать, что messageID = 0 имеет вектор [1 1 0 1 1 0 1].Размер вектора и массив увеличиваются с каждым новым сообщением.

Я попытался поместить словарь в CountVectorizer и попытался оценить только одно сообщение, но ни одно из них не сработало.

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity as cosineSimilarity


def getVectorsAndFeatures(strs):
    text = [t for t in strs]
    vectorizer = CountVectorizer(text)
    vectorizer.fit(text)
    vectors = vectorizer.transform(text).toarray()
    features = vectorizer.get_feature_names()
    return vectors, features


text = ['This is the first sentence', 'This is the second sentence',
        'This is the third sentence']
messageDict = {0: 'This is the first sentence', 1: 'This is the second sentence', 2: 'This is the third sentence'}

vectors, features = getVectorsAndFeatures(text)

1 Ответ

0 голосов
/ 25 сентября 2019

Следуя вашему примеру, у вас есть карта между идентификаторами сообщений и предложениями

>>> 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.Однако результирующие векторы станут более разреженными, и, опять же, это может вызвать проблемы при сравнении векторов.Но это будет зависеть от метода, который вы используете для расчета расстояния между векторами.

...