2015-06-23 7 views
2

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

В openCV я нашел только BOWImgDescriptorExtractor, но это работает только с изображениями.

Может кто-нибудь объяснить мне, как я нахожу ближайшее слово для данного вектора в своем словаре? Я много читал о FlannBasedMatcher и BruteforceMatcher, но я не знаю, как преобразовать вектор в формат для моего словаря.

Спасибо за вашу помощь

+0

Ваш первый абзац звучит довольно близко к тому, что уже делает word2vec. Вы можете проверить это – stan0

+0

Если у вас есть свой словарный запас, я бы использовал [евклидова расстояние] (https://en.wikipedia.org/wiki/Euclidean_distance), чтобы вычислить расстояние и грубую силу (проверяя расстояние до всех слов и выбор ближайшего). –

+0

Чтобы лучше определить проблему, вам нужно больше поговорить о связи между словом и вектором. Что представляет вектор? Это образ рукописного слова? – Diego

ответ

1

Вы хотите конвертировать текстовые документы в векторы, где каждая функция соответствует слову (или п-грамм, которая представляет собой ряд русских слов), и значение для каждого особенностью является либо количество слов в документе, либо его частота, либо лучше, это tf-idf.

Как только у вас есть средства для преобразования документа в вектор, вы можете измерить расстояние между любыми двумя векторами. Эти два вектора представляют собой два разных документа. В вашем случае один вектор будет представлять документ с одним словом, а другой будет текстовым документом, который вам интересен. Чтобы избежать того, чтобы длинные документы играли роль в измерении расстояния, используется cosine distance в текстовом анализе, а не euclidean distance.

Чтобы найти ближайшее слово к данному вектору, вы можете в основном выполнить поиск грубой силы, вычисляя расстояние между косинусом между вектором слова и вектором запроса. Победителем является слово, которое дает вам наименьшее расстояние.

Если вам нужно сделать это для большого количества векторов с большой лексикой, есть алгоритмы, чтобы сделать этот поиск намного быстрее, чем грубая сила. Они включают в себя индексы построения (datastructures), которые позволяют вам проверять расстояние меньшего подмножества, чтобы найти победителя (вы можете автоматически исключить целую кучу слов без явного измерения расстояния). Если вы захотите потерять немного точности, чтобы получить гораздо более быстрый поиск ближайшего слова, there are great algorithms for that as well.

Чтобы реализовать текстовый документ в векторный конвертер, сначала вам нужно пройти весь корпус и записать каждое уникальное слово, создав хеш-таблицу, которая определяет целочисленный идентификатор для каждого слова, которое вы видите. Это ваш словарный запас. Скажем, есть 50K слов. Каждый из ваших документов будет представлен вектором длиной 50K. Каждый вектор будет очень скудным, у вас будет 0 для большинства функций (у большинства документов будет только крошечная часть всего словаря). Вы просматриваете каждый документ и вычисляете значение (количество, частота или tf-idf) для каждого слова в документе и записываете это значение в вектор под столбцом, связанным с данным словом. Так вы преобразовываете текст в вектор. Само слово само по себе является простейшим вектором, конечно: a 1 в соответствующем столбце и нулевым везде.

Как упоминается stan0, word2vec является открытым исходным кодом и уже делает все это, поэтому я бы попробовал. Here is a tutorial to get you started.

Смежные вопросы