Gensim - Вектор и модель
Здесь мы узнаем об основных концепциях Gensim, уделяя основное внимание вектору и модели.
Что такое вектор?
Что, если мы хотим вывести скрытую структуру в нашем корпусе? Для этого нам нужно представить документы таким образом, чтобы мы могли обрабатывать их математически. Один из популярных видов представления - представить каждый документ корпуса как вектор функций. Поэтому можно сказать, что вектор - это математически удобное представление документа.
Чтобы дать вам пример, давайте представим одну функцию из нашего вышеупомянутого корпуса в виде пары QA -
Q - Сколько раз встречается слово Hello появиться в документе?
A - Ноль (0).
Q - Сколько абзацев в документе?
A - Два (2)
Вопрос обычно представлен его целочисленным идентификатором, поэтому представление этого документа представляет собой серию пар, таких как (1, 0.0), (2, 2.0). Такое векторное представление известно какdenseвектор. Зачемdense, потому что он содержит явный ответ на все вопросы, написанные выше.
Представление может быть простым как (0, 2), если мы заранее знаем все вопросы. Такая последовательность ответов (конечно, если вопросы известны заранее) и естьvector для нашего документа.
Другой популярный вид представления - это bag-of-word (BoW)модель. В этом подходе каждый документ в основном представлен вектором, содержащим частоту каждого слова в словаре.
В качестве примера предположим, что у нас есть словарь, который содержит слова ['Привет', 'Как', 'есть', 'ты']. Документ, состоящий из строки «Как дела?», Тогда будет представлен вектором [0, 2, 1, 1]. Здесь элементы вектора расположены в порядке появления «Hello», «How», «are» и «you».
Вектор против документа
Из приведенного выше объяснения вектора почти понятно различие между документом и вектором. Но, чтобы было понятнее,document это текст и vectorматематически удобное представление этого текста. К сожалению, иногда многие люди используют эти термины как синонимы.
Например, предположим, что у нас есть произвольный документ A, тогда вместо того, чтобы говорить «вектор, который соответствует документу A», они обычно говорили «вектор A» или «документ A». Это приводит к большой двусмысленности. Здесь следует отметить еще одну важную вещь: два разных документа могут иметь одинаковое векторное представление.
Преобразование корпуса в список векторов
Прежде чем брать пример реализации преобразования корпуса в список векторов, нам нужно связать каждое слово в корпусе с уникальным целочисленным идентификатором. Для этого мы расширим пример, взятый в предыдущей главе.
пример
from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
Вывод
Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)
Это показывает, что в нашем корпусе есть 25 разных токенов в этом gensim.corpora.Dictionary.
Пример реализации
Мы можем использовать словарь, чтобы превратить токенизированные документы в эти 5-мерные векторы следующим образом:
pprint.pprint(dictionary.token2id)
Вывод
{
'binary': 11,
'computer': 0,
'error': 7,
'generation': 12,
'graph': 16,
'intersection': 17,
'iv': 19,
'measurement': 8,
'minors': 20,
'opinion': 1,
'ordering': 21,
'paths': 18,
'perceived': 9,
'quasi': 22,
'random': 13,
'relation': 10,
'response': 2,
'survey': 3,
'system': 4,
'time': 5,
'trees': 14,
'unordered': 15,
'user': 6,
'well': 23,
'widths': 24
}
Точно так же мы можем создать краткое представление документа следующим образом:
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
Вывод
[
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)],
[(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)],
[(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)],
[(14, 1), (16, 1), (17, 1), (18, 1)],
[(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)]
]
Что такое модель?
После того, как мы векторизовали корпус, что дальше? Теперь мы можем преобразовать его с помощью моделей. Модель может быть отнесена к алгоритму, используемому для преобразования одного представления документа в другое.
Как мы уже обсуждали, документы в Gensim представлены в виде векторов, поэтому мы можем моделировать их как преобразование между двумя векторными пространствами. Всегда есть этап обучения, на котором модели изучают детали таких преобразований. Модель считывает тренировочный корпус во время фазы обучения.
Инициализация модели
Давайте инициализируем tf-idfмодель. Эта модель преобразует векторы из представления BoW (Bag of Words) в другое векторное пространство, где подсчеты частоты взвешиваются в соответствии с относительной редкостью каждого слова в корпусе.
Пример реализации
В следующем примере мы собираемся инициализировать tf-idfмодель. Мы обучим его на нашем корпусе, а затем преобразуем строковый «граф деревьев».
пример
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])
Вывод
[(3, 0.4869354917707381), (4, 0.8734379353188121)]
Теперь, когда мы создали модель, мы можем преобразовать весь корпус через tfidf и проиндексировать его, а также запросить сходство нашего документа запроса (мы даем документу запроса «систему деревьев») по каждому документу в корпусе -
пример
from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5)
query_document = 'trees system'.split()
query_bow = dictionary.doc2bow(query_document)
simils = index[tfidf[query_bow]]
print(list(enumerate(simils)))
Вывод
[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]
Из вышеприведенного вывода документ 4 и документ 5 имеют оценку сходства около 49%.
Более того, мы также можем отсортировать этот вывод для большей читабельности следующим образом:
пример
for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
print(doc_number, score)
Вывод
2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0