给定一个搜索词列表,我如何知道我的字符串包含哪些搜索词?

2024-01-22

有很多软件会采用搜索字符串并查找数据库中包含该字符串的所有文本(MySQL 的WHERE MATCH('searchterm', string_column)、谷歌等),但是有没有一个好的算法可以反其道而行之呢?

假设我有一个搜索词列表:

丰田普锐斯、丰田塔科马、本田思域、雪佛兰 Nova、雪佛兰 Volt

我有一个字符串,例如:

1962 年雪佛兰 Nova 敞篷车

有没有一个好的算法,我可以将列表和字符串放入其中,然后得到Chevy Nova out?

如果它们都很容易标记化,我可以标记它们并进行内部连接,但我对无法判断输入字符串的哪一部分是“重要”部分的情况感兴趣。


如果您要标记“1962 Chevy Nova 敞篷车”[原文如此],您最终会得到四个非常重要或有趣的标记,值得关注。如果您正在跟踪您的语言中所有可能的单词,那么您将为每个单词都有一个索引。

另一方面,您已经获得了搜索词。在每种情况下,您都对有趣的单词进行了标记和索引。其中每一个都可以被视为一对两个令牌索引。

然后,如果您接受输入并查找匹配的搜索词,您会问哪些搜索词包含输入的任何单词?

因为我本质上是一个数据库人员,所以我可以想象像这样创建令牌列表:

CREATE TABLE aa_tokens (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  word VARCHAR( 40 ) NOT NULL 
);

insert into aa_tokens (word) values
  ('1962'),           -- 1
  ('Chevy'),          -- 2
  ('Civic'),          -- 3
  ('Honda'),          -- 4
  ('Nova'),           -- 5
  ('Prius'),          -- 6
  ('Tacoma'),         -- 7
  ('Toyota'),         -- 8
  ('Volt'),           -- 9
  ('convertable');    -- 10

和一个搜索表,以便每个搜索都有一个 id:

CREATE TABLE aa_search (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  text VARCHAR( 255 ) NOT NULL
);

insert into aa_search (text) values
  ('Toyota Prius'),   -- 1
  ('Toyota Tacoma'),  -- 2
  ('Honda Civic'),    -- 3
  ('Chevy Nova'),     -- 4
  ('Chevy Volt');     -- 5

然后是一个组合搜索和标记的表:

CREATE TABLE aa_searchToks (
  search INT NOT NULL,
  token INT NOT NULL
);

insert into aa_searchToks (search, token) values
  (1, 8),
  (1, 6),
  (2, 8),
  (2, 7),
  (3, 4),
  (3, 3),
  (4, 2),
  (4, 5),
  (5, 2),
  (5, 9);

现在,如果我们将输入字符串“1962 Chevy Nova Convertible”并将其转换为标记 (1, 2, 5, 10),我们可以进行一个查询来查看搜索词的标记:

select search, count(*) from aa_searchToks
  where token in (1, 2, 5, 10) group by search;

其结果是:

+--------+----------+
| search | count(*) |
+--------+----------+
|      4 |        2 |
|      5 |        1 |
+--------+----------+

或者查询有点不同:

select search, (select text from aa_search s where st.search = s.id) as text, 
  count(*) from aa_searchToks st where token in (1, 2, 5, 10) group by search;

导致:

+--------+------------+----------+
| search | text       | count(*) |
+--------+------------+----------+
|      4 | Chevy Nova |        2 |
|      5 | Chevy Volt |        1 |
+--------+------------+----------+

我们可以看到“Chevy Nova”匹配两个标记,并且是最佳匹配,当然,确实如此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定一个搜索词列表,我如何知道我的字符串包含哪些搜索词? 的相关文章

