在Python中如何访问嵌套的defaultdict创建的矩阵行?

在Python中如何访问嵌套的defaultdict创建的矩阵行?,python,matrix,defaultdict,Python,Matrix,Defaultdict,我正在用Python创建一个单词共现矩阵,并使用嵌套的DefaultDict创建矩阵。我已经成功地创建了矩阵并存储了字数,但是现在在尝试从嵌套的defaultdict中获取向量(矩阵行)时遇到了问题 下面是我用来初始化矩阵的代码行: matrix[target_word_id][collocated_word_id] += 1 matrix[collocated_word_id][target_word_id] += 1 matrix=collections.defaultdict(lamb

我正在用Python创建一个单词共现矩阵,并使用嵌套的DefaultDict创建矩阵。我已经成功地创建了矩阵并存储了字数,但是现在在尝试从嵌套的defaultdict中获取向量(矩阵行)时遇到了问题

下面是我用来初始化矩阵的代码行:

matrix[target_word_id][collocated_word_id] += 1

matrix[collocated_word_id][target_word_id] += 1
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'>, {})
主要课程如下:

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无法复制:

>>> 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})
导入集合 >>>矩阵=collections.defaultdict(lambda:collections.defaultdict(int)) >>>矩阵[2][3]+=1 >>>矩阵[3][2]+=1 >>>向量1=矩阵[2] >>>矢量1 defaultdict(,{3:1}) 您确定
word1\u id
中的值等于已插入矩阵的值吗?
您能否发布完整的代码,而不仅仅是零碎的代码?

如果您添加一个示例输入及其输出,您的问题将更加清楚
tokens=line.strip()
token\u id=[vocab[token]表示令牌中的令牌]
您确定不打算使用
str.split
?我认为strip()是正确的。在使用strip()的过程中,我一直在打印一些东西,我觉得歌手和合作矩阵是正确的。此外,由于我只是从Brown语料库中提取单词,因此它们已经在列表中配置。列表没有
strip
属性,因此您的
tokens
变量此时必须是字符串。如果遍历它,则遍历字符串中的各个字符。如果您认为我不正确,只需打印出
标记
,然后查看。当我打印出标记时,我会得到一个单词列表,例如:能够测量眼睛,我确信id等于已经插入到矩阵中的值。我只在单词在词汇表中生成值,词汇表是从我构建矩阵的语料库中生成的。此外,我的单词列表的所有向量都返回该输出