返回列表

The "Magic" !

618. USPTO - Explainable AI for Patent Professionals | uspto-explainable-ai

开始: 2024-04-24 结束: 2024-07-24 法律检索 数据算法赛
The "Magic" ! - 解决方案

“魔法”!

作者: Theo Viel (Grandmaster)

发布时间: 2024-07-25

竞赛排名: 第 7 名

合作者: Ahmet Erdem

摘要: 通过使用“假”空格字符,你可以创建任意长度的查询。Whoosh 的预处理会将此字符替换为空格,而 count_query_tokens 函数不会!

有时候,代码示例比长篇大论的解释更好:

总体思路

假设我们有两个出版物(publication_1publication_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 名,但我相信顶尖团队发现了更好的技巧!

团队信息:

团队 leader: Theo Viel (Grandmaster)

同比赛其他方案