我需要计算两个不同文件中一个元素的加权分数的并集和交集。
输入文件1和输入文件2是相同的:3个标签分隔的列: 这是一个例子:
INPUT1
abc with-1-rosette-n 8.1530
abc with-1-tyre-n 6.3597
abc with-1-weight-n 4.8932
输入2
deg about-article-n 3.2917
deg with-1-tyre-n 3.2773
deg about-bit-n 3.4527
我们想要计算ABC的Col 2中每个值的得分(在Col3中)的交点之和,其中我们考虑min(值)& DEG以及ABC和Col2中每个值的得分(在Col3中)的总和。 DEG。基本上,所需的输出如下:
在这种情况下:交叉口= 3.2773(与-1-tire-n) 和union = 29.3546。
我们通过将工会除以交叉点得分:得分(交叉点)/得分(联合) 因此,从此样本数据集中,所需的输出如下
abc deg 0.1165
我一直在努力学习剧本,并遇到了一些问题。 我已经纳入了here和here以及here的建议,但我无法解决我的问题。
以下是我正在使用的代码功能示例:
def polyCalc(a_dict, b_dict):
intersect = min(classA & classB)
union = classA | classB
score = sum(intersect) / sum(union)
return score
def calculate_polyCalc(classB_infile, classA_infile, outfile):
targetContext_polyCalc_A = defaultdict(dict) # { target_lemma : {feat1 : weights, feat2: weights} ...}
with open(classA_infile, "rb") as opened_infile_A:
for line_A in opened_infile_A:
target_class_A, featureA, weight = line_A.split()
targetContext_polyCalc_A[target_class_A][featureA] = float(weight)
targetContext_polyCalc_B = defaultdict(dict)
with open(classB_infile, "rb") as opened_infile_B:
for line_B in opened_infile_B:
target_class_B, featureB, weight = line_B.split()
targetContext_polyCalc_B[target_class_B][featureB] = float(weight)
classA = set(targetContext_polyCalc_A[featureA])
classB = set(targetContext_polyCalc_B[featureB])
with open(outfile, "wb") as output_file:
poly = polyCalc(targetContext_polyCalc_A[target_class_A], targetContext_polyCalc_B[target_class_B], score)
outstring = "\t".join([classA, classB, str(poly)])
output_file.write(outstring + "\n")
我已按照文档和各种不同网站中的所有说明进行操作 - 我仍然使用上述代码生成错误。除了让函数union
的定义出错外,我似乎也对自己如何定义字典有疑问。
任何人都可以提供一些“经验”洞察力来解决这个问题,以达到我想要的结果吗?
提前谢谢。
PS BTW这是用python2。*编写的。
答案 0 :(得分:1)
我可以通过创建自己的具有set
数据类型属性的类来解决这个问题,并且可以保存像dict
这样的值。我在下面称它setmap
(可能这样的东西已经存在了?或者你可以像使用dict.keys()
一样使用它来躲开?)
class setmap(set):
def __init__(self, val_dict):
super(self.__class__, self).__init__(val_dict.keys())
self.val_dict = val_dict
def __getitem__(self, itm):
return self.val_dict.get(itm)
def add(self, key, val):
super(self.__class__, self).add(key)
self.val_dict[key] = val
然后这样的事情会起作用:
In [131]: t = setmap({'a':1, 'b':2, 'c':3})
In [132]: t1 = setmap({'a':3, 'd':8})
In [133]: t.intersection(t1)
Out[133]: set(['a'])
In [134]: {x:(t[x] + t1[x]) for x in t.intersection(t1)}
Out[134]: {'a': 4}
然后,您的目标只是将数据处理为不同的setmap
,一个用于abc
数据,一个用于deg
数据等。
要获得您提到的其他一些统计信息,您可以使用相同类型的dict
理解,但使用set.difference
(首先t.difference(t1)
然后t1.difference(t)
),然后使用intersection
添加结果。它在某些方面类似于基于Inclusion/Exclusion Principle的问题处理方法。
这是一种非常可爱的方式,如果加载大量数据,我并不认为它最适合性能。另一种选择是将数据直接加载到Pandas DataFrame对象,然后按中间数据列分组并根据需要进行聚合。