Создавая слово совместной встречаемости биграмм матрицы


Я написал метод, который предназначен для расчета слово сочетаемостные матрицу в корпус, такая, что элементы(i,j) - это количество раз, которое слово меня повторяет слова J в корпус.

Вот мой код с маленький пример:

import numpy as np 
import nltk
from nltk import bigrams    

def co_occurrence_matrix(corpus):
    vocab = set(corpus)
    vocab = list(vocab)

    # Key:Value = Word:Index
    vocab_to_index = { word:i for i, word in enumerate(vocab) }

    # Create bigrams from all words in corpus
    bi_grams = list(bigrams(corpus))

    # Frequency distribution of bigrams ((word1, word2), num_occurrences)
    bigram_freq = nltk.FreqDist(bi_grams).most_common(len(bi_grams))

    # Initialise co-occurrence matrix
    # co_occurrence_matrix[current][previous]
    co_occurrence_matrix = np.zeros((len(vocab), len(vocab)))

    # Loop through the bigrams in the frequency distribution, noting the 
    # current and previous word, and the number of occurrences of the bigram.
    # Get the vocab index of the current and previous words.
    # Put the number of occurrences into the appropriate element of the array.
    for bigram in bigram_freq:
        current = bigram[0][1]
        previous = bigram[0][0]
        count = bigram[1]
        pos_current = vocab_to_index[current]
        pos_previous = vocab_to_index[previous]
        co_occurrence_matrix[pos_current][pos_previous] = count 

    co_occurrence_matrix = np.matrix(co_occurrence_matrix)

    return co_occurrence_matrix

test_sent = ['hello', 'i', 'am', 'hello', 'i', 'dont', 'want', 'to', 'i', 'dont']
m = co_occurrence_matrix(test_sent)

Выход:

[[0. 2. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 2.]
 [0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0.]
 [1. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0.]]

А в примере, показанном работает нормально, когда я увеличить масштаб гораздо больше корпус, я получаю следующее Killed:9 ошибка. Я предполагаю, что это потому, что матрица очень большие.

Я ищу, чтобы сделать этот метод более эффективным, так что я могу использовать его для больших корпусов! (Несколько миллионов слов).



Комментарии
1 ответ

В 106 × 106 матрица будет содержать 1012 записей. Оптимистично предполагая, что один байт на запись, что бы уже 1 ТБ. Я ожидаю, что большинство записей матрицы будет равен 0. Рассмотреть глядя в разреженными матрицами.

1
ответ дан 27 февраля 2018 в 09:02 Источник Поделиться