我现在正在努力寻找一种最好的方法,无论是从逻辑上还是技术上,同时尝试以连续,轮换的方式匹配两组大型文本,这是我的最佳选择。

一方面,我们有歌曲及其歌词(大约3000万行文本,每行约1000个字符),另一方面,我们有歌曲歌词类别(约20K,每行约50个字符)。 歌曲歌词类别指的是歌曲的含义。

应该将每首歌分配到一个或多个类别,而我的观察方式只能通过将每个类别中单词的相关性与歌曲的歌词进行对比,然后选择一个来完成。拥有最高的全文搜索得分(对于具有相同最高得分的那些,则得分大于或等于1个类别),并考虑了适当的全文搜索引擎的同义词,词干,停用词以及所有的花哨信息。 如果您有更好的方法来解决此问题,请随时给我提示。

作为一个示例,根据其歌词,歌曲“ Unchained Melody”应归为以下类别:

  • 情歌
    • 为了我的宝贝,我的爱
      • 感觉孤独

它的歌词确实包含了该类别(其整个路径)中包含的所有这些词,包括它们的变形和同义词,因此多次出现,因此该类别的文本应与歌曲的文本排名相当。

那么问题是,使用哪种可能的方法将所有这些类别文本与所有这些歌曲文本进行匹配?

请记住,自然地,如今每天都会发布成千上万首歌曲,而且类别的变化和改进甚至有很大的机会。

到目前为止,我已经尝试了以下方法:

  1. SQL Server 2014保存这些类别,并链接到一个Sphinx搜索引擎,该引擎将歌词文本保存在其全文索引中。 在这些应用程序之上构建的应用程序对单个歌曲文本执行20K查询(即,获取每个类别与歌曲文本的相关性),并选择排名最佳的结果。 这意味着20K * 30M查询所有要匹配的歌曲。 当然,这需要在40核心计算机+ 256 GB RAM上使用的时间,并且到那时,将出现新歌曲,并且可能会更改/更新类别的结构。

  2. 这很有趣:SQL Server 2014保存歌曲歌词,并链接到保存类别文本的Sphinx。 通过将歌曲文本拆分成单词,并在它们之间使用“或”运算符,可以创建与每首歌曲的类别相匹配的查询,如果在一行中找到更多单词,则结果排名会更高(包含类别文本和完整文本路径)。 结果是:速度更快,因为每首歌曲只有1个大查询才能获得其最高排名,但仍然不够快,而且准确性稍差。

  3. SQL Server 2014同时拥有歌曲歌词和类别,并启用了全文搜索,而对有限的类别集使用第一种方法(没有Sphinx,仅SQL的FT)时,首先使用第二种方法(同样,没有Sphinx,仅是SQL的FT),所有内容分为数百个异步批处理工作。 因此,它是上述两者的结合。 结果:更准确,并且具有全部功能,但速度更快,但仍不足以达到我认为的可能。 匹配所有歌曲和歌词大约需要3天。

如果您有其他可以尝试的想法,我将不胜感激。 我对准确性(40%)和速度(60%)感兴趣,并且我真的觉得有更简单的方法可以完成这项工作。

#1楼 票数:2 已采纳

就个人而言,我可能会坚持使用1.,但有两个改进

批处理更新 ,而不是简单地针对每个类别/文档组合运行一个查询。 对每个类别运行一个查询-并获取所有文档的结果。 较小的查询。 您可以进行一些优化,以使这些“大”查询效率更高。

Delta Updates (而不是每个周期)仅运行“完整”过程,而是定期使用单独的较小且特定的系统。 一位知道如何运行更有针对性的更新以避免重复工作的人。 例如:

  1. 在您添加新类别后,只需运行其大查询即可找到该类别的文档。 删除的类别只会删除记录。 对类别的“编辑”可以是删除,然后是插入。

  2. 新文档也可以是特殊的狮身人面像索引,仅包含新文档(main + delta索引系统可能已经提供了!)。 然后针对这个较小的增量索引针对每个类别运行主查询。

  3. 甚至可以使用“投机”系统来减少您需要运行的类别的数量。 例如,将类别中的所有单词合并为BuildKeyword批量调用。 这可以使您获得每个单词的点击数,从而可以排除没有匹配项的类别(因此,对于许多类别,无需运行主查询)

