[开源]开放域实体抽取泛用工具 NetCore2.1

开放域实体抽取泛用工具

https://github.com/magicdict/FDDC

更新时间 2018年7月16日 By 带着兔子去旅行

开发这个工具的起源是天池大数据竞赛,FDDC2018金融算法挑战赛02-A股上市公司公告信息抽取。这个比赛是针对金融公告开展的信息抽取比赛。在参赛过程中,萌生出一个念头,是否能够开发出一个泛用的信息抽取工具呢?

信息抽取是NLP里的一个实用内容。该工具的目标是打造一个泛用的自动信息抽取工具。使得没有任何基础的用户,可以通过简单的步骤提取文档(PDF,HTML,TXT)中的信息。该工具使用C#(.Net Core)开发,所以可以跨平台运行。(Python在做大的工程的时候有诸多不便,所以没有使用python语言)

工具原理采用的是开放域实体抽取的方法:
使用各种方法尽可能抽取实体,然后对于候选内容进行置信度分析打分。

640?wx_fmt=png

基本环境

  • .NetCore2.1

  • LTP组件:哈工大LTP3.3.2版

  • PDF转TXT工具 pdfminer

  • 分词系统:结巴分词

ltp工具:哈工大LTP工具(ltp.ai)提供的ltp工具,最新版为3.3.4.该工具在windows,max,centos上,srl的训练可能无法正常完成。(dp,ner阶段没有问题)所以这里使用了3.3.2版本。ltp工具的SRL结果中包含了DP和NER的内容,但是暂时保留DP和NER中间XML文件。

pdfminer:请注意处理中文的时候需要额外的步骤,具体方法不再赘述。部分PDF可能无法正确转换,原因CaseByCase。

结巴分词:某些地名,例如"大连",会被误判。这里使用地名辅助字典的方式做纠正。ltp工具没有这个问题。ltp工具和结巴分词功能虽然重复,但是暂时还不能移除结巴分词。

前期准备

  • 使用pdfminer将PDF文件转化为Txt文件

  • 使用哈工大LTP工具,将Txt文件转换为NER,DP,SRL的XML文件

期待文件夹结构

  • html(存放HTML文件目录)

  • pdf(存放PDF文件目录)

  • txt(存放TXT文件目录)

  • dp(存放LTP的DP结果XML目录)

  • ner(存放LTP的NER结果XML目录)

  • srl(存放LTP的SRL结果XML目录)

训练(词语统计)

  • 分析待提取信息自身的特征

  • 分析待提取信息周围语境的特征(LTP工具)

  • 构建置信度体系

词语自身属性

  • 长度

  • 包含词数

  • 首词词性(POS)

  • 词尾

语境

  • 该关键字在 :(中文冒号)之后的场景下,:(中文冒号)前面的内容

  • 包含该关键字的句子中,该关键字的前置动词

  • 包含该关键字的句子中,该关键字是否在角色标识中存在

训练结果例:

协议书(5.180388%)[56]
协议(11.84089%)[128]
合同(58.55689%)[633]
合同书(2.960222%)[32]
买卖合同(3.792784%)[41]
承包合同(12.0259%)[130]
意向书(0.2775208%)[3]
补充协议(1.110083%)[12]
项目(0.2775208%)[3]
书(0.9250694%)[10]
议案(0.2775208%)[3]
)(0.8325624%)[9]

(更多规则持续加入中,同时对于相关度低的规则也会剔除)

这里暂时使用频率最高的前5位作为抽取依据。同时为了保证正确率,部分特征的占比必须超过某个阈值。
以下是中文冒号的一个例子,要求前导词占比在40%以上。
(例如前导词A可以正确抽取10个关键字,前导词B可以抽取5个关键字,前导词C可以抽取15个关键字。则前导词A的占比为33%)

        e.LeadingColonKeyWordList = ContractTraning.ContractNameLeadingDict.Where((x) => { return x.Value >= 40; })    //阈值40%以上.Select((x) => { return x.Key + ":"; }).ToArray();

表格

对于大量表格中的关键字,工具也提供了表格统计的功能。主要是统计一下该关键字的表头标题信息。
同时由于表格中的原始数据可能需要通过参照表格标题才能进行比对的情况,这里支持变换器。

640?wx_fmt=png

除了统计标题之外,还可以通过某个标题下面出现的内容。
下面的例子是看一下增减持方式有哪些:

640?wx_fmt=png

自然语言处理初步

作者:(日)荒木健治 著,徐金安 译

当当 广告
购买


抽取

采用各种方法抽取数据,务必使得所有数据都抽取出来。根据训练结果从候选值里面获得置信度最大的数据。抽取手段如下:

  • 具有明确先导词

  • NER实体标识

  • 具体语境

