Есть несколько форматов регулярных выражений, которые могут соответствовать этим точным спецификациям, и они создаются динамически на основе существующих аббревиатур из текста.Проблема заключается в том, что попытка сопоставления с различными форматами, такими как 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())))