【问题标题】:matching webpages keywords to a set of keywords in database将网页关键字与数据库中的一组关键字匹配
【发布时间】:2012-05-22 17:35:39
【问题描述】:

在我的数据库中,我列出了 5000 行(作为关键字)。现在给定一篇文章(甚至可能是 1000 个单词),我想匹配与数据库中的关键字匹配的任何单词。例如,我在 db 中有这些记录(使用逗号提到行): tv, tv and videos, movie, horror movie, camera, digital camera, canon digital camera

每一行都有另一个名为“URL”的列。我的输入字符串可能是这样的:

我讨厌恐怖片。佳能发布了一款新的数码相机。到目前为止,我拥有 3 台数码相机......'

从上面的字符串,我需要匹配:

  • 恐怖电影针对我存储的关键字恐怖电影。但我不希望只有 moviesmovie 匹配,因为 horror movie 关键字在这里更合适。
  • 数码相机针对存储的关键字数码相机
  • 数码相机...针对存储的关键字数码相机

(文章中有粗体词组,斜体词组在数据库中)

遍历数据库中的每个关键字可能是不可能的和不现实的。到目前为止,我了解到 Solr 可能很合适。但我不确定我将如何索引和查询 Solr。为了查询 Solr,我必须提供关键字。但我不知道我的关键字是什么。我只知道整篇文章。关键字可能包含 1 个或多个单词。完全随机,但我最多可以说 5 个字。

匹配后,我需要将文章中的关键字替换为下一列的(URL)值。例如,文章恐怖片中的关键字需要替换为恐怖片的URL栏。

谁能告诉我正确的路径?任何帮助表示赞赏。

提前致谢

【问题讨论】:

  • 你好@PedroFillastre,你对 str_replace() 有什么作用?你能详细说明一下吗?对于字符串替换,我需要确定我的关键字,这是我现在最大的挑战。
  • 您可以将所有关键字和所有链接中的另一个组成一个数组php.net/manual/en/function.str-replace.php
  • 那么我将如何做以下事情: 1. 将 恐怖电影恐怖电影 匹配。 2. 匹配恐怖片而不匹配电影
  • @HungryCoder 检查是否在数组中??? -> php.net/manual/en/function.in-array.php

标签: php algorithm wordpress solr replace


【解决方案1】:

我认为您的问题实际上有几个部分,但我假设您基本上想向您的网站提交一篇文章,然后您的网站后端将处理这篇文章并用粗体和 url 替换所有关键字?

鉴于您想要操纵您的文章并从您的数据库中注入数据,也许原始的 php 解决方案会符合要求(但我必须承认我对 Solr / Lucene 不够熟悉,无法提供建议)。您显然需要进行一些基准测试,但在这种类型的系统中处理 5,000 行数据并不是不合理的数据量,因为我假设您不会每隔几秒甚至几分钟提交一篇文章?

因此您需要:

  1. 一次从数据库中选择所有“关键字”,包括您的网址(存储在内存中以处理文章)。
  2. 将您的关键字数据(如果需要)转换为多维关联数组(如果您的数据库查询尚未完成此操作,则处理起来会更容易)。
  3. 在附加数组中建立复数变体,或者如果它们在数据库中的附加列中因关键字而异)。
  4. 当您提交文章时,您必须(以一种或其他方式)遍历所有 5000 个关键字(包括所有复数变体的额外循环),在整篇文章中搜索所述关键字。
  5. 如果在您的文章中找到任何关键字,那么您显然需要将这些匹配项替换为粗体字体和匹配的 url。
  6. 那么,一旦文章中的所有关键字都处理完毕,您显然需要保存或向用户展示这篇文章?

关于您的关键字的另外两点是:

  • 如果您的复数关键字超出 's' 后缀,则建立 (即,您是否还尝试匹配实际上 更改拼写,例如“buddy”=>“buddies”)?
  • 语法上,你准备/需要走多远,你需要 或想要将数码相机与数码相机相匹配?

很抱歉,答案相当冗长/神秘,但我认为在寻找解决方案之前了解项目的全部范围很重要。您可能已经掌握了这些详细信息,但从您的问题来看,我认为变量太多,无法提供完整的答案。如果您需要,我很乐意提供一些代码示例/对上述任何一点的进一步解释?

编辑:当你提到识别你的关键词时有点困惑,关键词不是你的数据库中已经存在的词吗?或者您是否尝试从提交的文章中有机地创建一个关键字数据库,以便您的系统将收集您的文章的关键字,同时从您的数据库中搜索和替换当前存储的关键字?

【讨论】:

  • 史蒂夫 H,感谢您的意见。在完成我当前的任务后,我将解释并回答你的问题。我很感激你看过它。
  • 是的,你明白了主要思想。但是,虽然最初我给出了 5000 条记录的示例,但计数仍有可能增加。目前我们看到大约 5 万条记录的范围。这就是为什么普通的 PHP 循环不起作用的原因。到目前为止,我已经完成了preg_replace 的工作,它支持像's,es'这样的复数,但不支持像'factory -> factory'这样改变反词的复数。此外,它不支持撇号。这是我目前使用的表达式~{$keyword}(s|es)*\b(?!(.(?<!\[[A-Za-z0-9_-]))*?\[/[A-Za-z0-9_-])(?!(.(?<!\<a))*?\</a)~is。表达式跳过 [aa][/aa],
  • 关于您的困惑:我在数据库中有关键字,但是当一篇文章(比如博客文章)是我的输入时,我不知道应该从中找到哪些关键字,除非我与数据库匹配。当记录的大小为 50K+ 时,循环遍历 db 中的每个关键字是不可能的。我也猜想 Solr 不适合这里,因为我的输入是博客文章,而不仅仅是要匹配的关键字。对于 solr,我们需要发送关键字以从我们的索引中查找。
  • 嗯,你说在 PHP 中不可能做到这一点,你确定吗? PHP 将轻松处理 50,000 个循环,问题是您的服务器是否允许它,即 max_execution_tim 等设置是否足够高。我认为您应该创建一些测试脚本(即将 50,000 条记录插入数据库并对记录执行循环,然后看看会发生什么)。你可能会草率下结论,这样做会给自己带来更多问题。只看你的正则表达式,我想你这样做可能会遇到麻烦。为什么不处理博客文章/文章以删除所有 html....
  • 在您尝试搜索关键字之前,两者之间的内容会更快,因为 a) 要搜索的字数更少(假设您正在遍历 50k db 关键字)和 b) 将意味着您搜索不需要那么复杂的搜索表达式。因此,假设您现在有一篇干净的博客文章(没有链接/html),我将从 db 中获取所有关键字并尝试一些选项来测试性能。例如,您可以执行两步流程。使用您的 db 关键字执行完整循环,并在循环中执行 stripos($content, $keyword) 并将任何匹配项存储在数组中以由 preg_replace 处理。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2015-03-03
  • 2022-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多