词义消除歧义NLP项目实验

本项目主要使用https://github.com/alvations/pywsd 中的pywsd库来实现词义消除歧义

目前,该库一部分已经移植到了nltk中,为了获得更好的性能WSD,而不是使用的NLTK模块pywsd库。一般来说,从pywsdsimple_lesk()NLTKlesk好。当我有空时,我会尽量更新NLTK模块。在本文档中主要介绍原pywsd库的使用。

一、使用的技术:

  • Lesk 算法

  • Original Lesk (Lesk, 1986)
  • Adapted/Extended Lesk (Banerjee and Pederson, 2002/2003)
  • Simple Lesk (with definition, example(s) and hyper+hyponyms)
  • Cosine Lesk (use cosines to calculate overlaps instead of using raw counts)
  • Path similarity (Wu-Palmer, 1994; Leacock and Chodorow, 1998)
  • Information Content (Resnik, 1995; Jiang and Corath, 1997; Lin, 1998)
  • 基线

  • Random sense
  • First NLTK sense
  • Highest lemma counts

二、使用方法:

安装:

pip install -U nltk
python -m nltk.downloader 'popular'
pip install -U pywsd

使用:

from pywsd.lesk import simple_lesk   #引入pywsd库
sent = 'I went to the bank to deposit my money' #设定包含具有多义的词的句子
ambiguous = 'bank' #设定多义的词语
answer = simple_lesk(sent, ambiguous, pos='n') #设置answer的参数,将句子与词进行判断
print (answer.definition()) #打印出答案

三、原理

词义消岐,英文名称为Word Sense Disambiguation,英语缩写为WSD,LESK算法是词义消歧的主要算法。

LESK算法是以一种以TF-IDF为权重的频数判别算法,主要流程可以简述为:

  • 去掉停用词
  • 统计出该词以外的TF-IDF值
  • 累加起来,比较多个义项下这个值的大小,值越大说明是该句子的义项

下面以NBA火箭队为示例来简要实现一下lesk算法:

import os
import jieba
from math import log2

# 读取每个义项的语料
def read_file(path):
with open(path, 'r', encoding='utf-8') as f:
lines = [_.strip() for _ in f.readlines()]
return lines

# 对示例句子分词
sent = '赛季初的时候,火箭是众望所归的西部决赛球队。'
wsd_word = '火箭'

jieba.add_word(wsd_word)
sent_words = list(jieba.cut(sent, cut_all=False))

# 去掉停用词
stopwords = [wsd_word, '我', '你', '它', '他', '她', '了', '是', '的', '啊', '谁', '什么','都',\
'很', '个', '之', '人', '在', '上', '下', '左', '右', '。', ',', '!', '?']

sent_cut = []
for word in sent_words:
if word not in stopwords:
sent_cut.append(word)

print(sent_cut)


# 计算其他词的TF-IDF以及频数
wsd_dict = {}
for file in os.listdir('.'):
if wsd_word in file:
wsd_dict[file.replace('.txt', '')] = read_file(file)

# 统计每个词语在语料中出现的次数
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))

idf_dict = {}
for word in sent_cut:
document_count = 0
for meaning, sents in wsd_dict.items():
for sent in sents:
if word in sent:
document_count += 1

idf_dict[word] = document_count

# 输出值
total_document = 0
for meaning, sents in wsd_dict.items():
total_document += len(sents)

# 计算tf_idf值
mean_tf_idf = []
for k, v in tf_dict.items():
print(k+':')
tf_idf_sum = 0
for item in v:
word = item[0]
tf = item[1]
tf_idf = item[1]*log2(total_document/(1+idf_dict[word]))
tf_idf_sum += tf_idf
print('%s, 频数为: %s, TF-IDF值为: %s'% (word, tf, tf_idf))

mean_tf_idf.append((k, tf_idf_sum))

sort_array = sorted(mean_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))

结果如下:

['赛季', '初', '时候', '众望所归', '西部', '决赛', '球队']
火箭_燃气推进装置:
初, 频数为: 2, TF-IDF值为: 12.49585502688717
火箭_NBA球队名:
赛季, 频数为: 63, TF-IDF值为: 204.6194333469459
初, 频数为: 1, TF-IDF值为: 6.247927513443585
时候, 频数为: 1, TF-IDF值为: 8.055282435501189
西部, 频数为: 16, TF-IDF值为: 80.88451896801904
决赛, 频数为: 7, TF-IDF值为: 33.13348038429679
球队, 频数为: 40, TF-IDF值为: 158.712783770034
经过词义消岐,火箭在该句子中的意思为 NBA球队名 .

又如:

输入句子:三十多年前,战士们在戈壁滩白手起家,建起了我国的火箭发射基地。

['三十多年', '前', '战士', '们', '戈壁滩', '白手起家', '建起', '我国', '发射', '基地']
火箭_燃气推进装置:
前, 频数为: 2, TF-IDF值为: 9.063440958888354
们, 频数为: 1, TF-IDF值为: 6.05528243550119
我国, 频数为: 3, TF-IDF值为: 22.410959804340102
发射, 频数为: 89, TF-IDF值为: 253.27878721862933
基地, 频数为: 7, TF-IDF值为: 42.38697704850833
火箭_NBA球队名:
前, 频数为: 3, TF-IDF值为: 13.59516143833253
们, 频数为: 1, TF-IDF值为: 6.05528243550119

