Я создаю слово cooccurrence matrix в Python и используя вложенные defaultdicts для создания матрицы. Я успешно создал матрицу и сохранил количество слов, но теперь у меня возникают проблемы при попытке вернуть вектор (строку матрицы) из вложенного defaultdict.Как можно получить доступ к строке матрицы, созданной вложенным defaultdict в Python?
Вот строка кода, я использовал, чтобы инициализировать матрицу:
matrix = collections.defaultdict(lambda: collections.defaultdict(int))
Вот строки, которые я использовал, чтобы ввести слово отсчитывает в матрицу:
matrix[target_word_id][collocated_word_id] += 1
matrix[collocated_word_id][target_word_id] += 1
И это как я пытаюсь получить доступ к строке матрицы для строки, соответствующей данному слову id:
vector1 = matrix[word1_id]
При печати Vector1, чтобы проверить свою работу, это то, что я получаю в качестве выхода:
defaultdict(<class 'int'>, {})
Полный код для этого класса здесь. Я звоню функции от отдельного основного класса:
class Create_vector():
def build_vocab(self, corpus):
vocab = collections.defaultdict(int)
i = 1
for line in corpus:
token = line.strip()
if token not in vocab:
vocab[token] = i
i += 1
return vocab
def build_cooccurrence(self, corpus, vocab, window):
matrix = collections.defaultdict(lambda: collections.defaultdict(int))
for x, line in enumerate(corpus):
if x % 100000 == 0:
print('Building cooccurrence matrix: on line %i', x)
tokens = line.strip()
token_ids = [vocab[token] for token in tokens]
for i, target_word_id in enumerate(token_ids):
collocated_word_ids = token_ids[min(0, target_word_id - window): target_word_id]
for j, collocated_word_id in enumerate(collocated_word_ids):
matrix[target_word_id][collocated_word_id] += 1
matrix[collocated_word_id][target_word_id] += 1
return matrix
def get_vector(self, matrix, vocab, weight, word1, word2):
if weight == 'FREQ':
if word1 in vocab:
word1_id = vocab[word1]
vector1 = matrix[word1_id]
pprint.pprint(vector1)
Основной класс здесь:
import nltk
import sys
from nltk.corpus import stopwords
import create_vector
import pprint
import string
def main():
brown_words = list(nltk.corpus.brown.words())
window = int(sys.argv[1])
weight = sys.argv[2]
brown_words_lower = [word.lower() for word in brown_words]
brown_words_only = [w for w in brown_words_lower if w not in string.punctuation]
stops = set(stopwords.words('english'))
brown_words_filtered = [w for w in brown_words_only if w not in stops]
vector = create_vector.Create_vector()
vocab = vector.build_vocab(brown_words_filtered)
cooccurrence = vector.build_cooccurrence(brown_words_filtered, vocab, window)
for line in text:
words = line.split(',')
word1 = words[0]
word2 = words[1]
vector1, vector2 = vector.get_vector(cooccurrence, vocab, weight, word1, word2)
И команда для запуска это: python3.4 main.py 2 FREQ
Ваш вопрос будет более понятным, если вы добавите образец ввода и его вывод! – Kasramvd
'tokens = line.strip()' 'token_ids = [vocab [токен] для токена в токенах]' Вы уверены, что не собираетесь использовать 'str.split'? – ToonAlfrink
Я думаю, что strip() верна. Я печатал вещи по пути, и список вокаба и матрица совпадения казались мне верными при использовании strip(). Кроме того, поскольку я беру только слова из корпуса Брауна, они уже настроены в списке. – Alex