Печать сокращений и слов, написанных через дефис

Для начала мне нужно идентифицировать все сокращения и слова, написанные через дефис в моих предложениях. Их нужно распечатывать по мере их идентификации. Мой код, похоже, плохо работает для этой идентификации.

import re

sentence_stream2=df1['Open End Text']
for sent in sentence_stream2:
    abbs_ = re.findall(r'(?:[A-Z]\.)+', sent) #abbreviations
    hypns_= re.findall(r'\w+(?:-\w+)*', sent) #hyphenated words

    print("new sentence:")
    print(sent)
    print(abbs_)
    print(hypns_)

Одно из предложений в моем корпусе: DevOps с API и архитектурой, управляемой событиями, с использованием среды облачной аналитики данных Самообслуживание BI

Выход для этого:

new sentence:
DevOps with APIs & event-driven architecture using cloud Data Analytics environment Self-service BI
[]
['DevOps', 'with', 'APIs', 'event-driven', 'architecture', 'using', 'cloud', 'Data', 'Analytics', 'environment', 'Self-service', 'BI']

ожидаемый результат:

new sentence:
DevOps with APIs & event-driven architecture using cloud Data Analytics environment Self-service BI
['APIs','BI']
['event-driven','Self-service']

person Shraddha Avasthy    schedule 01.10.2019    source источник


Ответы (3)


Ваше правило для аббревиатур не соответствует. Вы хотите найти любые слова с более чем 1 последовательной заглавной буквой, правило, которое вы могли бы использовать:

abbs_ = re.findall(r'(?:[A-Z]{2,}s?\.?)', sent) #abbreviations

Это будет соответствовать API и BI.

t = "DevOps with APIs & event-driven architecture using cloud Data Analytics environment Self-service BI"

import re

abbs_ = re.findall(r'(?:[A-Z]\.)+', t) #abbreviations
cap_ = re.findall(r'(?:[A-Z]{2,}s?\.?)', t) #abbreviations
hypns_= re.findall(r'\w+-\w+', t) #hyphenated words fixed

print("new sentence:")
print(t)
print(abbs_)
print(cap_)
print(hypns_)

Выход:

DevOps with APIs & event-driven architecture using cloud Data Analytics environment Self-service BI
[]  # your abbreviation rule - does not find any capital letter followed by .
['APIs', 'BI'] # cap_ rule
['event-driven', 'Self-service']  # fixed hyphen rule

Это, скорее всего, не найдет все сокращения, такие как

t = "Prof. Dr. S. Quakernack"

поэтому вам может потребоваться настроить его, используя дополнительные данные и f.e. http://www.regex101.com

person Patrick Artner    schedule 01.10.2019

Я предлагаю:

abbs_ = re.findall(r'\b[A-Z]+s?\b', sent) #abbreviations
hypns_ = re.findall(r'\w+(?:-\w+)*', sent) #hyphenated words
person Gary Goh    schedule 01.10.2019

«Как вы знаете, я получил все «А» на своем курсе».

"Как" - это аббревиатура? Если нет, то вам нужно отбросить одиночные заглавные буквы, за которыми следует S или нет, и собрать только пары, за которыми может следовать одна буква s, как в API. Так,

abbs_ = re.findall(r'\b(?:[A-Z][A-Z]+s?)\b', sent) #abbreviations

\b необходимы, чтобы быть уверенным, что вы не пожинаете такие вещи, как ImNotAGirl, из-за этой пары AG в середине.

Затем вам нужно получить сокращения: слово (\w+), за которым следует хотя бы одна последовательность дефис-слово:

hypns_= re.findall(r'\b(?:\\w+(-\w+)+)\b', sent) #hyphenated words
person LSerni    schedule 01.10.2019