表格抽取工具(内容系)

代码内置表头规则系的表抽取工具,对于表格可以设定如下抽取规则:

  • Content:匹配内容

  • IsContentEq:内容匹配规则(包含或者相等)

    /// <summary>/// 表抽取规则(内容系)/// </summary>public struct TableSearchContentRule{        /// <summary>/// 匹配内容/// </summary>public List<String> Content;        /// <summary>/// 是否相等模式/// </summary>public bool IsContentEq;}

下面是一个表格抽取的例子:

        var rule = new TableSearchContentRule();rule.Content = new string[] { "集中竞价交易", "竞价交易", "大宗交易", "约定式购回" }.ToList();rule.IsContentEq = true;        var result = HTMLTable.GetMultiRowsByContentRule(root,rule);

表格抽取工具(表头规则系)

代码内置表头规则系的表抽取工具,对于表格可以设定如下抽取规则:

  • SuperTitle:层叠表头的情况下,父表头文字

  • IsSuperTitleEq:父表头文字匹配规则(包含或者相等)

  • Title:表头文字

  • IsTitleEq:表头文字匹配规则(包含或者相等)

  • IsRequire:在行单位抽取时,该项目是否为必须项目

  • ExcludeTitle:表标题不能包含的文字

  • Normalize:抽取内容预处理器

下面是一个表格抽取的例子:

这里我们想抽取持股比例和持股数,但是希望抽取的是增持后的部分,所以需要使用SuperTitle的规则了。

        var HoldList = new List<struHoldAfter>();   
            var StockHolderRule = new TableSearchRule();StockHolderRule.Name = "股东全称";StockHolderRule.Title = new string[] { "股东名称", "名称", "增持主体", "增持人", "减持主体", "减持人" }.ToList();StockHolderRule.IsTitleEq = true;StockHolderRule.IsRequire = true;    
       var HoldNumberAfterChangeRule = new TableSearchRule();HoldNumberAfterChangeRule.Name = "变动后持股数";HoldNumberAfterChangeRule.IsRequire = true;HoldNumberAfterChangeRule.SuperTitle = new string[] { "减持后", "增持后" }.ToList();HoldNumberAfterChangeRule.IsSuperTitleEq = false;HoldNumberAfterChangeRule.Title = new string[] {             "持股股数","持股股数",             "持股数量","持股数量",             "持股总数","持股总数","股数"}.ToList();HoldNumberAfterChangeRule.IsTitleEq = false;      
       var HoldPercentAfterChangeRule = new TableSearchRule();HoldPercentAfterChangeRule.Name = "变动后持股数比例";HoldPercentAfterChangeRule.IsRequire = true;HoldPercentAfterChangeRule.SuperTitle = HoldNumberAfterChangeRule.SuperTitle;HoldPercentAfterChangeRule.IsSuperTitleEq = false;HoldPercentAfterChangeRule.Title = new string[] { "比例" }.ToList();HoldPercentAfterChangeRule.IsTitleEq = false;      
        var Rules = new List<TableSearchRule>();Rules.Add(StockHolderRule);Rules.Add(HoldNumberAfterChangeRule);Rules.Add(HoldPercentAfterChangeRule);      
       var result = HTMLTable.GetMultiInfoByTitleRules(root, Rules, false);

EntityProperty对象

