Jer*_*oen 23 php analytics full-text-search pagerank keyword
对于我正在构建的Web应用程序,我需要分析一个网站,检索并排列它最重要的关键字并显示它们.
获取所有单词,密度和显示它们相对简单,但这会产生非常不正确的结果(例如,停用词排名非常高).
基本上,我的问题是:如何在PHP中创建关键字分析工具,从而使列表按字重要性正确排序?
Jer*_*oen 49
最近,我一直在努力解决这个问题,我会尽力解释我的所作所为.
你需要做的第一件事是过滤确保编码是正确的,所以转换为UTF-8:
iconv ($encoding, "utf-8", $file); // where $encoding is the current encoding
Run Code Online (Sandbox Code Playgroud)
之后,您需要删除所有html标签,标点符号,符号和数字.在Google上查找有关如何执行此操作的功能!
$words = mb_split( ' +', $text );
Run Code Online (Sandbox Code Playgroud)
任何由1或2个字符组成的单词都没有任何意义,因此我们删除所有单词.
要删除停用词,我们首先需要检测语言.我们可以通过以下两种方式执行此操作: - 检查Content-Language HTTP标头 - 检查lang =""或xml:lang =""属性 - 检查语言和内容 - 语言元数据标签如果没有设置,您可以使用AlchemyAPI之类的外部API .
您需要一种每种语言的停用词列表,可以在网上轻松找到.我一直在使用这个: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 );
Run Code Online (Sandbox Code Playgroud)
现在遍历$ uniqueWords数组并计算每个单词的密度,如下所示:
$density = $frequency / count ($words) * 100;
Run Code Online (Sandbox Code Playgroud)
突出词一词由文本中词语的位置定义.例如,第一句中的第二个单词可能比第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));
Run Code Online (Sandbox Code Playgroud)
一个非常重要的部分是确定单词所在的位置 - 标题,描述等.
首先,你需要使用像DOMDocument或PHPQuery之类的东西来获取标题,所有元数据标签和所有标题(不要尝试使用正则表达式!)然后你需要在同一个循环中检查它们是否包含单词.
最后一步是计算关键字值.要做到这一点,你需要权衡每个因素 - 密度,突出和容器.例如:
$value = (double) ((1 + $density) * ($prominence / 10)) * (1 + (0.5 * count ($containers)));
Run Code Online (Sandbox Code Playgroud)
这个计算远非完美,但它应该给你不错的结果.
我没有提到我在工具中使用的每一个细节,但我希望它能提供关键词分析的良好视角.
NB是的,这是受到今天关于回答你自己问题的博客文章的启发!