粗读Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks(关系抽取)

本文探讨了关系抽取在构建知识图谱中的关键作用,介绍了远程监督这一热点方法,并详细解析了通过使用PCNN结合多实例学习解决远程监督下错误标签问题的创新方案。

关系抽取的论文粗读1

原文:www.emnlp2015.org/proceedings/EMNLP/pdf/EMNLP203.pdf

代码链接

https://github.com/ShomyLiu/pytorch-pcnn

https://github.com/pencoa/PCNN

what 

背景:关系抽取是一类经典的 NLP 任务,也是构建高质量知识图谱的基础,针对关系抽取的研究工作非常多,远程监督是研究中的热点方法。

在这篇论文之前,主要有两类关系分类的思路:

1. 基于特征的方法,这种方式对人工特征向量的要求较高,需要为数据集找出一种合适的特征表示。 
2. 基于kernel的方法,这种方式可以对输入进行丰富的表示,例如句法树。它能够通过核函数来提特征,当然也有很多核函数被提出,例如:convolution tree kernel,subsequence kernel,dependency tree kernel

how

  1. 提出使用PCNN来自动提取特征。
  2. 往PCNN中加入multi-instance learning,用来解决远程监督引发的错误标签问题。
  3. 提出分段进行max pooling,从而考虑两个Entity之间的结构特征。

四个部分:

Vector representation、Convolution、Piecewise max pooling、Softmax classifier.,参见网络结构图。

 

 

感谢与主要参考:

关系抽取阅读小组

远程监督关系抽取-论文解读https://zhuanlan.zhihu.com/p/39885744

Distant Supervision for Relation Extraction via Piecewise Convolutional Neural Networks

https://blog.youkuaiyun.com/dalangzhonghangxing/article/details/80298755

以下是一个简单的关系抽取代码,使用的是distant supervision方法。这个方法是使用预先定义的知识库中的实体和关系标签,将它们对应到包含这些实体的句子中,然后从中提取特征并训练模型进行关系抽取。这种方法可以利用大规模的知识库和文本语料库,但也存在标注错误和知识库不完备等问题。 ```python import os import re import numpy as np import pandas as pd import torch import torch.nn as nn from transformers import AutoTokenizer, AutoModel # 设置随机种子,以便复现结果 seed = 1234 np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) # 加载预训练的tokenizer和model tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased') model = AutoModel.from_pretrained('bert-base-uncased') # 加载数据 data_dir = 'data' train_df = pd.read_csv(os.path.join(data_dir, 'train.csv')) test_df = pd.read_csv(os.path.join(data_dir, 'test.csv')) # 定义正则表达式,以从句子中提取实体和关系标签 entity_regex = re.compile(r'<e>(.*?)<\/e>') relation_regex = re.compile(r'<r>(.*?)<\/r>') # 将句子中的实体替换为特殊标记 def replace_entities(sentence, entities): for entity in entities: sentence = sentence.replace(entity, '<e>' + entity + '</e>') return sentence # 将句子中的关系替换为特殊标记 def replace_relation(sentence, relation): return sentence.replace(relation, '<r>' + relation + '</r>') # 将句子转换为tokens,并使用特殊的CLS和SEP token def tokenize(sentence): tokens = tokenizer.tokenize(sentence) tokens = ['[CLS]'] + tokens + ['[SEP]'] return tokens # 将tokens转换为IDs def convert_to_ids(tokens): input_ids = tokenizer.convert_tokens_to_ids(tokens) return input_ids # 将tokens对齐到指定长度,并在不足长度时用0填充 def pad_sequence(sequence, max_len): if len(sequence) < max_len: sequence += [0] * (max_len - len(sequence)) else: sequence = sequence[:max_len] return sequence # 为数据集创建一个Dataset类,用于在训练时读取数据 class RelationExtractionDataset(torch.utils.data.Dataset): def __init__(self, df): self.df = df def __len__(self): return len(self.df) def __getitem__(self, index): row = self.df.iloc[index] sentence = row['sentence'] entities = row['entities'].split(',') relation = row['relation'] # 将实体替换为特殊标记 sentence = replace_entities(sentence, entities) # 将关系替换为特殊标记 sentence = replace_relation(sentence, relation) # 将句子转换为tokens tokens = tokenize(sentence) # 将tokens转换
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值