本案例中,我们分别从网页上爬取了“火箭”一词在“NBA球队名”和“燃气推进装置”两个语义下的多个句子作为语料库,然后使用基于词典的Lesk算法,对给定的包含“火箭”一词的句子进行词义消歧,判断其语义为“NBA球队名”还是“燃气推进装置”。
首先利用网络爬虫,分别抓取多义词“火箭”在“NBA球队名”和“火箭拖进装置”两个语义下对应的百度网页,提取含有多义词的句子,构建相应的语料库。最终爬取的两个语料库的结果如下:
语义1:NBA球队名
['1994-95年休斯敦火箭队夺得总冠军(4张)', '2001年,火箭将年事已高的哈基姆·奥拉朱旺交易至多伦多猛龙队,只留下史蒂夫·弗朗西斯和卡蒂诺·莫布里小鬼当家,带领一群新秀和板凳打拼。', '带着极高的期望进入季后赛,火箭队却在首轮三局两胜的比赛中连输两场败给亚特兰大老鹰队。', '回顾火箭40年历史:大个子辉煌 姚明延续传统-3', '1994-95赛季,卫冕冠军休斯敦火箭队得到“滑翔机”克莱德·德雷克斯勒,和哈基姆·奥拉朱旺两人帮助火箭队以西部第六名的身份挤进了季后赛。', '在哈基姆·奥拉朱旺等球星接连退役之后,火箭队开始出现了“小鬼当家”的情况。', '火箭队这一次得到的状元还是一名内线球员,选择了中国籍球员姚明,姚明也成为NBA联盟历史上第一位外籍状元。', '除上述四家平台外,搜索发现,拼多多、考拉海购、天猫、分期乐、国美均未在售火箭队相关产品。', '常规赛结束后,火箭队以46胜36负的成绩列中西赛区第二。', '1989-90赛季,火箭队并未对阵容进行大的调整。', '但是火箭队因为受到伤病的困扰,一直无法突破季后赛的首轮', '休斯敦火箭队', '三方交易麦蒂去纽约 火箭得到马丁+希尔+选秀权', ',都是以字母体现,中间是一个精心处理过的“R”,像是徐徐上升的火箭一般。', '事件背景2019年10月5日,休斯顿火箭队总经理莫雷在推特账号发表疑似支持“港独”的言论,内容是近几个月香港暴力分子常喊的一句口号:“为自由而战,和香港在一起(Fight for freedom,Stand with Hongkong)”。', '但值得纪念的是,火箭队历史上的第一场NBA比赛是在1967年10月14日,于圣地亚哥体育馆内进行的', '在休斯敦的第一赛季,火箭取得34胜48负的成绩,位列太平洋分组第四。', '这个赛季是约翰·埃根执教火箭的第二个完整赛季,也在迁到休斯敦后第一次出现季后赛中。', '2019年1月17日,在火箭142-145负于篮网的比赛中,哈登连续两场得到57分以上,过去20场比赛场均得分40+,排在历史第五位。', '回顾火箭40年历史:大个子辉煌 姚明延续传统-4', '80年的后期,火箭队有变成了一支碌碌无为的球队,再加上球队的明星桑普森因为受伤离队之后,火箭队在当时最好的成绩也不过是季后赛的首轮而已', '2004-05赛季,为了能更好地提升球队战斗力,火箭队从魔术队换来了得分王特雷西·麦克格雷迪。', '火箭队主场丰田中心(11张)', '在经历了一系列的季后赛大战之后,火箭队在总决赛中迎来联盟中的青年近卫军——奥兰多魔术队。', '1980-81赛季,在众人不看好的情况下,火箭队一路过关斩将,杀进了季后赛。', '12月18日,火箭队正式裁掉周琦', ……]
语义2:燃气推进装置
['当时在中国民间广为流行的能高飞的“火流星”(亦称“起火”),实际就是世界上第一种观赏性火箭。', '三级型由二级型火箭加上一个液体三子级构成,', '运载火箭结构', '日本正在H-2A火箭的基础上发展更大的H-2B火箭,其一子级直径从4米增加到5米,主发动机增加到2台,可用于发射有效载荷质量为16.5吨的HTV,向国际空间站运送货物,也可将质量8吨的其他类型有效载荷送入地球同步转移轨道。', '运载火箭发射前准备', '探空火箭结构', '1972年1月再次发射“黑雁”5C 火箭进行金属熔炼实验。', '当火箭离开发射台时,底部唯一尚连接着的电缆脱拔插头被拉脱,火箭与地面的有线控制完全中断。', '探空火箭', '简单的火箭甚至早在牛顿提出这一原理前几百年就在中国被发明出来,并得到了应用,包括军用的火药箭和节日庆典的烟花。', '火箭按动力能源', '3)控制系统是用来控制运载火箭沿预定轨道正常、可靠飞行的部分。', '火箭发动机点火以后,推进剂(液体的或固体的燃料和氧化剂)在发动机燃烧室里燃烧,产生大量高压气体;', '到1分钟准备时,箭上系统由地面供电转为由箭上电池供电,经10秒钟自检正常后,电缆连接器自动脱落,电缆摆杆离开运载火箭摆到预定位置。', 'JAXA 目前使用的探空火箭系列有S-310、S-520 和 SS-520。', '20 世纪80年代后期,NASDA重新制定了微重力火箭研究计划,命名为TR-1A 的微重力火箭于1991年9月首次发射成功,搭载了5种用于空间材料科学研究和加工的实验装置。', '为了节省发射成本,维珍轨道要用飞机发射火箭', '对液体火箭来说,动力装置系统由推进剂输送、增压系统和液体火箭发动机两大部分组成。', '运载火箭发射程序', '瞄准系统由地面瞄准设备和运载火箭上的瞄准设备共同组成。', '与地面发射场相比,从海上平台发射火箭同样具有多种优势。', '飞马座运载火箭包括标准型和加长型(飞马座XL)两个型号,均为三级固体运载火箭,采用端羟基聚丁二烯推进剂。'……]
基于词典的Lesk算法分别计算多义词的不同语义在词典中的解释和给定上下文语境下词语的重合程度,选择重合程度最高的语义作为该多义词在给定语境下的含义。下面给定包含“火箭”的句子,利用简化的Lesk算法确定“火箭”在该句中的含义——“NBA球队名”还是“燃气推进装置”。
赛季初的时候,火箭是众望所归的西部决赛球队。
简化的Lesk算法的流程是,首先将待消歧的句子分词并去掉停用词,然后分别统计句子中除“火箭”以外的其它词语在两个语料库中出现的频率之和。将出现频率之和最高的语料库所对应的语义作为多义词的语义。
导入实现算法需要的包
import os
import jieba #导入jieba中文分词库
定义读取语料库的函数。
def read_file(path):
with open(path, 'r', encoding='utf-8') as f:
lines = [_.strip() for _ in f.readlines()]# 读取文件所有行,并去掉首尾字符
return lines
输入待消歧句子并使用jieba库进行分词。
sent = '赛季初的时候,火箭是众望所归的西部决赛球队。'
wsd_word = '火箭'
jieba.add_word(wsd_word)# add_word保证括号内添加的词语不会被分开
sent_words = list(jieba.cut(sent, cut_all=False))# 使用精确模式进行分词,cut_all=True为全模式
去掉待消歧句子中的停用词。
stopwords = [wsd_word, '我', '你', '它', '他', '她', '了', '是', '的', '啊', '谁', '什么','都',\
'很', '个', '之', '人', '在', '上', '下', '左', '右', '。', ',', '!', '?']
sent_cut = []
for word in sent_words:# 对待消歧句子中的词进行循环,依次判断其是否为停用词表中的词
if word not in stopwords:
sent_cut.append(word)
print(sent_cut)# 得到去掉停用词之后的待消歧句子
读取第一步建立的语料库(两个txt文件),将语料库的信息存入字典wsd_dict
中;字典的key为
文件名,对应的value
为文件内容。
wsd_dict = {}
for file in os.listdir('.'):# 读取执行命令的路径下的文件名
if wsd_word in file:# 提取含有多义词的文件名
wsd_dict[file.replace('.txt', '')] = read_file(file)#去掉文件名中的多义词,将剩下的部分作为字典的key
统计待消歧句子中的所有词在语料库中出现的总次数,将词和对应的词频成对写入字典tf_dict
,字典的key
为词,value
为对应的词频。
tf_dict = {}
for meaning, sents in wsd_dict.items():
tf_dict[meaning] = []
for word in sent_cut:# 对待消歧句子中的词进行循环
word_count = 0
for sent in sents:# 对不同的语料库进行循环
example = list(jieba.cut(sent, cut_all=False))# 对语料库中的每一句话进行分词并创建列表
word_count += example.count(word)# 统计列表中该词出现的次数
if word_count:
tf_dict[meaning].append((word, word_count))# 将待消歧句子中的词和对应的词频写入词典
对句子中所有词的词频进行求和,并对所有的和进行从大到小的排序,将最大的和对应的语义作为多义词在待消歧句子中的语义。
sum_tf = []
for k, v in tf_dict.items():
print(k+':')
tf_sum = 0
for item in v:
word = item[0]
tf = item[1]
tf_sum += item[1] #对每个词的频率进行求和
print('%s, 频数为: %s'% (word, tf))
sum_tf.append((k, tf_sum))
sort_array = sorted(sum_tf_idf, key=lambda x:x[1], reverse=True) #对每个语料库的频率之和进行从大到小的排序
true_meaning = sort_array[0][0].split('_')[1]
print('\n经过词义消岐,%s在该句子中的意思为 %s .' % (wsd_word, true_meaning))
运行结果如下:
分词结果: ['赛季', '初', '时候', '众望所归', '西部', '决赛', '球队']
词频统计:
火箭_NBA球队名:
赛季, 频数为: 61
初, 频数为: 1
时候, 频数为: 1
西部, 频数为: 19
决赛, 频数为: 8
球队, 频数为: 41
火箭_燃气推进装置:
初, 频数为: 3
经过词义消岐,“火箭”在待消歧的句子中的意思为“NBA球队名”。
本案例利用基于词典的Lesk算法对包含多义词“火箭”的句子进行了词义消歧。词义消歧是理解句子和篇章的基础,是自然语言处理的一项重要的中间任务。 在使用词典进行词义消歧时,缺点是必须有针对词典的知识获取方法,但这种方法在处理开放式文本词义消歧方面具有明显优势。