匹配文本的大型数据集 - 如何更快地做到这一点?

问题描述:

我正在努力争取数周的时间,在尝试以连续,旋转的方式匹配两大组文本的同时,在逻辑和技术方面进行最佳方法。一方面我们有歌曲和他们的歌词(大约30M行文本,每个约1000字节),另一方面我们有歌词类别(约20K,每个约50个字符)。歌词分类指的是歌曲的内容。匹配文本的大型数据集 - 如何更快地做到这一点?

每首歌都应该分配到一个或多个类别,以及我看到它的方式,这只能通过比较每个类别中的词语与歌曲的歌词之间的相关性来完成,通过选择具有最大全文搜索分数(或超过1分类,对于那些具有相同最大分数的分类)的那个,同时考虑同义词,词干,停用词以及适当全文搜索引擎的所有花里胡哨。如果你有更好的方法来解决这个问题,请不要犹豫,给我一个提示。

作为一个假设的例子,根据它的歌词,歌曲“奔放的旋律”应该去类别:

  • 情歌
    • 因为亲爱的,我爱
      • 感到孤独

它的歌词确实包含了包含在该类别(它的整个路径)中的所有这些单词,包括它们的倒数和同义词多次,所以这个类别的文本应该与该歌曲的文本排序相当好。

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

请注意,当然,现在每天都会有数千首歌曲发布,而且即使存在根本性的变化,类别也在不断变化/改进。

到目前为止,我已经试过如下:

  1. 的SQL Server 2014拥有的类别,链接保存歌词文本在其全文索引狮身人面像搜索引擎。构建于其上的应用程序对单个歌曲文本执行20K查询(即,获取每个类别与歌曲文本的相关性),并选择排名最佳的结果。这意味着20K * 30M查询所有要匹配的歌曲。当然,这需要40台核心机器和256GB内存,届时,会有新的歌曲,并且可能会更改/更新类别的结构。

  2. 这一个很有趣:SQL Server 2014持有歌词,链接到持有类别文本的狮身人面像。通过将歌曲文本分割成单词来创建与每首歌曲的类别相匹配的查询,在它们之间具有“或”运算符,如果在一行内找到更多单词(包含类别文本和来自其全文的文本)路径)。结果是:速度更快,因为每首歌曲只有1个大查询才能获得排名最高的类别,但仍然不够快,而且准确度稍低。

  3. SQL Server 2014支持歌词和类别,启用全文搜索功能,同时在有限的一组类别中使用第一种方法(没有Sphinx,只是SQL的FT),最初来自第二种方法(再一次,没有狮身人面像,只是SQL的FT),并且所有东西都分成数百个异步批量的工作。所以,这是以上两者的结合。结果:更准确,并且给予全部的力量,更快一点,但仍然不够,因为我觉得这是可能的。大约需要3天才能匹配所有歌曲和歌词。

如果您有任何其他想法,我可以尝试,我真的很感激它。我对准确性(40%)和速度(60%)感兴趣,我真的觉得做这份工作有更简单的方法。

+1

声音喜欢你试图根据歌词来分类歌曲。我对么? – Neil 2015-03-31 01:47:27

+0

这与我真正想要做的事情最接近,实际上它要复杂得多。但是,是的,它可以被安全地视为一个正确的假设。 – Claudiu 2015-03-31 03:18:52

+0

我不回答你的问题,只是想讨论并给你一些建议。因为,你面临着一个很大的问题,你应该指出你有多好。我看你没有提到你的预处理。您是否以简单的结构降低了文档的复杂性? – Neil 2015-03-31 03:34:40

个人而言,我可能会坚持自己的1但有两点改进

批更新,而不是简单地运行每个类别/文件组合中的一个查询。对每个类别运行一个查询 - 并获取所有文档的结果。更少的更大的查询。您可以通过优化来使这些“大型”查询更加高效。

增量更新,而不是每个时期,只是运行'完整'过程,定期使用一个单独的较小且特定的系统。知道如何运行更专注的更新以避免重复工作的人。例如:

  1. 您添加了一个新类别,可以运行其大查询来查找该类别的文档。删除的类别只是删除记录。一个'编辑'到一个类别,可以是一个删除后跟一个插入。

  2. 新文档,也可能是一个特殊的狮身人面像索引,只包含新文档(主+三角洲索引系统可能已经提供!)。然后针对这个更小的增量索引运行每个类别的主要查询。

  3. 可能甚至可能使用“推测”系统来减少您需要运行的类别数量。例如,将类别中的所有单词归入批量BuildKeyword调用。这让你回到每字命中,这个可以排除不具有匹配的类别(所以没有必要运行主查询,对于许多类别)

...工作更便捷,更

+0

是的,我想到所有这些。但我很懒。我会去工作然后... – Claudiu 2015-03-31 19:52:04