618. USPTO - Explainable AI for Patent Professionals | uspto-explainable-ai
摘要: 通过使用“假”空格字符,你可以创建任意长度的查询。Whoosh 的预处理会将此字符替换为空格,而 count_query_tokens 函数不会!
有时候,代码示例比长篇大论的解释更好:
假设我们有两个出版物(publication_1 和 publication_2),标题分别为 title_1 = t1_1 t1_2 t1_3 ... 和 title_2 = t2_1 t2_2 t2_3 ...。
查询这两个出版物最简单的方法是:
query = ti:"title_1" OR ti:"title_2"
问题在于标题可能很长,包含多个单词。由于 token 限制为 50 个,你无法查询足够的标题来获得合理的分数。
如果 title_1 只算作一个 token,那就意味着我们可以查询 25 个标题,从而轻松获得 0.8+ 的分数!
统计 token 的函数使用的是空格:
def count_query_tokens(query: str):
return len([i for i in re.split('[\s+()]', query) if i])
然而,Whoosh 使用了更复杂的预处理。如果我们能找到一个字符,它会被 Whoosh 替换为空格,但不会被 count_query_tokens 的正则表达式识别,那么我们就可以以一个 token 的代价查询整个标题!
事实证明,这样的特殊字符确实存在:~ 就是一个例子。这个查询:
query = ti:"t1_1~t1_2~t1_3~..." OR ti:"t2_1~t2_2~t2_3~..."
只消耗 3 个 token,并且匹配到的文档与以下查询相同:
query = ti:"t1_1 t1_2 t1_3..." OR ti:"t2_1 t2_2 t2_3..."
仅使用这个技巧查询 25 个精确标题,就能达到 leaderboard 0.8 分,这几乎已经进入金牌区了。
使用 cudf-pandas 在 GPU 上处理所有内容使得代码超级快。上面分享的 Notebook 运行只需 1 分钟!可惜这次比赛没有效率赛道 😄
我们使用了一些稍微更复杂的启发式方法达到了第 7 名,但我相信顶尖团队发现了更好的技巧!