返回列表

7th place solution(with inference code)

498. Foursquare - Location Matching | foursquare-location-matching

开始: 2022-04-14 结束: 2022-07-07 商品理解 数据算法赛
第7名解决方案(含推理代码)

第7名解决方案(含推理代码)

作者: nadare (Master) | 比赛: Foursquare - Location Matching | 排名: 7th

更新

我发布了我们的推理代码
代码比较乱,但我希望它能对你有所帮助。

更新 2

我发布了关于 Word Tour 的笔记本
“Word Tour”是该解决方案的重要组成部分之一,很可能也适用于其他任务。请查看并点赞。

简介

我们发布我们的解决方案。
由于是通过谷歌翻译生成的英文,我想可能有一些不自然的地方,但请原谅,我会尽可能在稍后进行修正。

概览

我们根据每种语言对“名称”和“地址”进行了预处理,并将其转换为嵌入。
我们根据距离、名称相似度、单词和字符的精确率以及基于多元回归的召回率生成了候选者。
通过 LightGBM 二分类进行预测。
在后处理中,通过并查集树将预测值超过阈值的边划分为子图,然后选择最短距离在2以内的那些。

解决方案概览

大家关心的从 0.933 到 0.951 的跳跃发生在我将 5 折交叉验证中的一折替换为使用所有数据训练 2000 次迭代的模型时,而之前的那一折是在 500 次迭代时早停的。

预处理

自然语言预处理

由于名称和地址是多语言的,我准备了三个独立的处理过程。

  1. 几乎原始的文本
  2. 针对每种语言的文本,进行小写化、符号移除和数字数字化
  3. 关于第2点,使用 unidecode 将文本转换为 [0-9a-z &]

此外,由于地址有很多缺失值,我们通过连接距离最近的三个邻居来进行补充。

针对每种语言的处理

基本上,所有语言都统一进行符号移除 -> 小写化/数字数字化 -> 字母化。
由于日语、中文和泰语是需要分词的语言,因此单独进行处理。

对于日语,使用分词器 Sudachi 获取分词和读音,然后使用 Pykakasi 将其转换为罗马字。
中文通过 zh_segmentation 进行分词,并通过 unidecode 转换为罗马字。
泰语使用 PyThaiNLP 进行分词和罗马化。

城市、州预处理

对于城市和州,我们按出现次数的顺序提取了大约 2000 个,并将其归类为距离附近的 2000 个类别之一。
我们还使用 cities1000 数据集将其转换为前 2000 个地名,并将其作为一个类别。(以下简称 geo_name)

创建嵌入

对于上一节第3点的文本,名称和地址使用不同的句子片段被分割成 32000 个子词。
在此基础上,我们通过以下三种基于 word2vec 的无监督预学习来学习嵌入。

  • 关于名称的 Skip-gram 任务
  • 根据名称、地址、城市、州、geo_name 预测类别的任务
  • 一种混合名称、地址、城市、州、geo_name、类别并通过 SimCSE 猜测自身的对比学习任务

在进行这些学习时,获取负样本

同比赛其他方案