netcore6.0 框架解密:开放域实体抽取泛用工具

人气:276 ℃/2023-09-18 02:48:53

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

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

工具原理采用的是开放域实体抽取的方法:

使用各种方法尽可能抽取实体,然后对于候选内容进行置信度分析打分。

基本环境

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工具和结巴分词功能虽然重复,但是暂时还不能移除结巴分词。

前期准备

期待文件夹结构

训练(词语统计)

词语自身属性

语境

训练结果例:

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

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

这里暂时使用频率最高的前5位作为抽取依据。同时为了保证正确率,部分特征的占比必须超过某个阈值。

以下是中文冒号的一个例子,要求前导词占比在40%以上。

(例如前导词A可以正确抽取10个关键字,前导词B可以抽取5个关键字,前导词C可以抽取15个关键字。则前导词A的占比为33%)

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

表格

对于大量表格中的关键字,工具也提供了表格统计的功能。主要是统计一下该关键字的表头标题信息。

同时由于表格中的原始数据可能需要通过参照表格标题才能进行比对的情况,这里支持变换器。

除了统计标题之外,还可以通过某个标题下面出现的内容。

下面的例子是看一下增减持方式有哪些:

[csharp] view plain copy

自然语言处理初步

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

当当 广告

购买

抽取

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

表格抽取工具(内容系)

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

  1. /// <summary>
  2. /// 表抽取规则(内容系)
  3. /// </summary>
  4. public struct TableSearchContentRule
  5. { /// <summary>
  6. /// 匹配内容
  7. /// </summary>
  8. public List<String> Content; /// <summary>
  9. /// 是否相等模式
  10. /// </summary>
  11. public bool IsContentEq;
  12. }

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

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

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

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

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

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

  1. var HoldList = new List<struHoldAfter>();
  2. var StockHolderRule = new TableSearchRule();
  3. StockHolderRule.Name = "股东全称";
  4. StockHolderRule.Title = new string[] { "股东名称", "名称", "增持主体", "增持人", "减持主体", "减持人" }.ToList();
  5. StockHolderRule.IsTitleEq = true;
  6. StockHolderRule.IsRequire = true;
  7. var HoldNumberAfterChangeRule = new TableSearchRule();
  8. HoldNumberAfterChangeRule.Name = "变动后持股数";
  9. HoldNumberAfterChangeRule.IsRequire = true;
  10. HoldNumberAfterChangeRule.SuperTitle = new string[] { "减持后", "增持后" }.ToList();
  11. HoldNumberAfterChangeRule.IsSuperTitleEq = false;
  12. HoldNumberAfterChangeRule.Title = new string[] { "持股股数","持股股数", "持股数量","持股数量", "持股总数","持股总数","股数"
  13. }.ToList();
  14. HoldNumberAfterChangeRule.IsTitleEq = false;
  15. var HoldPercentAfterChangeRule = new TableSearchRule();
  16. HoldPercentAfterChangeRule.Name = "变动后持股数比例";
  17. HoldPercentAfterChangeRule.IsRequire = true;
  18. HoldPercentAfterChangeRule.SuperTitle = HoldNumberAfterChangeRule.SuperTitle;
  19. HoldPercentAfterChangeRule.IsSuperTitleEq = false;
  20. HoldPercentAfterChangeRule.Title = new string[] { "比例" }.ToList();
  21. HoldPercentAfterChangeRule.IsTitleEq = false;
  22. var Rules = new List<TableSearchRule>();
  23. Rules.Add(StockHolderRule);
  24. Rules.Add(HoldNumberAfterChangeRule);
  25. Rules.Add(HoldPercentAfterChangeRule);
  26. var result = HTMLTable.GetMultiInfoByTitleRules(root, Rules, false);

EntityProperty对象

EntityProperty对象属性如下:

简单关键字抽取

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

实体位置体系

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

  1. /// <summary>
  2. /// 位置和值
  3. /// </summary>
  4. public struct LocAndValue<T>
  5. { /// <summary>
  6. /// HTML整体位置
  7. /// </summary>
  8. public int Loc; /// <summary>
  9. /// 开始位置
  10. /// </summary>
  11. public int StartIdx; /// <summary>
  12. /// 值
  13. /// </summary>
  14. public T Value; /// <summary>
  15. /// 类型
  16. /// </summary>
  17. public string Type;
  18. }

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

百科

More+
首页/电脑版/网名
© 2026 NiBaKu.Com All Rights Reserved.