2015-03-04 2 views
1

Я создаю слово 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

+0

Ваш вопрос будет более понятным, если вы добавите образец ввода и его вывод! – Kasramvd

+0

'tokens = line.strip()' 'token_ids = [vocab [токен] для токена в токенах]' Вы уверены, что не собираетесь использовать 'str.split'? – ToonAlfrink

+0

Я думаю, что strip() верна. Я печатал вещи по пути, и список вокаба и матрица совпадения казались мне верными при использовании strip(). Кроме того, поскольку я беру только слова из корпуса Брауна, они уже настроены в списке. – Alex

ответ

1

не удается воспроизвести:

>>> import collections 
>>> matrix = collections.defaultdict(lambda: collections.defaultdict(int)) 
>>> matrix[2][3] += 1 
>>> matrix[3][2] += 1 
>>> vector1 = matrix[2] 
>>> vector1 
defaultdict(<type 'int'>, {3: 1}) 

Вы уверены, что значение в вашей word1_id равно значению, которое уже вставлено в матрицу? Не могли бы вы опубликовать полный код, а не только его обрывки?

+0

Да, я уверен, что идентификатор равен значение, которое уже вставлен в матрицу. Я генерирую только значение, если слово находится в словаре, который генерируется из корпуса, на котором я строю матрицу. Кроме того, все векторы для моего списка слов возвращают этот вывод – Alex