匹配首字母缩写词与他们的长格式

时间:2019-03-28 18:27:16

标签: python text-extraction

尝试将首字母缩写词与其含义进行匹配-首字母缩写词和含义都在同一文档中,通常彼此之间相距不远。

例如此文本示例:

  
    

(b)表示在紧接生效时间之前发行和发行在外的每股美国存托凭证,代表两股A类股份(每张“美国存托凭证”)(如果有的话,代表除外股份的ADS除外)交换有权收取每份美国存托股份12.25美元现金的利息(“每笔美国存托股份合并对价”(减去每笔美国存托股份注销费0.05美元),该权利应根据存款协议中规定的条款和条件进行支付,以此类美国存托凭证为代表的A类股份应予注销,并不再存在,以换取保存人作为其登记持有人收取每股合并对价的权利,由保存人将其分配给以下美国存托凭证持有人:根据本协议和存款协议中规定的条款和条件进行的每ADS合并对价(每ADS注销费用减去0.05美元);前提是,如果本协议与存款协议发生任何冲突,则以本协议为准;

  

首字母缩写是“ ADS”,其含义是“美国存托股份”。

我开始基于对首字母缩略词进行标记化来构建正则表达式,因此它看起来像"[A].+?[D].+?[S].+?\b",并且适用于上面的示例,但我正在寻找更多的“ python-y” < / strong>的方式,因为我看到的首字母缩写类型有所不同。

示例:

1)根据本协议中规定的条款和条件,并根据开曼群岛的公司法(2018年修订)(以下简称“ CICL”), CLCI但不是CICL

2)公司SEC报告中包含或通过引用并入的每份合并财务报表(包括每种情况下的任何附注)均根据美国普遍接受的会计准则编制>(“ GAAP”)-大写字母与小写字母,并且还要添加美国。

1 个答案:

答案 0 :(得分:0)

有几种正则表达式格式可以匹配这些确切的规范,它们是根据文本中现有的缩写词动态创建的。问题在于,试图为开曼群岛的 公司法(2018年修订) 匹配各种格式,例如 CICL 意味着正则表达式应在公司法律开曼岛屿之间寻找扩展词,并且之所以通用,是因为可能是 财政部和地区及州政府收购事务部 的扩展版,但您永远都不知道是什么情况。因此,如果我要搜索MFTRSA,并且有一个类似 m的短语,则其他人问f而不是t o r aise s a意识 ,那么显然这将是一个匹配项

在脚本结尾,您将得到类似以下内容的信息: {'ADS': ('American Depositary Share', 9)}显示了用来检测长文本,长版本和长文本的起始索引的缩写。此外,您还将获得首字母缩写词。

from collections import defaultdict
from itertools import permutations
import re

ACRONYM_PATTERN = "[A-Z]{2,}"

text = "in the Ministry of Noodles (cooked 1808) and External Amicalities ordonance 46 has been ratified because the Chief Hunter Gatherer also known as CHG found a SGC in the Left Chamber (LC) in the second part of the trimestrial chicken fight. the CHG also aclaimed that the members of the MNEA are no longer fit to eat noodles because the LC's color had turned into green. Long live the queen and may the MNEA get morphed into a duck!"


# detect all acronyms in the text
detected_acronyms = re.finditer(ACRONYM_PATTERN, text)
detected_acronyms_indexes = defaultdict(list)

for a in detected_acronyms:
    detected_acronyms_indexes[a.group()].append(a.start())

acronyms_set = set(detected_acronyms_indexes.keys())

x = []

# create regex patterns for all acronyms
acronyms_patterns = defaultdict(list)
for acronym in acronyms_set:
    # uppercase strict pattern
    words = "".join([r"[{}]\w+ ".format(c) for c in acronym])
    pattern = "{}".format(words)
    acronyms_patterns[acronym].append(pattern.strip())

    # uppercase extended pattern
    words = []
    acronym_len = len(acronym)
    for i, c in enumerate(acronym):
        word = r"[{}]\w+ ".format(c)
        if i + 1 < acronym_len:
            word += "(?:[a-zA-Z0-9\(\)]+ ){0,3}"
        words.append(word)

    pattern = "{}".format("".join(words))
    acronyms_patterns[acronym].append(pattern.strip())

    # lowercase strict
    words = "".join([r"[{}]\w+ ".format(c) for c in acronym.lower()])
    pattern = "{}".format(words)
    acronyms_patterns[acronym].append(pattern.strip())

    # lowercase extended pattern
    words = []
    acronym_len = len(acronym)
    for i, c in enumerate(acronym.lower()):
        word = r"[{}]\w+ ".format(c)
        if i + 1 < acronym_len:
            word += "(?:[a-zA-Z0-9\(\)]+ ){0,3}"
        words.append("".join(word))

    pattern = "{}".format("".join(words))
    acronyms_patterns[acronym].append(pattern.strip())

# use the patterns to detect the longer versions in the text
original_text_indexes = {}
for acronym, patterns_list in acronyms_patterns.items():
    for pattern in patterns_list:
        result = re.search(pattern.replace("\\\\", "\\"), text)

        if result is None:
            continue

        original_text_indexes[acronym] = (result.group(), result.start())

print("Detected long versions")
print(original_text_indexes)

print("\nUnmatched acronyms")
print(acronyms_set.difference(set(original_text_indexes.keys())))