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

更新:根据Python中特定列中的str值计算向量长度,python,vector,counter,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位于第一列的所有

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

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
更新
我一直在研究它,并且我已经成功地获得了下面的工作代码,正如上面的代码示例中所更新的。然而,正如你所看到的。代码在每个文件的最后一行的输出上有一个问题——我已经通过手动添加它基本解决了这个问题。但是,由于这个问题,它不允许在目录中进行干净的迭代——在附加的
文档中输出所有文件的所有结果。有没有一种方法可以使输出路径目录中的每个单独的对应文件更简洁、更通俗?

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

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()}

这会产生回溯错误:
TypeError:“type”对象不可编辑
--请参阅更新code@owwoow14当前位置我发布的代码不起作用-我故意遗漏了一些您应该能够自己了解的细节。