以下是我认为需要完成的步骤。这样做正确吗?如何用PHP编码?如何确定选择哪些单词?
我不想使用任何外部库。我已经有了奇异值分解(SVD)的实现。
1. 从给定文本中提取所有单词。 2. 对单词/短语进行加权,例如使用tf-idf。如果加权过于复杂,只需考虑出现次数。 3. 构建一个矩阵:列是来自数据库的一些文档(越多越好?),行是所有唯一的单词,值是出现次数或权重。 4. 进行奇异值分解(SVD)。 5. 使用矩阵S(SVD)中的值进行降维(如何?)。
希望您能帮助我。非常感谢!
LSA链接:
以下是完整的算法。如果您拥有SVD,那么您已经完成了大部分工作。上述论文比我更好地解释了它。
假设:
M:语料库矩阵,w(单词)乘以d(文档)(w行,d列)。这些可以是原始计数,或tfidf或其他任何东西。停用词可能会被消除,也可能不会,而词干可能会发生变化(Landauer表示保留停用词,不进行词干提取,但可以使用tfidf)。
U,Sigma,V = singular_value_decomposition(M)
U: w x w
Sigma: min(w,d) length vector, or w * d matrix with diagonal filled in the first min(w,d) spots with the singular values
V: d x d matrix
Thus U * Sigma * V = M
# you might have to do some transposes depending on how your SVD code
# returns U and V. verify this so that you don't go crazy :)
那么,简化性... 实际的LSA论文建议一个好的基础近似是保留足够的向量,使它们的奇异值超过奇异值总和的50%。
更简洁地说...(伪代码)
Let s1 = sum(Sigma).
total = 0
for ii in range(len(Sigma)):
val = Sigma[ii]
total += val
if total > .5 * s1:
return ii
这将返回新基础的等级,之前为min(d,w),现在我们将用{ii}进行近似。
(这里,“-> prime”表示不是转置)
我们创建新矩阵:U'、Sigma'、V',大小分别为w x ii,ii x ii和ii x d。
这就是LSA算法的本质。
由此产生的矩阵U' * Sigma' * V'可用于“改进”的余弦相似性搜索,或者您可以选择其中每个文档的前3个单词。是否比简单的tf-idf更有效仍有一些争议。
对我来说,由于多义词和包含太多主题的数据集,LSA在实际数据集中表现不佳。它的数学/概率基础是不可靠的(它假设正常-ish(高斯)分布,这对于单词计数没有意义)。
你的结果肯定会有所不同。
使用LSA进行标记(一种方法!)
使用SVD和缩减启发式构建U' Sigma' V'维度降低矩阵
手动查看U'矩阵,并想出描述每个“主题”的术语。例如,如果该向量的最大部分是“Bronx,Yankees,Manhattan”,则“New York City”可能是一个好术语。将这些保存在关联数组或列表中。由于向量数是有限的,因此这一步应该是合理的。
假设您有一个单词向量(v1)用于文档,则v1 * t(U')将为该文档提供最强的“主题”。选择前3个最高的主题,然后将它们作为上一步计算出的“主题”。
这个回答并不是直接回答发帖者的问题,而是关于如何自动标记新闻项目的元问题。发帖者提到了命名实体识别,但我认为他们更倾向于自动标记。如果他们真的指的是NER,那么这个回答就是胡说八道 :)
考虑到这些限制(每天600个项目,每个项目100-200个字符),来源各异,以下是一些标记选项:
手动标注。分析员每天可以轻松完成600个,可能只需要几个小时。类似于亚马逊的 Mechanical Turk 或让用户自己完成也是可行的。即使只有50或100个“手动标记”,也将成为比较下面自动生成方法的良好基础。
降维,使用LSA、主题模型(潜在狄利克雷分配)等方法...我在实际数据集上使用LSA的效果非常差,对其统计基础不满意。我认为LDA更好,并且有一个令人难以置信的邮件列表,其中包含了如何为文本分配主题的最佳思路。
简单的启发式算法...如果你有实际的新闻项目,那么利用新闻项目的结构。关注第一句话,去掉所有常见词(停用词),从前两个句子中选择最好的3个名词。或者干脆取出第一句话中的所有名词,看看会得到什么结果。如果文本都是英文,则对整个文本进行词性分析,看看会得到什么结果。对于结构化的项目,如新闻报道,LSA和其他无序方法(tf-idf)会丢失很多信息。
祝你好运!
(如果您喜欢这个答案,也许可以重新标记问题以适应它)
所有看起来都没问题,直到最后一步。SVD的通常表示法是返回三个矩阵A = USV*。S是一个对角矩阵(意味着对角线外都是零),在这种情况下,基本上给出了每个维度捕获原始数据的程度的度量。数字(“奇异值”)会下降,您可以寻找有多少维度是有用的下降点。否则,您将想要选择任意数量N来采取多少维度。
在这里我有点模糊。缩减维度空间中术语(单词)的坐标位于U或V中,我认为这取决于它们是否在输入矩阵的行或列中。不偏不倚地说,我认为单词的坐标将是U的行。即第一行U对应于输入矩阵的第一行,即第一个单词。然后,您只需在该行中取前N列作为单词在缩减空间中的坐标。
希望对您有所帮助
更新:
到目前为止,这个过程并没有告诉你如何精确挑选标签。我从来没听说过有人使用潜在语义索引(LSI)来选择标签(像机器学习算法可能更适合这个任务,比如决策树)。LSI只是告诉你两个单词是否相似,这离分配标签还有很长的路要走。
这里有两个任务:a)使用哪些标签集?b)如何选择最佳的三个标签?我不太清楚LSI如何帮助你回答a)。你可以手动选择标签集。但是,如果你使用LSI,则标签可能应该是文档中出现的词。然后对于b),您需要挑选最接近文档中出现的单词的标签。您可以尝试几种实现方式。选择距离文档中任何单词最近的三个标签,接近程度由标签的坐标(其在U中的行)和单词的坐标(其在U中的行)之间的余弦相似度(参见维基百科)来衡量。