4

我正在尝试在 Python 中实现一个数学公式,我是这方面的初学者,所以请和我一起工作。

我有两个 3 列制表符分隔的文件:

例如:输入A:

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

输入B:

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

输入B:

我试图实现的公式应将两个文件都视为输入。

在数学上,公式如下:

相似度测量本文所述

其中,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 中的数学语法(根据我尝试转换的公式是否正确),因为这是我第一次尝试它?

先感谢您

4

2 回答 2

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 & yyPython 的简写在哪里xx.intersection(yy)。这假设x并且y从不包含重复的元素,但考虑到公式中使用的符号,这似乎是一个安全的假设。

于 2013-10-29T11:01:16.017 回答
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

更高级的测试用例将有助于正确性检查。

于 2013-10-29T11:22:58.480 回答