词向量源码解析:(5.5)ngram2vec源码解析之pairs2vocab

来源:互联网 发布:打印机排版软件 编辑:程序博客网 时间:2024/06/01 21:48

之前说过对词向量很重要的一个改进方向就是引入更加丰富的上下文信息。所以中心词和上下文词典是应该不一样的。其实这里中心词也可以引入不同的信息,上下文也可以引入不同的信息。pairs文件中包含了后面所需要的所有信息源,所以我们通过1pairs文件,可以得到中心词和上下文词典。pairs左边的构成中心词词典,右边的构成上下文词典。

def main():
    args = docopt("""
    Usage:
        pairs2vocab.py <pairs> <words> <contexts>
    """)
    
    print "**********************"
    print "pairs2vocab"
    words_path = args['<words>']
    contexts_path = args['<contexts>']


    words = {} #center word vocabulary//中心词词典
    contexts = {} #context vocabulary//上下文词典
    with open(args['<pairs>']) as f:
        pairs_num = 0
        print str(pairs_num/1000**2) + "M pairs processed."
        for line in f://遍历pairs
            pairs_num += 1
            if pairs_num % 1000**2 == 0:
                print "\x1b[1A" + str(pairs_num/1000**2) + "M pairs processed."
            pair = line.strip().split()
            if pair[0] not in words ://pair左边的进入中心词词典
                words[pair[0]] = 1
            else:
                words[pair[0]] += 1      
            if pair[1] not in contexts ://pair右边的进入上下文词典
                contexts[pair[1]] = 1
            else:
                contexts[pair[1]] += 1


    words = sorted(words.iteritems(), key=lambda item: item[1], reverse=True)//按照词频排序,是pairs文件中的词频,不是corpus中的词频
    contexts = sorted(contexts.iteritems(), key=lambda item: item[1], reverse=True)


    save_count_vocabulary(words_path, words)//用接口往磁盘写单词
    save_count_vocabulary(contexts_path, contexts)   
    print "words size: " + str(len(words))
    print "contexts size: " + str(len(contexts))
    print "number of pairs: " + str(pairs_num)
    print "pairs2vocab finished"

中心词和上下文词典就得到了。这两份词典会被后面所有的模型使用,或者说被大量的重用,这也是把很多模型集成到一个工具包的好处。

阅读全文
0 0
原创粉丝点击