从文本字符串中收集关键字并自动插入数据库PHP MySql

从文本字符串中收集关键字并自动插入数据库PHP MySql,php,mysql,Php,Mysql,我需要帮助来创建一个脚本,用于在字符串中查找关键字,并将它们插入数据库以用于标记云 剧本显然需要剔除字符和常见的单词,如“I”、“at”、“and”等 获取它找到的每个关键字的频率值,如果是新关键字,则将其插入数据库,或者使用字符串关键字计数更新现有行 该字符串是来自数据库行的未格式化文本 我对PHP并不陌生,但我以前从未尝试过类似的方法,因此非常感谢您的帮助 谢谢,Lea你可以通过一本关键字词典或一本可以忽略的单词词典来解决这个问题。如果您制作了一个关键字字典,那么每次使用一个关键字时都要

我需要帮助来创建一个脚本,用于在字符串中查找关键字,并将它们插入数据库以用于标记云

  • 剧本显然需要剔除字符和常见的单词,如“I”、“at”、“and”等
  • 获取它找到的每个关键字的频率值,如果是新关键字,则将其插入数据库,或者使用字符串关键字计数更新现有行
  • 该字符串是来自数据库行的未格式化文本
我对PHP并不陌生,但我以前从未尝试过类似的方法,因此非常感谢您的帮助


谢谢,Lea

你可以通过一本关键字词典或一本可以忽略的单词词典来解决这个问题。如果您制作了一个关键字字典,那么每次使用一个关键字时都要进行计数,然后用关键字更新数据库表。如果要忽略一个单词词典,则从帖子中删除这些单词,并在关键字表中插入或更新所有剩余单词的计数。

如果字符串不太长,并且在数组中存储字符串时不会出现内存问题,那么这如何

# string to parse, comes from the database as you suggested
$string = 'I at and Cubs PHP Cubs';

# string is now an array
$stringArray = explode(" ", $string);

# list of "obvious" words to exclude, this would probably come from a database table
$wordsToExclude = array('I', 'at', 'and');

# array that contains your "keywords"
# Array('Cubs', 'PHP', 'Cubs')
$keywordArray = array_diff($stringArray, $wordsToExclude);

# array with the keyword as the key and the count as the value
# Array('Cubs' => 2, 'PHP' => 1)
$countedValues = array_count_values($keywordArray);
现在需要在数据库中搜索$countedValues数组中的键。你的桌子看起来像什么

当然,你也可以避免重新发明轮子和谷歌“php标签云”


参考资料:

Google+
php关键字from text
=

方法是将每篇文章中输入的每个单词存储在一个表中。当人们搜索论坛时,结果就是这些单词来自的帖子ID。我建议这样做

将用户提交的内容与来自数据库表的黑名单(明显)单词数组进行比较。幸存下来的单词是你的关键词。在数据库表中输入这些关键字。然后使用表中的SELECT*语句返回结果集。使用演示的array_count函数获取您的计数


也许更好的方法是像大多数网站那样,强制用户输入他们的关键词(Stackoverflow、delicious等),这样你就可以跳过所有的解析了。

好吧,答案已经在那里了,我仍然会发布我的代码来完成一些小的工作

我认为mysql数据库不适合存储此类数据。我建议这样做,这样您就可以通过将关键字用作索引从数据库中获取计数来轻松访问关键字。在高负载环境中保存这些关键字可能会导致mysql数据库出现问题

$keyWords = extractKeyWords($text);

saveWords($keyWords);

function extractKeyWords($text) {
    $result = array();

    if(preg_match_all('#([\w]+)\b#i', $text, $matches)) {
        foreach($matches[1] as $key => $match) {

            // encode found word to safely use as key in array
            $encodedKey = base64_encode(strtolower($match));

            if(wordIsValid($match)) {
                if(array_key_exists($encodedKey, $result)) {
                    $result[$encodedKey] = ++$result[$encodedKey];  
                } else {
                    $result[$encodedKey] = 1;
                }
            }
        }
    }

    return $result;
}

function wordIsValid($word) {
    $wordsToIgnore = array("to", "and", "if", "or", "by", "me", "you", "it", "as", "be", "the", "in");
    // don't use words with a single character
    if(strlen($word) > 1) {
        if(in_array(strtolower($word), $wordsToIgnore)) {
            return false;
        } else {
            return true;    
        }
    } else {
        return false;       
    }
}

// not implemented yet ;)
function saveWords($arrayOfWords) {
    foreach($arrayOfWords as $word => $count) {
        echo base64_decode($word).":".$count."\n";
    }
}

关键词叫什么?字符串中的每一个[足够长的]字?我想我可以创建一个静态数组来与之进行比较?好的,我明白了。理论上是的,但我不知道如何在实践中做到这一点。我可以推断我应该创建两个数组,并将它们用作“字典”。。但是我怎么计算,怎么忽略呢?我不熟悉使用数组,所以一个实用的例子会有所帮助。这在现实生活中是不可用的。谷歌“php标签云”将为您提供HTML格式或从数据库中选择。事实上,这个问题与云无关,也可能与标签无关。我忽略了他,他没有建设性,我建议你也这样做。我很感激任何帮助,正如我在作品中所说的那样。@Lea事实上我很有建设性。有时我们也需要一些批评,不仅仅是复制/粘贴代码。但这不是问题所在。也许你应该去问你自己关于这个话题的问题。你可以称之为“这个网站应该提供复制粘贴的例子,或者帮助海报通过理论学习”。。。毫无疑问,这将是一个伟大的问题。但这是离题的。除了批评之外,你的任何意见都没有帮助,这也不是这篇文章或这个论坛的重点。人们不会问你问题来批评他们。人们不会给你答案来刺激他们。你一点帮助也没有,因此你没有建设性。是的,我会让用户输入他们自己的关键字,但我正在使用现有数据,我猜是“升级”来添加此功能,因为标签/关键字将在“新”系统中实现。