经过词义消岐,火箭在该句子中的意思为 燃气推进装置 .

概述:输入的文段或者句子,之后,将分割好的该词的释义进行分割,形成几个词。而后,在每个文段和句子中计算被分割词的个数,然后算出TF-IDF的值,计算哪个TF-IDF的值最大,为更适用于该释义。

四、改进

对于代码本身,可以做到一点点进步的优化,算法上的优化可以做到更大的跨越,如http://www.doc88.com/p-9959426974439.html这篇文章提到的lesk算法的改进。

对于lesk算法的缺点,释义的判断很容易被相同TF-IDF的值误扰,即权值相同的情况。

词义消除歧义NLP项目实验的更多相关文章

  1. NLP项目

    GitHub NLP项目:自然语言处理项目的相关干货整理 自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域.本文作者为自然语言处理NLP初学者整理了 ...

  2. jenkins的流水线pipeline+项目实验php

    声明:实验环境使用Jenkins的应用与搭建的环境 新建一个流水线 pipeline脚本语法架构 node('slave节点名'){ def 变量 #def可以进行变量声明 stage('阶段名A') ...

  3. 用typename和template消除歧义

  4. 当引入的类库存在一个类型时,提示“xxx”和“xxx”之间的不明确引用时,消除歧义的方法

    //using _2_命名空间和程序集.WidgetA; //using _2_命名空间和程序集.WidgetB; using System; using System.Collections.Gen ...

  5. 201671010426 孙锦喆 实验十四 团队项目评审&课程学习总结

    徐明锦 徐明锦 2 95 2019-06-30T14:54:00Z 2019-06-30T14:54:00Z 9 608 3472 28 8 4072 14.00 Clean Clean false ...

  6. 201671010418 刘佳 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 (1)掌握软件项目评审会流程: (2)反思总结课程学习内容. Start: ...

  7. 优质中文NLP资源集合,做项目一定用得到!

    今天要给大家在推荐 Github 上一个优质的中文 NLP 工具和资源集合项目——funNLP,已经获得了 5.3k Stars,1k+ Forks. 项目作者 杨洋,一枚水博&互联网民工,目 ...

  8. 201871030131-谢林江 实验二 个人项目—《D{0-1} KP》项目报告

    项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.学习编写PSP2.完成个人项目实验要求3.在Github建仓 这个作业在哪些方面帮助我实现学习目标 1.首次编 ...

  9. NLP相关问题中文本数据特征表达初探

    1. NLP问题简介 0x1:NLP问题都包括哪些内涵 人们对真实世界的感知被成为感知世界,而人们用语言表达出自己的感知视为文本数据.那么反过来,NLP,或者更精确地表达为文本挖掘,则是从文本数据出发 ...

随机推荐

  1. git 常规业务场景 使用

    一般每个开发者都会有个自己的分支,有个test分支,合并代码用,两条分支相互备份,就算merge的时候被覆盖,也不用担心 建立自己的分支 // 创建本地分支, git checkout -b dev_ ...

  2. Spring中的循环依赖解决详解

    前言 说起Spring中循环依赖的解决办法,相信很多园友们都或多或少的知道一些,但当真的要详细说明的时候,可能又没法一下将它讲清楚.本文就试着尽自己所能,对此做出一个较详细的解读.另,需注意一点,下文 ...

  3. 天眼查sign 算法破解

    天眼查sign 算法破解 最近真的在sign算法破解上一去不复返 前几天看过了企查查的sign破解 今天再看看天眼查的sign算法破解,说的好(zhuang)点(bi)就是破解,不好的就是这是很简单的 ...

  4. oauth2.0授权详解

    学习oauth认证之前先回顾一下通过sessionid的会话过程 关于session与cookie的请戳:https://www.cnblogs.com/moran1992/p/10793748.ht ...

  5. 读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」

    0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.PYTHON开发利器之VS Code之 ...

  6. Codeforces 814D

    题意略. 思路: 由于不重合这个性质,我们可以将每一个堆叠的圆圈单独拿出来考虑,而不用去考虑其他并列在同一层的存在, 在贪心解法下,发现,被嵌套了偶数层的圆圈永远是要被减去的,而奇数层的圆圈是要加上的 ...

  7. python 生成式,生成器,迭代器,可迭代

    1.生成器就是迭代器2.生成式用[](中括号)包起来,生成器用()(圆括号)包起来3.生成式在使用前已经在内存中存在,生成器只有在使用时才生成4.迭代器是可以用.__next__()不断取出下一值,直 ...

  8. ES6之模块化导入导出

    1.概述 在js的历史上一直没有模块(module)体系,无法将一个大程序拆分成相互依赖的小文件,再用简单的方法拼装起来,这对开发大型的.复杂的项目形成了巨大障碍. 在 ES6 之前,社区制定了一些模 ...

  9. 01-python3基础-基本数据类型

    Python3 基本数据类型 标准数据类型 Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Set(集合) Diction ...

  10. mysql8.0版本下命令行mysqld –skip-grant-tables 失效,无法登陆的问题

    1.管理员权限登陆cmd,不会使用管理员登陆的请搜索cmd,搜索结果右键. 2.命令行输入:net stop mysql;然后提示.服务停止中 --> 服务已停止,如出现其他错误请百度. 这只是 ...