更新:根据Python中特定列中的str值计算向量长度

时间:2013-12-11 17:04:05

标签: python vector counter

我正在尝试根据输入数据第一列的值来测量向量的长度。 例如:我的输入数据如下:

dog nmod+n+-n   4
dog nmod+n+n-a-commitment-n 6
child   into+ns-j+vn-pass-rb-divide-v   3
child   nmod+n+ns-commitment-n  5
child   nmod+n+n-pledge-n   3
hello   nmod+n+ns   2

我想要计算的值基于第一列中的相同值。例如,我会根据dog在第一列中的所有行计算一个值,然后根据child在第一列中的所有行计算一个值...等等。

我已经计算出数学来计算向量长度(Euc.norm)。但是,我不确定如何根据第一列中相同值的分组来计算。

到目前为止,这是我写的代码:

#!/usr/bin/python
import os
import sys
import getopt
import datetime
import math

print "starting:",
print datetime.datetime.now()


def countVectorLength(infile, outfile):

    with open(infile, 'rb') as inputfile:
        flem, _, fw = next(inputfile).split()
        current_lem = flem
        weights = [float(fw)]
        for line in inputfile:
            lem, _, w = line.split() 
            if lem == current_lem:
                weights.append(float(w))
            else:
                print current_lem,
                print math.sqrt(sum([math.pow(weight,2) for weight in weights]))

                current_lem = lem
                weights = [float(w)]

        print current_lem,
        print math.sqrt(sum([math.pow(weight,2) for weight in weights]))

            print "Finish:",
            print datetime.datetime.now()

path = '/Path/to/Input/'
pathout = '/Path/to/Output'
listing = os.listdir(path)
for infile in listing:
    outfile = 'output' + infile
    print "current file is:" + infile

    countVectorLength(path + infile, pathout + outfile)

此代码输出每个引理的向量长度。以上数据给出了以下输出:

dog 7.211102550927978
child   6.48074069840786
hello   2

更新 我一直在努力,我已经设法获得以下工作代码,如上面的代码示例中更新。但是,正如您将能够看到的那样。代码有一个问题,每个文件的最后一行的输出---我通过手动添加它已经解决了相当初步。但是,由于此问题,它不允许通过目录进行干净的迭代 - 输出附加的>文档中所有文件的所有结果。有没有办法让这个更简洁,pythonic的方式直接输出outpath目录中的每个单独的相应文件?

1 个答案:

答案 0 :(得分:1)

首先,您需要将输入转换为类似

的内容
dog => [4,2]
child => [3,5,3]
etc

它是这样的:

from collections import defaultdict
data = defaultdict(list)
for line in file:
    line = line.split('\t')
    data[line[0]].append(line[2])

一旦完成,剩下的就很明显了:

def vector_len(vec):
   you already got that

vector_lens = {name: vector_len(values) for name, values in data.items()}