Модель Gensim word2vec выдает 1000 измерений ndarray, но максимальное число измерений ndarray равно 32 - как? - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь использовать эту модель 1000 википедии word2vec для анализа некоторых документов.

Используя интроспекцию, я обнаружил, что векторное представление слова представляет собой 1000 единиц измерения. ndarray, однако всякий раз, когда я пытаюсь создать ndarray, чтобы найти ближайшие слова, я получаю ошибку значения:

ValueError: maximum supported dimension for an ndarray is 32, found 1000

, и из того, что я могу сказать, просматривая онлайн 32, действительно максимальное поддерживаемое число измерений дляndarray - так что дает? Как gensim может вывести ndarray размером 1000?

Вот пример кода:

doc = [model[word] for word in text if word in model.vocab]
out = []
n = len(doc[0])
print(n)
print(len(model["hello"]))
print(type(doc[0]))
for i in range(n):
    sum = 0
    for d in doc:
        sum += d[i]
    out.append(sum/n)
out = np.ndarray(out)

, который выдает:

1000
1000
<class 'numpy.ndarray'>
ValueError: maximum supported dimension for an ndarray is 32, found 1000

Цель здесь состоит в том, чтобывычислите средний вектор всех слов в корпусе в формате, который можно использовать для поиска близлежащих слов в модели, поэтому любые альтернативные предложения на этот счет приветствуются.

1 Ответ

1 голос
/ 06 октября 2019

Вы вызываете функцию-конструктора numpy ndarray() со списком, содержащим 1000 чисел - ваши вручную рассчитанные средние значения каждого из 1000 измерений.

Функция ndarray() ожидает, что ее аргумент будет shape построенной матрицы, поэтому она пытается создать новую матрицу формы (d[0], d[1], ..., d[999]) - и затем каждое отдельное значение внутри этогоматрица будет адресована с набором 1000-int координат. И действительно, массивы numpy могут иметь только 32 независимых измерения.

Но даже если вы сократите список, который вы предоставляете, до ndarray() до 32 чисел, у вас все равно будет проблема, потому что ваши 32 числа являются значениями с плавающей запятой, а ndarray() ожидаетинтегральные числа. (Вы получите TypeError.)

В рамках подхода, который вы пытаетесь использовать - который не совсем оптимален, как мы покажем ниже - вы действительно хотите создать один вектор из 1000 измерений с плавающей точкой. То есть 1000 клеточных значений - не d[0] * d[1] * ... * d[999] отдельных клеточных значений.

Таким образом, грубое исправление в соответствии с первоначальным подходом могло бы заменить вашу последнюю строку на:

result = np.ndarray(len(d))
for i in range(len(d)):
    result[i] = d[i]

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

Для одного вместо этого цикла назначенияв моем коде чуть выше, вы можете использовать опцию присваивания скобками индексации Python:

result = np.ndarray(len(d))
result[:] = d  # same result as previous 3-lines w/ loop

Но на самом деле, функция numpy *1034* может, по сути, создать необходимую numpy -нарожденную ndarray из данного списка, поэтому вместо использования ndarray() вы можете просто использовать array():

result = np.array(d)  # same result as previous 2-lines

Но, кроме того, многие функции numpy для работы с массивами (исписки, подобные массиву), уже включают в себя действия, позволяющие выполнять усреднение многих векторов за один шаг (где даже циклы скрыты внутри очень эффективного скомпилированного кода или операций объемного вектора ЦП). Например, есть функция mean(), которая может усреднять списки чисел, или многомерные массивы чисел, или выровненные наборы векторов и т. Д.

Это позволяет быстрее, более четкие, однострочные подходыкоторый может заменить весь ваш исходный код на что-то вроде:

# get a list of available word-vetors
doc = [model[word] for word in text if word in model.vocab]
# average all those vectors
out = np.mean(doc, axis=0)

(без аргумента axis он усреднит все отдельные значения измерения во всех слотах в одно единственное окончательное среднее число.)

...