【问题标题】:Matching Acronyms to their long form将首字母缩略词与其长形式匹配
【发布时间】:2019-03-28 18:27:16
【问题描述】:

尝试将首字母缩略词与其含义相匹配 - 首字母缩略词和含义都在同一个文档中,并且通常彼此相距不远。

例如对于这个文本示例:

(b) 代表两股 A 类股票(每一股,“ADS”)的每一股美国存托股份,在紧接生效时间之前已发行和流通(代表除外股份的 ADS 除外,如果有的话)应被注销换取每 ADS 无息收取 12.25 美元现金的权利(“每 ADS 合并对价”)(减去每 ADS 取消费用 0.05 美元),根据存款协议中规定的条款和条件支付,以及每此类 ADS 所代表的 A 类股份应被注销并不复存在,以换取存托人作为其登记持有人的权利,以收取每股合并对价,存托人将分配给此类 ADS 的持有人根据本协议和存款协议中规定的条款和条件进行的每 ADS 合并对价(每 ADS 取消费用减去 0.05 美元);但本协议与押金协议发生冲突时,以本协议为准;

首字母缩略词是“ADS”,其含义是“美国存托股票”。

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

例子:

1)根据本协议中规定的条款和条件,并根据开曼群岛公司法(2018 年修订)(“CICL”)- 将匹配CLCI而不是CICL

2) 公司 SEC 报告中包含或以引用方式并入公司 SEC 报告的每份合并财务报表(包括在每种情况下的任何附注)均根据美国公认会计原则 (“ GAAP ”) - 大写字母与小写字母,也想加上美国。

【问题讨论】:

  • 您知道缩写词的所有潜在变化吗?我假设通过变体,您也不会将首字母缩略词变形为复数“ADS”
  • 我所说的变体只是指精确的“逐字逐句”和不是的变体。我只需要检测“ADS”是“美国存托股份”,这样我看到“ADS”的每个其他地方我都可以做一些神奇的 CSS 来悬停它以显示匹配。所以我可以找到原始的“ADS”——它只会出现在引号中一次,并且只需要真正关注该索引之前的文本即可找到我的匹配项。
  • 我想你写一些查询和废弃 Acronym Finder 的东西的压力会更小。
  • @accdias 但是例如 ADS 返回 183 个结果,所以我需要遍历这些结果,看看哪些结果最接近我已经尝试从“ADS”之前的文本中提取的文本,并且“CICL”或“CLCI”没有返回我要查找的结果
  • 确实,但编写类似的程序仍然比尝试创建一个匹配您将拥有的每个案例的正则表达式更容易。

标签: python text-extraction


【解决方案1】:

有一些正则表达式格式可以匹配这些确切的规范,它们是根据文本中现有的首字母缩写词动态创建的。问题在于,试图为开曼群岛公司法(2018 年修订) 匹配不同的格式,例如 CICL表示正则表达式应该寻找 CompaniesLawCaymanIslands 之间的扩展词,并且必须是有点通用,因为长扩展版本的示例可能是财政和财政部区域和州收购,你永远不知道什么时候会出现这种情况。因此,如果我要搜索 MFTRSA 并且我有一个类似 mother 的短语问father to raise some awareness,那么显然这将是一个匹配

在脚本结束时,您会得到如下内容: {'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())))

【讨论】:

  • @user2183943 这对您有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
相关资源
最近更新 更多