Как эффективно вычислить вектор ортогональности? (НЛП) - PullRequest
0 голосов
/ 09 ноября 2019

это мой первый вопрос, поэтому я прошу прощения, если я не правильно это делаю.

Итак, у меня проблема с вычислением матрицы ортогональности. Я имею в виду, что я хочу вычислить массив, похожий на матрицу совместного использования, но не имеющий совместного использования: мне нужны одни вхождения. Массив должен иметь размер (количество слов, количество слов) , и я полностью осознаю, что этот массив будет очень разреженным.

Проблема начинается с того факта, чтоФункция 'count' должна различать слова справа и слова слева от цели в пределах окна из 5 слов: это проблема номер 1. Как это сделать эффективно? Вот мой код для этого: brokensentence - это то, как я назвал свой токенизированный текст

import collections 
def contextDefiner(word,brokensentence,side):
    brokensentence = np.array(brokensentence)
    count = collections.Counter()
    if side == 'right':
        context = [[b,c,d,e,f] for (a,b,c,d,e,f) in  
                   zip(brokensentence[:],brokensentence[1:],brokensentence[2:],brokensentence[3:],brokensentence[4:],brokensentence[5:]) if a==word]  
    if side == 'left':
        context = [[a,b,c,d,e] for (a,b,c,d,e,f) in 
                   zip(brokensentence[:],brokensentence[1:],brokensentence[2:],brokensentence[3:],brokensentence[4:],brokensentence[5:]) if f==word]
    for ngram in context:
        count.update(ngram)
    return (count)

Хорошо, теперь моя вторая проблема в том, что мой вывод - словарь. Я должен определить контекст для каждого слова в моем словаре. Вот как я определил свой словарь:

def vocabularyCreator(corpus):
    vocabulary = sorted(set(wordBreaker(corpus)))
    count=0
    dictionary={}
    for word in vocabulary:
         dictionary[word]=count
         count+=1
    return dictionary

Теперь я должен перевести результаты для каждого слова в массив. Имейте в виду, что индексы моего массива должны совпадать с индексами в моем словаре. Я имею в виду, если слово «медведь» является 23-м словом в моем словаре, контекст должен быть сохранен в 23-й строке. Это то, что я сделал, но это займет так долго, чтобы вычислить!

from scipy import sparse
from scipy.sparse import csr_matrix
from scipy.sparse import lil_matrix

def matrixFiller(vocab,brokensentence,side):
    words = vocab.keys()
    matrix = lil_matrix((len(vocab),len(vocab)))
    for word in words:
        wordindex = vocab.get(word)
        context = contextDefiner(word,brokensentence,side)
        for item in context:
            itemindex = vocab.get(item)
            matrix[wordindex,itemindex]=context.get(item)
    return sparse.csr_matrix(matrix)

Я думаю, что лучшей идеей было бы определить контекст слева (или справа) для каждого слова одновременно, вместо того, чтобы моя функция contextDefiner итерировала * (количество слов)** раз. Но как это сделать? Кроме того, мне нужно, чтобы это было максимально эффективно, потому что мне нужно работать над большим корпусом текстов.

Надеюсь, это имеет смысл, и вы сможете мне помочь! Огромное спасибо. Скажите, если вам нужно что-то еще, чтобы понять мою проблему! Кроме того, конечный вывод должен быть совместим с функцией KMeansClustering ...

...