订购和选择常用标签



我已经在stackoverflow上寻找解决方案,但找不到一个好的答案来概括我遇到的问题;从本质上讲,我试图实现的是从我的所有用户主题中排列出15个最频繁使用的标签。

这就是我当前选择数据的方式

$sql = mysql_query("SELECT subject FROM `users`");
$row = mysql_fetch_array($sql);

我为代码看起来与我试图实现的完全不同而道歉。我真的不知道从哪里开始尝试实现这一点,并来到这里寻求可能的解决方案。现在这会很好,我可以把它们排列出来,但是我的问题是主题包含单词和哈希标签,所以一个示例房间主题看起来像hey my name is example #follow me,我如何只获取#follow,一旦我从所有主题中获取了所有的哈希标签,就可以响应最频繁的15?

我再次为代码看起来与我试图实现的完全不同而道歉,我感谢任何人的帮助。这是我发现的最接近解决问题的帖子,但没有用。

示例

这里有三个房间的主题;

`Hello welcome to my room #awesome #wishlist`
`Hey hows everyone doing? #friday #awesome`
`Check out my #wishlist looking #awesome`

这就是我试图将它们视为的原因

[3] #awesome [2] #wishlist [1] #friday

对于SQL查询来说,您想要在这里实现的是非常复杂的,并且每次您想要运行此代码时,解析主题可能会遇到效率问题。

最好的解决方案可能是有一个将标签与用户关联的表。每次用户更改主题时,都可以更新此表。为了获得标签的使用次数,那么COUNT(DISTINCT tag)就变得微不足道了。

一种方法是用PHP解析结果集。一旦你从数据库中查询到你的主题行,假设你在数组$results中有它们,那么你就可以构建一个单词的频率分布,如下所示:

$freqDist = [];
foreach($results as $row)
{
        $words = explode(" ", $row);
        foreach($words as $w)
        {
                if (array_key_exists($w, $freqDist))
                        $freqDist[$w]++;
                else
                        $freqDist[$w] = 1;
        }
}

然后,您可以按降序排序,并显示单词的分布,如下所示:

arsort($freqDist);
foreach($freqDist as $word => $count)
{
    if (strpos($word, '#') !== FALSE)
        echo "$word: $countn";
    else
        echo "$word: does not contain hashtag, DROPPEDn";
}

如果你愿意,你也可以使用preg_match()来进行更高级的匹配,但我对strpos()使用了一种天真的方法,认为如果这个词有"#"(任何地方),它就是一个标签。

其他可能对您有用的功能:

  • str_word_count():返回字符串中使用的单词信息
  • array_count_values():统计数组的所有值

最新更新