EntityProperty对象属性如下:

  • PropertyName:属性名称

  • PropertyType:属性类型(数字,金额,字符,日期)

  • MaxLength:最大长度

  • MinLength:最小长度

  • MaxLengthCheckPreprocess:最大长度判定前预处理器(不改变抽取内容)

  • LeadingColonKeyWordList:先导词(包含":")

  • LeadingColonKeyWordCandidatePreprocess:先导词预处理器(改变抽取内容

  • QuotationTrailingWordList:引号和书名号中的词语

  • DpKeyWordList:句法依存环境

  • ExternalStartEndStringFeature:普通的开始结尾词判定

  • CandidatePreprocess:一般候选词预处理器(改变抽取内容

  • struRegularExpressFeature:正则表达式特征检索条件

  • ExcludeContainsWordList:不能包含词语列表

  • ExcludeEqualsWordList:不能等于词语列表

  • Confidence:置信度对象

640?wx_fmt=png

简单关键字抽取

对于一些及其简单的关键字抽取,例如,出现"现金认购",则将认购方法标记为"现金",则可以使用KeyWordMap属性即可。

640?wx_fmt=png

实体位置体系

在寻在实体的时候,尽可能的将找到的实体及其位置进行记录,下面的结构体则是一个实体的记录。

    /// <summary>/// 位置和值/// </summary>public struct LocAndValue<T>{        /// <summary>/// HTML整体位置/// </summary>public int Loc;        /// <summary>/// 开始位置/// </summary>public int StartIdx;        /// <summary>////// </summary>public T Value;        /// <summary>/// 类型/// </summary>public string Type;}

下面则是一个实体位置的应用。公司里面放着所有公司实体的位置,标的则放着百分比 + “股权”字样的实体。通过位置信息,则可以将“公司”和“标的”成对发现。

640?wx_fmt=png

参考文献

  • 自然语言处理和信息抽取

鸣谢

  • 感谢阿里巴巴组委会提供标注好的金融数据。

  • 感谢组委会@通联数据_梅洁,@梅童的及时答疑。

  • 感谢微信好友 邓少冬 潘昭鸣 NLP宋老师 的帮助和指导

原文地址https://www.cnblogs.com/TextEditor/p/9322845.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客-牛牛的猜球游戏

正题 题目链接:https://ac.nowcoder.com/acm/contest/7605/B 题目大意 101010个数&#xff0c;nnn个操作交换两个位置的数。mmm次询问操作一段区间后的序列。 解题思路 处理出fi,jf_{i,j}fi,j​表示处理了前iii个第jjj位的是哪个数。然后拿fl−1f_{l-1}fl−1​和frf_rfr​一一…

【DP】树塔狂想曲

树塔狂想曲 题目大意&#xff1a; 有一个数字金字塔&#xff0c;让你求出去掉一个点后&#xff0c;从最顶端走到最低端的最大值&#xff08;只能往下或右下走&#xff09; 原题: 题目描述 相信大家都在长训班学过树塔问题&#xff0c;题目很简单求最大化一个三角形数塔从上…

CF438D-The Child and Sequence【线段树】

正题 题目链接:https://www.luogu.com.cn/problem/CF438D 题目大意 一个序列要求支持 区间求和区间取模单点修改 解题思路 对于一个数取模会有结果x%p{x≤⌊x2⌋xx\% p\{\begin{matrix}x\leq \lfloor\frac{x}{2}\rfloor\\x\end{matrix}x%p{x≤⌊2x​⌋x​ 也就是一个数最多…

主席树学习笔记

主席树学习笔记 说在前边&#xff1a; 之前了解过主席树的基础的思想&#xff0c;但是没有系统学习过&#xff0c;所以打算通过一些题目重新学习。POJ2104 题意&#xff1a;静态区间查询 k-th number思路&#xff1a;对每个位置开一颗权值线段树&#xff0c;维护前缀区间每个数…

初一模拟赛总结(2019.5.25)

成绩&#xff1a; 本蒟蒻竟AKAKAK了&#xff0c;不敢相信 &#xff89;)&#xff9f;Д&#xff9f;( rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf400400400100100100100100100100100100100100100222hkyhkyhky3203203201001001001001001006…

.NET Core开发日志——HttpClientFactory

当需要向某特定URL地址发送HTTP请求并得到相应响应时&#xff0c;通常会用到HttpClient类。该类包含了众多有用的方法&#xff0c;可以满足绝大多数的需求。但是如果对其使用不当时&#xff0c;可能会出现意想不到的事情。博客园官方团队就遇上过这样的问题&#xff0c;国外博主…

YbtOJ#20067-[NOIP2020模拟赛B组Day5]糖果分配【dp】

正题 题目链接:http://noip.ybtoj.com.cn/contest/102/problem/1 题目大意 nnn个xix_ixi​在[li,ri][l_i,r_i][li​,ri​]中随机选择&#xff0c;给出一个ccc&#xff0c;一个序列∑kic\sum k_ic∑ki​c 每种方案贡献为∏i1nxiki\prod_{i1}^nx_i^{k_i}i1∏n​xiki​​ 解题思路…

Wannafly挑战赛18

Wannafly挑战赛18 A. 序列 先考虑暴力&#xff0c;相邻两个树之间乘上给定的三种数&#xff0c;递推出下一个位置填什么&#xff0c;然后再check一下&#xff0c;最后一位是否为1即可。这样时间显然不行&#xff0c;但是给我们一种思路&#xff0c;就是中间的转换关系&#xff…

【拓扑排序】【DP】旅行计划(luogu 1137)

旅行计划 luogu 1137 题目大意&#xff1a; 有一堆点&#xff0c;之间连接着一些边&#xff08;有向&#xff09;&#xff0c;保证无环&#xff0c;现在要求出从任意地方出发到所有点的最长路&#xff08;出发点不一定相同&#xff09; 原题&#xff1a; 题目描述 小明要…

【asp.net Core MVC + angular6实战】 - 1. 环境搭建

为什么打算写这些文章&#xff1f;没有为什么&#xff0c;只是为了学习Angular和更了解.Net Core等技术需要用到的技术&#xff1f;后端使用.Net Core 2.1 EF Core 2.1 Mysql 5.7 Identity &#xff08;不知道Identity算不算一个独立的技术点&#xff09;前端主要使用的是An…

YbtOJ#20070-[NOIP2020模拟赛B组Day5]诗人小K【状压dp】

正题 题目链接:http://noip.ybtoj.com.cn/contest/102/problem/4 题目大意 求有多少个长度为nnn的序列aaa满足1≤ai≤101\leq a_i\leq 101≤ai​≤10&#xff0c;且可以找到一组(i,j,k,l)(i,j,k,l)(i,j,k,l)使得(∑pij−1apx)&(∑pjk−1apy)&(∑pklapz)(\sum_{pi}^{j…

Codeforces Round #491 (Div. 2)

Codeforces Round #491 (Div. 2) A. If at first you dont succeed... 按题意判断 #include <bits/stdc.h> #define rep(i,a,b) for(int ia;i<b;i) #define pb push_back #define mem(W) memset(W,0,sizeof(W)) typedef long long ll; inline int read() {char cgetch…

学习分享会(2019.5.31)

学习分享会 First&#xff08;初三大佬发言&#xff09; 初三大佬在为初二大佬讲一堆哲学的道理&#xff0c;虽然十分高深&#xff0c;但还是听懂了一点点 Second&#xff08;初二大佬发言&#xff09; 初二大佬开始“秀”&#xff0c;首先是大佬LW讲了讲十分常识的东西&am…

微软宣布公开预览Dev Spaces for AKS

微软宣布公开预览面向Azure Kubernetes Services&#xff08;AKS&#xff09;的Dev Spaces&#xff0c;为团队提供了一种快速的Kubernetes迭代开发体验。该版本是继5月份Build 2018大会上Dev Spaces内部预览之后的版本。借助这个版本&#xff0c;微软希望为开发人员提供一种在A…

YbtOJ#20068-[NOIP2020模拟赛B组Day5]连通子图【构造】

正题 题目链接:http://noip.ybtoj.com.cn/contest/102/problem/2 题目大意 求构造一个包含根节点的联通子图kkk个的树。 解题思路 现在考虑一棵树&#xff0c;如果我们在根节点处加一个点&#xff0c;那么方案数会2\times 22。如果在根节点上加入一个父节点&#xff08;根会…

2018 ACM-ICPC World Finals - Beijing

2018 ACM-ICPC World Finals - Beijing A. Catch the Plane \(dp[v_i,t_i]\)表示时刻\(t_i\)在\(v_i\)点&#xff0c;到达终点的最大概率&#xff0c;那么转移方程为&#xff1a;\(dp[(v_i,t_i)] max(P_{ij}*dp[(v_{j1},t_{j1})] (1-Pij)*dp[(v_{i1},t_{i1})])\)\(dp[(v_i,t_…

解析Visual C# 7.2中的private protected访问修饰符

去年12月份&#xff0c;随着Visual Studio 2017 Update 15.5的发布&#xff0c;Visual C#迎来了它的最新版本&#xff1a;7.2. 在这个版本中&#xff0c;有个让人难以理解的新特性&#xff0c;就是private protected访问修饰符&#xff08;Access Modifier&#xff09;。至此&a…

【Floyed】廉价最短路径

廉价最短路径 题目大意&#xff1a; 一个图中&#xff0c;在满足最短路的前提下&#xff0c;求最小代价 原题&#xff1a; 题目描述 图是由一组顶点和一组边组成的。一条边连接两个顶点。例如&#xff0c;图1表示了一个有4个顶点V、5条边的图。图中&#xff0c;每条边e是有…

CF401C-Team【构造】

正题 题目链接:https://www.luogu.com.cn/problem/CF401C 题目大意 构造一个序列包含nnn个000和mmm个111且不含有连续两个000和连续三个111。 解题思路 考虑用110110110和101010来构造序列即可。 codecodecode #include<cstdio> #include<cstring> #include<…

哈希学习笔记

hash学习笔记 常用函数: $ hash[i] \sum _{ji} ^{len-1} {s[j]*X^{j-i}}, X ≥ |字符集| $ 取多个模&#xff0c;对于一个子串\(s[i]s[i1]..s[j]\)的\(hash hash[i] - hash[j1]*X^{j-i1}\)&#xff0c;预处理\(hash[i]\)以及\(X^i\)即可\(O(1)\)求出所有的子串hash值一般运用…