首页 > 解决方案 > Python:避免嵌套的 for-loop NLP 版本;任何库支持?

问题描述

我正在尝试进行基于用户查询的自动建议。我有一堆聚合查询,例如:

QUERY          COUNT
"harry potter" 100
"iron man"     93
"harry pott"   32
"harr pott"    5

大约有 200.000 行。正如您所看到的,一些用户广泛使用前缀搜索,只输入单词的第一个字母。示例中的这些查询应与完整的“哈利波特”行聚合。

现在假设大多数用户使用完整的单词进行搜索,我认为我可以通过以下方式有效地进行聚合(避免整个索引上的嵌套 for 循环):

我按字母顺序对查询中的标记进行排序并生成一个映射“first_token”,例如:

"h"         "harry potter"
"ha"        "harry potter"
"har"       "harry potter"
"harr"      "harry potter"
"harry"     "harry potter"

分别是“second_token”等等......

"p"         "harry potter"
"po"        "harry potter"
"pot"       "harry potter"
"pott"      "harry potter"
"potte"     "harry potter"
"potter"    "harry potter"

然后我从上到下迭代,对于像“harr pott”这样的每个元素,我检查“first_token”和“second_token”中是否有一个元素的值是相同的文档,例如“harry potter”并且该文档不是与原始(“harr pott”)相同并且得分更高,在这种情况下我将其汇总。它的运行时间应该是 O(index_size * max_number_of_tokens)。

现在我想知道是否有任何 Python 库可以让我更轻松地实现所有这些。来自 Java/JS 我对 Python 还不是很熟悉,我只知道它有很多用于 NLP 的工具。

NLTK 中的任何东西都可以帮助我吗?我认为至少应该有一个用于向量化字符串的工具。也许使用它您可以将“starts-with”操作作为简单的查找进行,而无需手动生成尝试映射?

标签: pythonpython-3.xnlpnltk

解决方案


自动建议和许多其他特定于搜索的功能在Lucene. 你可以尝试它的 Python 实现PyLucene

或者,如果您希望回答仅限于您所问问题的具体内容,请尝试ngramPython 模块。详情在这里


推荐阅读