我已经自己编写了SVD的一些部分。 这里是代码,我对其中的行动过程进行了注释。其中的一些部分不完全正确。
如果您能帮助我,那将非常好。非常感谢您提前的帮助!
SVD-python是SVD的非常清晰且简洁的实现。它几乎可以被看作是伪代码,应该很容易理解并与您的PHP实现进行比较/借鉴,即使您不熟悉Python。
话虽如此,正如其他人所提到的,在一个听起来相当有限的Web主机上使用php实现进行非常重度的LSA可能不太现实。
干杯
编辑: 以上模块本身并没有做任何事情,但在开头的注释中包含了示例。 假设您下载了Python模块,并且它是可访问的(例如在相同的文件夹中),则可以按照以下方式实现一个微不足道的示例:
#!/usr/bin/python
import svd
import math
a = [[22.,10., 2., 3., 7.],
[14., 7.,10., 0., 8.],
[-1.,13.,-1.,-11., 3.],
[-3.,-2.,13., -2., 4.],
[ 9., 8., 1., -2., 4.],
[ 9., 1.,-7., 5.,-1.],
[ 2.,-6., 6., 5., 1.],
[ 4., 5., 0., -2., 2.]]
u,w,vt = svd.svd(a)
print w
这里的 'w' 包含了您奇异值列表。
当然,这只是让您了解潜在语义分析及其相关内容的一部分。通常您需要减少奇异值的数量,然后采用适当的距离度量来衡量文档、单词或文档和单词等之间的相似性。向量余弦值是非常流行的度量方法。
迄今为止,这是我读过的最清晰、最简洁、最有信息量的论文,介绍了在进行奇异值分解后需要解决的剩余步骤。
备注2:请注意,如果您正在处理非常大的术语-文档矩阵(我假设您正在这样做),那么以离线模式执行分解几乎肯定会更有效,然后仅根据请求以实时方式执行比较。虽然 svd-python 很棒,但 svdlibc 更适合进行如此重的计算。
最后,如上所述的bellegarda论文中提到,记住你不必每次获取新文档或请求时都重新计算svd。根据你想要做什么,你可能可以在离线模式下每周执行一次svd,使用本地机器,然后上传结果(大小/带宽问题除外)。
无论如何,祝好运!
我知道这是一个老问题,但以下是我的看法:
1) 真正的SVD比在Netflix奖中使用的基于微积分的近似方法要慢得多。详情请见: http://www.sifter.org/~simon/journal/20061211.html
这里有一个(用C编写的)实现: http://www.timelydevelopment.com/demos/NetflixPrize.aspx
2) C会更快,但PHP也可以做到。
PHP Architect的作者Cal Evans说:“PHP是一种Web脚本语言...... [但]我已经将PHP用作编写DOS批处理文件或Linux shell脚本的脚本语言。我发现我需要做的大部分事情都可以通过PHP完成。甚至还有一个项目允许您通过PHP构建桌面应用程序,即PHP-GTK项目。”
是的,这是可能的,但在php中实现SVD并不是最优的方法。正如您在此处所见,PHP比C和C++更慢,因此也许最好使用其中一种语言来执行它,并将其作为函数调用以获取结果。您可以在此处找到算法的实现,以便指导自己。
关于函数调用,可以使用:
system函数非常有用和强大,但它的最大问题之一是所有程序生成的文本都直接进入输出流。有时您可能希望格式化生成的文本并以某种不同的方式显示它,或者根本不显示它。
PHP中的system函数接受一个字符串参数,其中包含要执行的命令以及您希望传递给该命令的任何参数。此函数执行指定的命令,并将任何生成的文本转储到输出流(在Web服务器情况下为HTTP输出,或者如果您正在运行PHP作为命令行工具,则为控制台)。如果程序发出文本输出,则此函数的返回值是程序的最后一行输出。
PHP提供的一个非常有趣的函数类似于我们迄今为止看到的函数是passthru函数。这个函数像其他函数一样执行您告诉它要执行的程序。但是,它随后立即将此程序的原始输出发送到PHP当前正在使用的输出流(即Web服务器场景下的HTTP,或者是PHP命令行版本中的shell)。
是的,这在PHP中完全可以实现。 我不知道执行的合理时间范围和它可以计算多大。 我可能需要实现算法来获得一个大致的想法。
是的,我可以帮助您编写代码。但是为什么需要帮助?您编写的代码不起作用吗?
顺便问一下,您使用的PHP版本是什么?