我需要计算 2 个不同文件的列中元素的加权分数的并集和交集。
输入文件 1 和输入文件 2 相同: 3-tab 分隔列:这是一个示例:
输入1
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 以及每个值的并集(在 Col3 中)的总和ABC 和 DEG 的 Col2 中的值。所以本质上,所需的输出如下:
在这种情况下:intersection = 3.2773(with-1-tyre-n)和 union = 29.3546。
我们通过将联合除以交集得到一个分数:score(intersection)/ score(union) 因此,从这个样本数据集中,所需的输出如下
abc deg 0.1165
我一直在非常努力地编写脚本并且遇到了一些问题。我已经合并了这里、这里和这里的建议,但我无法解决我的问题。
这是我正在使用的代码功能的示例:
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 顺便说一句,这是用 python2.* 编写的。