PHP 中的关键字分析

对于我正在构建的Web应用程序,我需要分析网站,检索并排名其最重要的关键字并显示这些关键字。

获取所有单词,它们的密度并显示这些单词相对简单,但这会产生非常偏斜的结果(例如,非索引字排名非常高)。

基本上,我的问题是:如何在PHP中创建一个关键字分析工具,从而产生按单词重要性正确排序的列表?


答案 1

最近,我自己一直在研究这个问题,我会尽可能地解释我做了什么。

步骤

  1. 筛选文本
  2. 拆分为单词
  3. 删除 2 个字符的单词和停用词
  4. 确定词频 + 密度
  5. 确定单词的突出程度
  6. 确定单词容器
    1. 标题
    2. 元描述
    3. 网址
    4. 标题
    5. 元关键字
  7. 计算关键字值

1. 筛选文本

您需要做的第一件事是过滤确保编码正确,因此转换为UTF-8:

iconv ($encoding, "utf-8", $file); // where $encoding is the current encoding

之后,您需要去除所有html标签,标点符号,符号和数字。寻找有关如何在Google上执行此操作的功能!

2. 拆分为字词

$words = mb_split( ' +', $text );

3. 删除 2 个字符的单词和停用词

任何由 1 或 2 个字符组成的单词都不会有任何意义,因此我们会删除所有单词。

要删除非索引字,我们首先需要检测语言。有几种方法可以做到这一点: - 检查内容语言HTTP标头 - 检查lang=“”或xml:lang=“”属性 - 检查语言和内容语言元数据标签 如果没有设置这些标签,您可以使用外部API,如AlchemyAPI

您将需要每种语言的停用词列表,该列表可以在 Web 上轻松找到。我一直在使用这个:http://www.ranks.nl/resources/stopwords.html

4. 确定词频+密度

要计算每个单词的出现次数,请使用以下命令:

$uniqueWords = array_unique ($keywords); // $keywords is the $words array after being filtered as mentioned in step 3
$uniqueWordCounts = array_count_values ( $words );

现在遍历$uniqueWords数组并计算每个单词的密度,如下所示:

$density = $frequency / count ($words) * 100;

5. 确定单词的突出程度

“突出”一词由单词在文本中的位置定义。例如,第一句话中的第二个单词可能比第83句话中的第6个单词更重要。

要计算它,请在上一步中的同一循环中添加此代码:'

$keys = array_keys ($words, $word); // $word is the word we're currently at in the loop
$positionSum = array_sum ($keys) + count ($keys);
$prominence = (count ($words) - (($positionSum - 1) / count ($keys))) * (100 /   count ($words));

6. 确定单词容器

一个非常重要的部分是确定一个单词的位置 - 在标题,描述等中。

首先,您需要使用DOMDocument或PHPQuery之类的东西来获取标题,所有元数据标签和所有标题(不要尝试使用正则表达式!然后,您需要在同一循环中检查这些单词是否包含这些单词。

7. 计算关键字值

最后一步是计算关键字值。为此,您需要权衡每个因素 - 密度,突出度和容器。例如:

$value = (double) ((1 + $density) * ($prominence / 10)) * (1 + (0.5 * count ($containers)));

这种计算远非完美,但它应该给你不错的结果。

结论

我还没有提到我在工具中使用的每一个细节,但我希望它能为关键字分析提供一个很好的视角。

注意:贝是的,这是受到今天关于回答自己问题的博客文章的启发!


答案 2

您的算法中缺少的一件事是面向文档的分析(如果您出于某种原因没有故意省略它)。

每个网站都是基于一个文档集构建的。计算所有文档的字频将为您提供有关字数覆盖率的信息。大多数文档中出现的单词都是停用词。针对有限数量的文档的特定单词可以形成有关特定主题的文档簇。与特定主题相关的文档数可以增加该主题单词的总体重要性,或者至少提供一个要在公式中计数的额外因素。

也许,您可以从预配置的分类器中受益,该分类器包含每个类别/主题和关键字(此任务可以通过索引现有的公共类别层次结构来部分自动化,直到维基百科,但这本身并不是一个微不足道的任务)。然后,您可以将类别纳入分析。

此外,您可以通过在句子级别上进行分析来改进统计信息。也就是说,具有单词在同一句子或短语中出现的频率的频率,您可以发现陈词滥调和重复项,并从统计信息中消除它们。但是,恐怕这在纯PHP中并不容易被阻止。


推荐