PHP 中的关键字分析
对于我正在构建的Web应用程序,我需要分析网站,检索并排名其最重要的关键字并显示这些关键字。
获取所有单词,它们的密度并显示这些单词相对简单,但这会产生非常偏斜的结果(例如,非索引字排名非常高)。
基本上,我的问题是:如何在PHP中创建一个关键字分析工具,从而产生按单词重要性正确排序的列表?
对于我正在构建的Web应用程序,我需要分析网站,检索并排名其最重要的关键字并显示这些关键字。
获取所有单词,它们的密度并显示这些单词相对简单,但这会产生非常偏斜的结果(例如,非索引字排名非常高)。
基本上,我的问题是:如何在PHP中创建一个关键字分析工具,从而产生按单词重要性正确排序的列表?
最近,我自己一直在研究这个问题,我会尽可能地解释我做了什么。
您需要做的第一件事是过滤确保编码正确,因此转换为UTF-8:
iconv ($encoding, "utf-8", $file); // where $encoding is the current encoding
之后,您需要去除所有html标签,标点符号,符号和数字。寻找有关如何在Google上执行此操作的功能!
$words = mb_split( ' +', $text );
任何由 1 或 2 个字符组成的单词都不会有任何意义,因此我们会删除所有单词。
要删除非索引字,我们首先需要检测语言。有几种方法可以做到这一点: - 检查内容语言HTTP标头 - 检查lang=“”或xml:lang=“”属性 - 检查语言和内容语言元数据标签 如果没有设置这些标签,您可以使用外部API,如AlchemyAPI。
您将需要每种语言的停用词列表,该列表可以在 Web 上轻松找到。我一直在使用这个:http://www.ranks.nl/resources/stopwords.html
要计算每个单词的出现次数,请使用以下命令:
$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;
“突出”一词由单词在文本中的位置定义。例如,第一句话中的第二个单词可能比第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));
一个非常重要的部分是确定一个单词的位置 - 在标题,描述等中。
首先,您需要使用DOMDocument或PHPQuery之类的东西来获取标题,所有元数据标签和所有标题(不要尝试使用正则表达式!然后,您需要在同一循环中检查这些单词是否包含这些单词。
最后一步是计算关键字值。为此,您需要权衡每个因素 - 密度,突出度和容器。例如:
$value = (double) ((1 + $density) * ($prominence / 10)) * (1 + (0.5 * count ($containers)));
这种计算远非完美,但它应该给你不错的结果。
我还没有提到我在工具中使用的每一个细节,但我希望它能为关键字分析提供一个很好的视角。
注意:贝是的,这是受到今天关于回答自己问题的博客文章的启发!
您的算法中缺少的一件事是面向文档的分析(如果您出于某种原因没有故意省略它)。
每个网站都是基于一个文档集构建的。计算所有文档的字频将为您提供有关字数覆盖率的信息。大多数文档中出现的单词都是停用词。针对有限数量的文档的特定单词可以形成有关特定主题的文档簇。与特定主题相关的文档数可以增加该主题单词的总体重要性,或者至少提供一个要在公式中计数的额外因素。
也许,您可以从预配置的分类器中受益,该分类器包含每个类别/主题和关键字(此任务可以通过索引现有的公共类别层次结构来部分自动化,直到维基百科,但这本身并不是一个微不足道的任务)。然后,您可以将类别纳入分析。
此外,您可以通过在句子级别上进行分析来改进统计信息。也就是说,具有单词在同一句子或短语中出现的频率的频率,您可以发现陈词滥调和重复项,并从统计信息中消除它们。但是,恐怕这在纯PHP中并不容易被阻止。