思路
其实这个比赛可以总结为一个问题,第二个问题只是在第一个问题的基础上的应用而已。而解决第1个问题的关键就在于构建一个机器学习模型,从而能够根据两个非结构化的文本来输出,两者之间是否重复。说到底就是一个监督学习的问题。
要解决这个监督学习问题,首先就要将非结构化的文本转换为结构化的,类似于表格或者向量的数据。为了解决这个问题,本文将英语文本进行拆分,停用词过滤,提取词根,在采用磁带模型配合TF-IDF方法,最终将非结构化的英语文本转换为一个向量。
之后将附件2,与处理过后的附件一进行合并,从而获得用以机器学习的数据集。考虑到直接合并产生的数据及占用的空间非常大,所以本文在进行合并操作的时候进行了适当的筛选。
然后由于重复的数据比起非重复的数据,数量上差距太大,如果直接用于监督学习,会由于类别不均衡问题,导致模型的效果太差。所以在训练模型之前,本文采用过采样和欠采样的方法,来解决数据的类别不均衡问题。
再考虑到数据的特征非常多,容易造成维度灾难,因此本文将采用卡方检验来排除那些不相关的特征。
最后本文将采用逻辑回归模型,根据上述处理过后的数据,即按 7:3 的比例拆分成训练集和测试集,在训练集中训练模型,在测试集中评价模型评价指标为 F1 值。
得到机器学习模型之后,要解决第2问就比较容易了。只需要将目标问题与其他问题的两两配对,输入到逻辑回归模型之中,就可以得出相应的概率,然后依据概率最大,提取出前10个问题即可。
逻辑回归模型当然不仅可以输出概率,也可以输出类别。我们只要应用逻辑回归模型对目标问题和这前10个问题进行预测,得到标签,结合原数据标签,就可以得出可以K值。
总结一下,就是其实这道题不难,就是数据的处理方面和编程方面有一些麻烦而已。特别是对我这个内存只有8G的人来说。😂
非结构化文本→结构化表格(英文)
这里主要将英文的文本数据,转换成结构化的 TF-IDF 词袋模型数据:
网页标识处理
这里将所有的网络 tag 都删除,仅保留文本:
空格、标点符号过滤,并转换为小写
以第一条为例:
I have an ArcGis Desktop Standard license and I would like to perform an operation to find out the difference between 2 features classes geometries (Something like symmetrical difference in Arcgis advanced version). Unfortunately symmetrical difference is not available for Arcgis desktop standard. The operation should be performed using Arcpy. Has anyone a tip for me, how to perform such an operation on Arcgis Standard?
Thanks
经过如下处理:
- 将文本的左右两边的空格,空行都删除。
- 将文本转换为小写
- 将文本中所有的标点符号转换为 空格。
可得:
i have an arcgis desktop standard license and i would like to perform an operation to find out the difference between 2 features classes geometries something like symmetrical difference in arcgis advanced version unfortunately symmetrical difference is not available for arcgis desktop standard the operation should be performed using arcpy has anyone a tip for me how to perform such an operation on arcgis standard thanks
停用词过滤、保留词根
- 将字符串中包含的停用词1过滤
- 将字符串中的每个字符,用其词根替换。
转换后变为:
arcgi desktop standard licens would like perform oper find differ 2 featur class geometri someth like symmetr differ arcgi advanc version unfortun symmetr differ avail arcgi desktop standard oper perform use arcpi anyon tip perform oper arcgi standard thank
TF-IDF 建模
- 用 TF-IDF 词袋模型,对上述处理后的数据进行建模。至此,就可以将非结构化的文本数据,转换为结构化文本。
生成用于机器学习的数据集
附件 2 有 questionID、duplicates、labels。其中 Duplicates 是一个字符串,字符串包含了所有与该行 questionID 重复的所有 questions 的 IDs,如下所示:
返回目录
将 duplicates 转换成 duplicate
比如 questionID = 90834,将其转换为:
questionID | duplicate |
---|---|
90834 | 41307 |
90834 | 57338 |
当然,在此之前,需要将 [‘41307’, ‘57338’] 转换为单纯的整数。
附件一与附件二合并
粗放地合并
对于那些标签 0 的数据,我们发现他们的 duplicates 列 NAN:
以 73399 为例,可以理解为,73399 和其他 questionID 的标签都为 0,也就是问题不重复。
因此,可以我们可以考虑将附件一种的 question 两两组合起来,并根据附件二,给这些数据打上标签,以表明这两个问题是否重复。
但这就会导致一个大问题,首先附件 1 的问题(数据)共有 7294 条。若两两组合,则会有 ! 7294 = 53202436 !7294=53202436 !7294=53202436,共有 5 千多万条。而附件 1 经过处理后,共有 23268 列,加上两两拼接,共有 23268 × 2 = 46536 23268\times2=46536 23268×2=46536,最终数据的大小是 ( 53202436 , 46536 ) (53202436 ,46536 ) (53202436,46536)。可以看到,数据量非常的大!
另一个问题是,附件二中,那些两两重复的问题共有 1004 个。两相对比下, 53202436 : 1004 ≈ 5299 53202436:1004 \approx 5299 53202436:1004≈5299,可以说数据是非常不均衡的。如果采用过采样、欠采样的方法解决,则必须要用欠采样生成新样本,从而将数据量化为: ( 1 亿 , 46536 ) (1 亿,46536) (1亿,46536)
所以不能将用这种合并。
选择地合并
由于我们的题目是要求出一个,给出两个问题,返回两个问题相似的概率。所以,就要训练一个机器学习模型。
那么,训练该机器学习的数据集,是否有必要将所有问题的两两组合都投入训练呢?需要但不必要。
因为,我们已经知道,首先:
- 输入只是局限于附件 1 中。
- 重复与否,也局限于附件 2 中。
那么,既然如此,我们只要把那些,两两重复的所有 id 提取出来(共 1792 条,没记错的话),然后,再与剩下的问题两两构成配对即可。这时,数据集的大小大概为:13105521。
虽然如此,但是不得不说数据量还是太大了,并且还是会有类别不均衡的问题。因此,这里考虑,使用分层不重复抽样的方法,从 label==0
的数据抽取 0.005,再与 label==1 的数据构成一个新的数据集。最终得到 66527 个数据。
不过:
这就是大数据的魅力啊!
解决上述问题有两种方法:
- 用 dask 分块读取
- 特征过滤
考虑到特征过滤在接下来我们也需要使用,所以对数据先进行特征过滤。
特征过滤
为了对数据进行过滤,且在过滤的过程中,必须避免直接合并附近 1 和附件 2(11 GB 吃不消呀),所以这里将附件二(处理过的)中的 label==0
的数据随机采样,从而将 label==0
的数量弄成与 label==1
相同,也即 1004 条。
之后,再用采样后的 1004 × 3 1004\times 3 1004×3 的“附件二”,与结构化附件一拼接,如何拼接?
首先,以 “附件二” 的第一个 questionID 和 “附件一” 的 id 为链接键,然后再用 SQL 的内连接方式拼接在一起。
之后,以以 “附件二” 的第二个 questionID 和 “附件一” 的 id 为链接键,然后再用 SQL 的内连接方式拼接在一起。
最后,再取两个表格相减的绝对值,作为最终数据。
然后,对“最终数据”,我们采用卡方检验,设置显著水平为 α = 0.5 \alpha=0.5 α=0.5,原假设为:当前检验的特征与是否重复无关(相互独立)。之后,我们将那些否定原假设的特征提取出来,从而实现特征过滤。
合并
根据上述过滤后的表头,套用到“附件一”中,从而大大降低附件一的列数,就可以实现与“附件二”的安全合并了(占用空间小于 1GB)。
类别不均衡问题
将附件一和附件二进行合并后,由于 label==1
的数据只有 1004 条,而 label==0
的数据却有65023 条,可以看到数据是极度不均衡的。
为了解决类别不均衡问题,我们需要将数据先后进行:采用单边选择算法,和 ADASYN 算法的过采样、欠采样,进而解决类别不均衡问题。
逻辑回归模型——判断两问题是否相似
将解决类别不均衡后的数据集,按 7:3 的比例拆分为训练集、测试集,以 label 为输出,其他特征为输入。
采用逻辑回归模型,用训练集训练模型,用测试集测试模型的效果,评价模型的指标为 F1 值,结果如下:
似乎测试集的 F1 比训练集还要好哈。。。
TopK 与得分 R
由于逻辑回归模型判断的标准是 sigmoid 函数,引起其不仅可以根据数据得出标签,而且也可以得出其属于某个标签的概率。因此,我们可以直接采用上述的逻辑回归模型,求出两个问题是否重复的概率,并根据概率进行排行,进而得到 TopK 列表。
然后,根据 TopK 列表中的问题 id,再用逻辑回归模型,可以得出是否重复的标签。最后,结合原数据集,即可得出 R:
R = N detected N total R=\frac{N_{\text {detected }}}{N_{\text {total }}} R=Ntotal Ndetected
数据和代码
代码和数据可见:https://gitee.com/zhuowoodbird/contest_of_central_china_2021_B
记得一键三连呀… 别做伸手党呀… 就点个赞,关个注也行呀,谢谢了 😊
停用词指那些意义较小的词,如 an、the 等 ↩︎
转载:https://blog.csdn.net/weixin_42141390/article/details/116327701