我正在尝试根据输入数据第一列的值来测量向量的长度。 例如:我的输入数据如下:
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目录中的每个单独的相应文件?
答案 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()}