Python:避免嵌套的for-loop NLP版本;任何库支持吗?

时间:2019-01-01 09:54:55

标签: python python-3.x nlp nltk

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

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”,以及该文档与原始文档(“ hart pott”)不同,并且得分更高,在这种情况下,我将其汇总。该运行时应为O(index_size * max_number_of_tokens)。

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

NLTK中有什么可以帮助我吗?我认为至少应该有一个向量化字符串的工具。也许您可以使用它作为简单的查找来执行“ starts-with”操作,而无需手动生成trys-map?

1 个答案:

答案 0 :(得分:0)

Lucene中,

自动建议和搜索特有的许多其他功能都可以很好地处理。您可以尝试PyLucene

的Python实现

或者,如果您希望答案仅限于所问问题的具体内容,请尝试使用Python的ngram模块。详细信息here