随机推荐

  • 理解列表推导式的语法

    我不明白列表理解的语法 newList expression element for element in oldList if condition 我不明白的是 element 假设您有以下代码 List character for ch
  • Monotouch:UITableViewCell 高度

    我一直在网上冲浪以弄清楚如何使我的表格单元格高度适合其内容 我的内容具有不同的高度 我试着看看这个样本 http simon nureality ca simon says project d uitableviewcells autosi
  • 如何制作响应式表格[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个表来表示 html 页面中的一些数据 我正在尝试使该表具有响应能力 我怎样才能做到这一点 这里是Demo http jsfid
  • 如何在Android中的DatePicker中仅阻止过去的日期

    如何在Android中的DatePicker中仅阻止过去的日期 我正在使用过去日期和当前日期被阻止的示例代码 我只需要阻止过去的日期 而不是当前日期 这是我的代码 private DatePickerDialog OnDateSetList
  • 向 React Native WebView 添加 CSS 样式

    所以我对此有点困惑 我在应用程序的一部分中使用了 WebView 使用 WebView 的原因是因为我们从返回给我们 HTML 字符串的 API 端点拉取 此 HTML 字符串中的字体大小和其他内容的样式不是为了在移动应用程序中使用而设计的
  • 即使使用 TLSHandshakeTimeShift 选项,TLS 过期的 Hyperledger Fabric orderer 也无法启动

    我的 Hyperledger Fabric 网络的 TLS MSP 密钥已在 500 多小时前过期 由于过期 我的订单在停止后无法重新启动 我的订购者设置是 超级账本 Fabric 版本 2 2 RAFT共识 根据文档 我设置了TLSHan
  • WebElement.equals() 方法如何检查相等性?

    我有超过 1 个 XPath 指向一个 Web 元素 并且我想确定这两个元素是否等效 即 如果我在两个 Web 元素上执行操作 sendKeys 或 click 则该操作将在同一个 Web 元素上执行 目前我正在使用以下方法检查相等性 We
  • 重定向到带有 auth 标头的 url

    我正在尝试重定向到受保护的资源 当我按下登录按钮时 它会发送到我未受保护的登录 api 并返回一个令牌 其他路由期望标头 授权 不记名令牌 类型的交易 但我不知道当我重定向到受保护资源时如何设置标头 console log success
  • TFS 2018 以编程方式创建代理池

    是否可以以编程方式 最好通过 PowerShell 在 TFS 2018 中创建代理池 我在 REST API 中找不到类似的东西 我不知道为什么它没有详细记录 但这对我来说对 VSTS 有效 token myPAT base64AuthI
  • 获取 UITextView 中滚动后可见文本的 NSRange

    我正在尝试将滚动文本的位置保存在UITextView这样我就可以在加载时返回到该位置ViewController再次 我有很长的字符串 所以我希望用户能够滚动到特定位置 然后稍后返回到该位置 我正在使用UITextView scrollRa
  • 有没有办法让 json.Unmarshal() 根据“type”属性选择结构类型?

    我有一些以下形式的 JSON type car color red hp 85 doors 4 type plane color blue engines 3 我有类型car and plane满足车辆接口 我希望能够写 var v veh
  • 如何在开始其他活动时保留 Tabhost

    我的 TabHost 有问题 我的 TabBarActivity 类流程为 公共类 TabBarActivity 扩展 TabActivity 实现 OnTabChangeListener non Javadoc see android a
  • IdentityServer - AD 用于身份验证,其余部分在 DB 中

    我已经设置了一个已启动并运行的基本 IdentityServer 我使用 Identity Manager 和 Identity Admin 将所有内容 用户 角色 声明 客户端 范围 保存在数据库中 下一步是将身份验证与 AD 集成 我的
  • Tensorflow 计算图像中的对象[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 机器学习新手 因此正在寻找如何入门的方向 最终目标是能够使用 Tensorflow 训练模型来计算图像中的对象数量 我最初的重点是训练
  • 使用 psql 时获取错误代码

    当我使用 psql exe 运行 SQL 脚本时 发生错误时没有收到错误代码 有什么方法可以获取 psql 错误代码吗 我尝试将 VERBOSITY 设置为 详细 如下所示 但没有用 set VERBOSITY verbose 我正在使用
  • SecurityTokenInvalidAudienceException:IDX10214:受众验证失败

    我正在使用 Identity 和 Sustainsys Saml2 用于 SAML 身份验证 开发 ASP NET Core 2 应用程序 我已在 Startup cs 文件中进行了必要的配置 现在 当我运行该项目并尝试使用 SAML2 登
  • 如何在 C# 中获取当前用户的 Active Directory 详细信息

    我正在开发一个使用 Windows 身份验证的 C 和 ASP Net 应用程序 即在 Web config 中
  • powershell远程安装msi失败

    我正在尝试使用 powershell 在远程服务器上安装 msi 文件 服务器 1 是我的构建服务器 服务器 2 是我的应用程序服务器 当构建服务器完成构建后 我想触发一个 powershell 脚本以将最新版本安装到我的应用程序服务器 我
  • 获取列表中的项目

    我有以下列表项 public List
  • 给定一个搜索词列表,我如何知道我的字符串包含哪些搜索词?

    有很多软件会采用搜索字符串并查找数据库中包含该字符串的所有文本 MySQL 的WHERE MATCH searchterm string column 谷歌等 但是有没有一个好的算法可以反其道而行之呢 假设我有一个搜索词列表 丰田普锐斯 丰