我正在尝试用Python实现一个数学公式,我是初学者,所以请和我一起工作。
我有两个3列制表符分隔文件:
例如: inputA:
abandonment-n about-bring-v 32.5890
abandonment-n about-complaint-n 5.5112
abandonment-n about-concern-n 10.6714
abandonment-n among-1-crowd-n 11.4496
inputB:
aardvark-n about-fact-n 7.4328
aardvark-n about-information-n 6.5145
aardvark-n about-know-v 6.4239
aardvark-n among-1-crowd-n 9.9085
inputB:
我尝试实现的公式应该将这两个文件视为输入。
数学上,公式如下:
中所述其中,f =特征,Fx =特征向量,w =特征权重。
这是我到目前为止所提出的:
将两个输入导入为dict,其中[feature:weight]。
让我们说inputA = x和inputB = y。
然后,我为公式设计的语法如下:
score = sum(i for i in x if i in y) * w(i) / sum(i for i in x)* w(i)
在这种情况下,*w(i)
应该乘以相应特征的权重。
有人可以帮我解决Python中的数学语法(根据我试图转换的公式,是否正确),因为这是我第一次尝试使用它?
提前谢谢
答案 0 :(得分:4)
关闭,但不完全。你想要这样的东西:
from __future__ import division # this must be the very first import statement
score = sum(i*w(i) for i in x if i in y) / sum(i * w(i) for i in x)
基本上,在这两种情况下你都离开了w(i)
,这不是公式所做的;此外,w(i)
无论如何都没有任何意义,因为i
只存在于总和中。
检查元素是否在列表中可能很昂贵。你可以做得更好:
from __future__ import division # this must be the very first import statement
xx = set(x)
yy = set(y)
score = sum(i*w(i) for i in xx & yy) / sum(i * w(i) for i in x)
其中xx & yy
是xx.intersection(yy)
的Python简写。这假定x
和y
从不包含重复元素,但考虑到公式中使用的符号,这似乎是一个安全的假设。
答案 1 :(得分:2)
当你怀疑sintax和正确性时,最好创建一个测试用例。我更喜欢doctests,但这取决于讨论。
def score(x, y, w):
"""
Calcutates directional distributional similarity http://dl.acm.org/citation.cfm?id=1897650
>>> score([1, 2], [1, 3], {1:2, 2:1, 3:1})
0.42857142857142855
"""
return sum(i for i in x if i in y) * w[i] / sum(i for i in x)* w[i]
用鼻子运行
pip install nose
nosetests --with-doctests
给出了你的代码
Failed example:
score([1, 2], [1, 3], {1:2, 2:1, 3:1})
Exception raised:
Traceback (most recent call last):
...
NameError: global name 'i' is not defined
----------------------------------------------------------------------
Ran 1 test in 0.531s
FAILED (failures=1)
因此您可以检查错误并修复。 输出略微修改的@ misha代码
def score(x, y, w):
"""
Calcutates directional distributional similarity http://dl.acm.org/citation.cfm?id=1897650
>>> score([1, 2], [1, 3], {1:1.5, 2:1.0, 3:1.0})
0.42857142857142855
"""
xx = set(x)
yy = set(y)
return 1.0 * sum(i*w[i] for i in xx & yy) / sum(i * w[i] for i in x)
将是
.
----------------------------------------------------------------------
Ran 1 test in 0.016s
OK
如果您删除此1.0*
部分,则会得到纠正:
Failed example:
score([1, 2], [1, 3], {1:2, 2:1, 3:1})
Expected:
0.42857142857142855
Got:
0
更高级的测试用例有助于正确性检查。