【问题标题】:Code efficiency for text analysis文本分析的代码效率
【发布时间】:2011-07-25 17:41:02
【问题描述】:

我需要有关文本分析的建议。 该程序是用php编写的。

我的代码需要接收一个 URL 并将站点单词与数据库进行匹配并寻找匹配项。

棘手的部分是这些词并不总是像它们在文本中出现的那样写在数据库中。

示例:

假设我的数据库具有以下值: 字=字母

该网站有: 啰嗦的事

我应该输出: 字母的事

我的代码在每个尝试将搜索到的单词与数据库匹配之后都会生成几个正则表达式。

对于每个未找到的单词,我对数据库进行 8 次查询。大多数单词都不匹配,所以当我们谈论一个包含数百个单词的整个网站时,我的 CPU 水平会飞跃。

我考虑过存储在全局数据库中找不到的每个单词,因为它们出现(HD 成本低于 CPU),或者可能制作一个数组或字典来存储所有这些。

我真的对这个项目感到困惑。它应该为大量用户提供服务,使用当前代码,服务器将在 10-20 个用户请求后终止。

有什么想法吗?

编辑: 搜索到的单词不是英文单词,代码运行在windows 2008 server

【问题讨论】:

    标签: php regex performance memory-efficient


    【解决方案1】:

    实现 trie 并计算列文斯坦距离?有关实施的详细演练,请参阅此博客:http://stevehanov.ca/blog/index.php?id=114

    【讨论】:

      【解决方案2】:

      在我看来,Sphynxstemming 似乎是一份工作。

      【讨论】:

      • 我不确定我是否可以使用第三方程序。如果我只需要使用我的代码执行此操作,那么最好的方法是什么?
      • 授权启动,服务器不是专用的。
      • 不需要许可证 (GPLv2),没有专用服务器(甚至专用 VPS)确实会变得很麻烦,尤其是因为我们正在谈论性能,并替换整个网站中的文本。您可以将所有要翻译的单词/正则表达式存储在某个 apc- 的 memcached 数组中,从而节省您的数据库之旅,但这取决于文本中的单词是否可能在数据库中。
      • 如果要翻译的单词相当有限,您可以使用 2 个数组的 preg_replace,例如(由正则表达式组成):preg_replace(array('/word(y|s)/','/box(en|es)/'),array('letter$1','chest$1'),$string));,但即便如此,替换时也要非常谨慎HTML 中的字符串。
      【解决方案3】:

      可能是个愚蠢的问题,但您是否考虑过在 SQL 查询中使用 LIKE 子句? 像这样的:

      $sql = "SELECT * FROM `your_table` WHERE `your_field` LIKE 'your_search'":
      

      我通常发现,每当我必须对查询的返回值进行过多的字符串操作时,我都可以在 SQL 端更轻松地完成它。

      【讨论】:

      • 嗯,可能更有效:SELECT * FROM your_table WHERE 'the_entire_document' LIKE CONCAT('%',your_field,'%');
      【解决方案4】:

      谢谢大家的回答。 不幸的是,没有一个答案对我有帮助,也许我不够清楚。

      我最终通过创建一个包含数据库中所有单词(大约 6000 个单词)的哈希表并检查哈希而不是数据库来解决了这个问题。

      代码以 4 秒的执行时间开始,现在是 0.5 秒! :-)

      再次感谢

      【讨论】:

        猜你喜欢
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        • 2014-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-02
        相关资源
        最近更新 更多