朴素的句子相似度分析

朴素的句子相似度分析


任务

本任务数据来自SemEval 2012,任务是通过训练集对测试集句子给出相似度,任务评价指标是你给出的答案与golden standard的Pearson系数,即线性相关系数。


预处理

接下来实现一些预处理功能,并且把它们代码封装在tool.py和parser.py模块中。

处理接口

这个任务的文件名和脚本很不友好,所以我经过了更改文件名和脚本,把测试集和训练集重命名一下。并且能打印测试报告。

分割句子

文件句子之间用TAB即chr(9)分隔,所以以此为依据分割两个句子。

预处理句子

比如去掉特殊符号和数字,统一大小写(后来还加了抽词干等优化)。

构造词典

根据训练集和测试接构造词典。

句子向量化

把句子转化为向量。并且输出到data文件给C语言模块使用。


朴素算法

0.square version

sample版本,直接字符串相似度判断。

1.common version

判断共同单词个数计算相似度。

2.relate version

相比common,对不同单词计算不同单词直接相似度,这个数值由训练集得到。
句子相似度 = (每个单词和它最可能相关单词的相似度)的平均值
如果单词一样,认为它们最可能相关,否则找共同出现次数最多的单词。
训练时候把一个句子相似度分给句子里的不同单词组。

3.rel version

修正了relate版本的bug
并且句子相似度计算有了不同尝试,例如不计算最可能相关,计算所有相关单词组加权平均,或者计算topk相关单词组。训练时候也不平摊,给最相关topk平分句子相似度之类的。
所以rel有rel版本,rel+topk版本,rel+weight版本。


优化

CPP实现核心计算

由于词汇量有6000多,开一个词与词相关矩阵的话内存消耗很大,不适合用python书写,所以用C++实现核心部分。为此,必须把句子向量化以后输出到data文件中,所以特意实现来parser.py模块。

词汇抽主干

我尝试预处理时候加优化,尝试了nltk模块的lem和stem抽主干方法,结果lem(lemmatization)不仅要下载一大堆数据而且效果是stem好,所以用stem抽主干。


朴素算法细节

以下节选自我的文件夹里的readme.txt,记录了细节信息。

0.square version

This is a sample version implementing with difflib.

1.common version

Simply calculate the common words of two sentences:
Parse a line into vec1 and vec2, let c = len(vec1 & vec2), ci = len(veci),
Calculate sim(c, c1, c2) = (c/(c1+c2))*10.

2.relate version

Based on calculating the relation of word1 and word2:
word1 == word2, relation = 5
else if word1 or word2 is not in train file, make relation be 2.5
else calculate relation according to train file
For vec1, try to find the fittest word in vec2 for every word.
And so for vec2, then calculate the ave relation of them.

*A small bug detected: sim will fail to get the right t[vec1[i1]][vec2[i2]]
and r[vec1[i2]][vec2[i1]] reverse vec1 and vec2, fix it later in rel.

3.rel version

Fix the bug in relate version
And it also has a top-k version, in relate, find fittest word, but in
rel+topk, find top-k fittest words, and I find the best BASE 3.28.
And if count all words in, though considering weight, it will not do
better, such as rel+weight, in which weight is t[][].

测试结果

以下节选自我的文件夹里的result.odt,记录了细节信息。其中编号是当年比赛队伍的名次。

RankALLMSRparMSRvidSMT-eurOn-WNSMT-news
10.823920.683010.873900.527970.664080.49365
100.756210.604980.793890.429360.587050.33659
200.694580.410610.835140.512790.727300.43826
300.652870.612400.724030.558120.670250.45327
rel+stem+topk0.649140.542420.728010.470650.690510.40858
400.628930.468620.802670.457390.659070.47131
rel+stem0.622060.552460.701820.435650.646220.42871
relate+stem0.606070.545960.707940.337760.623750.40262
500.597660.529410.746990.553060.569840.36589
relate+lem0.596570.537640.702910.392000.616480.40860
rel+stem+weight0.557110.502960.625150.287210.650200.38083
relate0.546870.517830.613210.378390.604310.43599
common+stem0.531480.476170.581510.492950.692840.39429
common+lem0.530720.475520.581860.494430.685680.44757
600.525310.573480.712260.478050.698380.41773
common0.470930.448240.443670.485090.666040.44783
square+stem0.465030.322720.496890.487230.659360.39991
700.459240.652270.669070.356590.611670.46031
800.415700.425950.562840.154590.455220.19229
baseline0.310960.433400.299570.454230.586420.39075
88-0.025960.110900.005690.034840.178800.19637
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值