Соответствующие Сокращения к их длинной форме - PullRequest
1 голос
/ 28 марта 2019

Попытка сопоставить акронимы с их значением - и аббревиатура, и значение находятся в одном и том же документе и, как правило, не так далеко друг от друга.

например, для этого образца текста:

(b) каждая Американская депозитарная акция, представляющая собой две Акции класса A (каждая - «ADS»), выпущенные и находящиеся в обращении непосредственно перед временем вступления в силу (кроме, если таковые имеются, ADS, представляющие исключенные акции), должны быть аннулированы в обмен на право получать 12,25 долларов США наличными за ADS без процентов («Рассмотрение слияний на ADS») (за вычетом 0,05 долларов США за сборы за аннулирование ADS), подлежащих оплате в соответствии с условиями, установленными в Соглашении о депозите, и каждый Акция класса А, представленная такими АДА, должна быть аннулирована и прекращена в обмен на право Депозитария, как зарегистрированного ее владельца, получить Вознаграждение слияния на акцию, которое Депозитарий распространит среди владельцев таких АДА, как Рассмотрение вопроса о слиянии ADS в соответствии с положениями и условиями, изложенными в настоящем Соглашении и Соглашении о депозите (за вычетом 0,05 долларов США за сборы за аннулирование ADS); при условии, что в случае любого противоречия между настоящим Соглашением и Депозитным соглашением преимущественную силу имеет настоящее Соглашение;

Аббревиатура - «ADS», а ее значение - «Американская депозитарная акция».

Я начал строить регулярное выражение, основанное на токенизации аббревиатуры - так что это выглядело бы так "[A].+?[D].+?[S].+?\b", и это работает для примера выше, но я ищу более- "python-y" способ сделать это из-за различий в типах сокращений, которые я вижу.

Примеры:

1) На условиях и в соответствии с условиями, изложенными в настоящем Соглашении, и в соответствии с Законом о компаниях (пересмотренный вариант 2018 года) Каймановых островов («CICL») - будет соответствовать CLCI но не CICL

2) Каждая консолидированная финансовая отчетность (включая, в каждом случае, любые примечания к ней), содержащиеся или включенные посредством ссылки в Отчеты SEC Компании, была подготовлена ​​в соответствии с общепринятыми принципами бухгалтерского учета США («GAAP») - прописные и строчные буквы, и мы хотели бы добавить также Соединенные Штаты.

1 Ответ

0 голосов
/ 28 марта 2019

Есть несколько форматов регулярных выражений, которые могут соответствовать этим точным спецификациям, и они создаются динамически на основе существующих аббревиатур из текста.Проблема заключается в том, что попытка сопоставления с различными форматами, такими как CICL для Закона о компаниях (редакция 2018 года) Каймановых островов , означает, что регулярное выражениеследует искать расширенные слова между Companies , Law , Cayman и Islands , и оно должно быть своего рода общим, потому что примерДлинная расширенная версия может быть Министерство финансов и казначейства по региональным и государственным закупкам , вы никогда не знаете, когда это так.Поэтому, если бы мне пришлось искать MFTRSA, у меня была бы фраза типа m другой вопрос f ather t o r aise s ome a wareness , тогда очевидно, что это будет совпадение

В конце скрипта вы получите что-то вроде: {'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())))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...