Предположим, у меня есть 2 вектора. Какие алгоритмы я могу использовать для их сравнения? - PullRequest
1 голос
/ 27 ноября 2009

Компания 1 имеет этот вектор:

['books','video','photography','food','toothpaste','burgers'] ... ...

Компания 2 имеет этот вектор:

['video','processor','photography','LCD','power supply', 'books'] ... ...

Предположим, что это распределение частот (я мог бы сделать его кортежем, но его слишком много для ввода).
Как видите ... у этих векторов есть вещи, которые пересекаются. «видео» и «фотография» кажутся «похожими» между двумя векторами из-за того, что они находятся в одинаковых позициях. И ... «книги», очевидно, сильная сторона для компании 1. Порядок и расположение имеют значение, так как это распределение частот.

Какие алгоритмы вы могли бы использовать, чтобы поиграть с этим? Какие алгоритмы вы могли бы использовать, чтобы получить ценные данные для этих компаний, используя эти векторы?

Я новичок в области интеллектуального анализа текста и поиска информации. Может ли кто-нибудь рассказать мне об этих темах в связи с этим вопросом?

Ответы [ 6 ]

3 голосов
/ 27 ноября 2009

Если положение очень важно, как вы подчеркиваете, тогда критическая метрика будет основываться на разнице позиций между одними и теми же элементами в разных векторах (например, вы можете суммировать абсолютные значения различий или их квадраты). Большая проблема, которая должна быть решена, - сколько весить элемент, который присутствует (скажем, N-й) в одном векторе, и полностью отсутствует в другом. Является ли это относительно незначительной проблемой - как если бы, например, отсутствующий элемент действительно присутствовал сразу после фактических - или это действительно очень большое дело? Это невозможно сказать без большего понимания реальной области применения. Вы можете попробовать различные способы решения этой проблемы и посмотреть, какие результаты они дают в примерах, которые вам небезразличны!

Например, предположим, что «отсутствующий элемент примерно такой же, как если бы он присутствовал, сразу после фактических». Затем вы можете предварительно обработать каждый входной вектор в элемент отображения разметки в положение (критическая оптимизация, если вам нужно сравнить множество пар входных векторов!):

def makedict(avector):
  return dict((item, i) for i, item in enumerate(avector))

, а затем сравнить два таких слова:

def comparedicts(d1, d2):
  allitems = set(d1) | set(d2)      
  distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems]
  return sum(d * d for d in distances)

(или abs (d) вместо возведения в квадрат в последнем утверждении). Для того чтобы недостающие элементы весили больше (делайте надстройки, то есть векторы, рассматривайте дальше), вы можете использовать удвоенную длину вместо просто длин или некоторую большую константу, например, 100, в программе с аналогичной структурой.

3 голосов
/ 27 ноября 2009

Я бы предложил вам книгу под названием Программирование Коллективного Разума .
Это очень хорошая книга о том, как вы можете извлечь информацию из простых данных, подобных этой. Есть примеры кода (в Python:)

Edit: Просто отвечаю gbjbaanb: это Python!

a = ['books','video','photography','food','toothpaste','burgers']
b = ['video','processor','photography','LCD','power supply', 'books']
a = set(a)
b = set(b)

a.intersection(b)
    set(['photography', 'books', 'video'])

b.intersection(a)
    set(['photography', 'books', 'video'])

b.difference(a)
    set(['LCD', 'power supply', 'processor'])

a.difference(b)
    set(['food', 'toothpaste', 'burgers'])

2 голосов
/ 27 ноября 2009
0 голосов
/ 27 ноября 2009

выберите ранг каждой записи (чем выше ранг, тем лучше) и сделайте сумму геометрических средних между матчами

для двух векторов

sum(sqrt(vector_multiply(x,y)))  //multiply matches

Сумма рангов для каждого значения по вектору должна быть одинаковой для каждого вектора (предпочтительно 1) Таким образом, вы можете сравнивать более двух векторов.

Если вы примените метод иккебра, вы сможете узнать, насколько a аналогичен b

в этом случае просто используйте

sum( b( b.intersection(a) ))
0 голосов
/ 27 ноября 2009

Как уже упоминалось, расстояние Хэмминга - хорошее начало. Это в основном назначение битовой маски для каждого возможного элемента, независимо от того, содержится ли он в стоимости компании.

Например. зубная паста равна 1 для компании A, но 0 для компании B. Затем вы подсчитываете биты, которые различаются между компаниями. С этим связан коэффициент Жакара.

Расстояние Хэмминга на самом деле не сможет уловить сходство между такими вещами, как «видео» и «фотография». Очевидно, что компания, которая продает одну, продает другую также с большей вероятностью, чем компания, которая продает зубную пасту.

Для этого вы можете использовать такие вещи, как LSI (он также используется для уменьшения размерности) или факторные коды (например, вещи нейронной сети, такие как Restricted Boltzman Machines, Autoencoders или Predictablity Minimization), чтобы получить более компактные представления, которые затем можно сравнить, используя евклидово расстояние.

0 голосов
/ 27 ноября 2009

Вы можете использовать алгоритм set_intersection . Сначала нужно отсортировать 2 вектора (использовать вызов сортировки), затем передать 4 итератора, и вы получите коллекцию с общими элементами, вставленными в нее. Есть несколько других, которые работают аналогичным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...