это мой первый вопрос, поэтому я прошу прощения, если я не правильно это делаю.
Итак, у меня проблема с вычислением матрицы ортогональности. Я имею в виду, что я хочу вычислить массив, похожий на матрицу совместного использования, но не имеющий совместного использования: мне нужны одни вхождения. Массив должен иметь размер (количество слов, количество слов) , и я полностью осознаю, что этот массив будет очень разреженным.
Проблема начинается с того факта, чтоФункция '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 ...