...更聪明地工作,而不是更努力

  ask by Claudiu translate from so

未解决问题?本站智能推荐:

2回复

比较数据库中或本地两个表之间的文本字符串

编辑:SQL 不适用于此。 我刚刚发现了 Solr/Sphinx,它似乎是解决这个问题的正确工具,所以如果你知道 Solr 或 Sphinx,我很想收到你的来信。 基本上,我有一个带有专利信息的 .tsv 和一个带有产品名称的 .csv。 我需要将专利列的每一行与产品名称进行匹配,并在新的 .cs
1回复

在SQL全文搜索中使用通配符(*)和单词分组进行智能搜索

使用通配符和引号之类的所有普通内容实现MS SQL全文搜索的最佳方法是什么。 例如: 如果用户输入的搜索词是 儿童过量服用“维生素C” * 我想将“维生素C”视为一个短语,并希望将“孩子”和“孩子”匹配 该文档提供了许多替代方案,很难区分它们。 我很希望能够在全
1回复

哪些数据库支持对数前缀搜索?

哪些数据库有对数方法来获取字符串的所有前缀? 例如: 当我查询的前缀an将返回 我知道这是可能的,因为你可以执行一个二分搜索,问:给我一个大于an和小于ao的最小索引 在大多数数据库中执行此操作的一种简单方法是使用类似查询: 我的理解是它正在执行线性搜索,因此对我来说效率不高。
4回复

在完全匹配的c#文本中查找所有关键字及其索引[重复]

这个问题已经在这里有了答案: 正则表达式匹配全部单词 4个答案 我有一个关键字列表和一个文本来搜索它们。 我需要获取文本内每个找到的关键字的开始索引,并且匹配项必须准确。 例如: 在这里,仅匹配与索引匹配的“ cat”和“ dog”时,必须返回匹配项,并
1回复

在文本字段上进行关键字搜索的最佳方法是什么?

我有一个数据库表,其中包含有关图像的元数据,关注的字段是标题字段。 我希望用户能够在文本框中输入关键字,并让应用根据标题返回与关键字匹配的图像选择。 我已经有了返回用户输入的单个关键字数组的代码,但是进行比较的最佳方法是什么。 所以我正在考虑... 但这似乎有点过于简单,因为它
1回复

如何优化Sphinx搜索以进行模糊文本匹配?

情况:我有一个MySQL数据库,总共有2百万条记录,其中包含中英文文本单词和语料库以及它们之间的关系。 它在具有1.5G RAM和2.26Ghz双核CPU的专用服务器上。 使用包含30个以上汉字的字符串进行搜索时,大约需要4秒钟才能得到结果。 这太慢了。 搜索方法:运行查询时,一旦有
6回复

用于文本算法的 .NET 库?

你知道任何用于文本算法的 .NET 库吗? 特别是我对字符串匹配和全文搜索算法感兴趣 Bitap算法 莱文斯坦距离 Damerau-Levenshtein 距离 我知道我提到的一种编码非常简单,但是有数百种文本算法,我不想自己全部编码。 如果没有这样的 .NET 库,你可以提到 C、C
5回复

用于查找文本中所有关键字的高效算法

我有很多字符串包含许多不同拼写的文本。 我通过搜索关键字来标记这些字符串,如果找到关键字,我会使用该关键字的关联文本。 假设搜索字符串可以包含文本“schw。”,“schwa”。 和“施瓦茨”。 我有三个关键字都解析为“schwarz”文本。 现在我正在寻找一种有效的方法来查找