Извлечение текстовых данных между ключевыми словами в строке

У меня есть текстовые данные, которые выглядят следующим образом после извлечения из файла и очистки. Я хочу поместить данные в фрейм данных pandas, где столбцы ('EXAMINATION', 'TECHNIQUE', 'COMPARISON', 'FINDINGS', 'IMPRESSION'), и каждая ячейка в каждой строке содержит извлеченные данные, связанные с именем столбца (то есть ключевым словом).

'ЗАКЛЮЧИТЕЛЬНЫЙ ОТЧЕТ ОБСЛЕДОВАНИЕ: ГРУДНАЯ ПА И ШИРОКАЯ ПОКАЗАНИЯ: F с новым началом асцита, оценка на наличие инфекции МЕТОДИКА: грудная ЛА и боковая СРАВНЕНИЕ: нет РЕЗУЛЬТАТЫ: нет фокальной консолидации плеврального выпота или пневмоторакса Двусторонние узловатые затемнения, которые, скорее всего, представляют собой тени сосков Кардиомедиастинальная силуэт нормальный Клипсы выступают над левым легким потенциально в пределах груди Верхняя часть живота на снимке ничем не примечательна Отмечается хроническая деформация задних отделов левого шестого и седьмого ребер ВПЕЧАТЛЕНИЕ: Острого сердечно-легочного процесса нет.

Например, под столбцом TECHNIQUE должна быть ячейка, содержащая «Грудная ПА и боковая», а под столбцом IMPRESSION должна быть ячейка, содержащая «Нет острого сердечно-легочного процесса».

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, что ввод организован так, что EXAMINATION, TECHNIQUE и т. д. встречаются именно в таком порядке.

Один из подходов заключается в переборе пар строк и использовании .split() для выбора содержимого между ними. Вот один из подходов:

import pandas as pd

data = 'FINAL REPORT EXAMINATION: CHEST PA AND LAT INDICATION: F with new onset ascites eval for infection TECHNIQUE: Chest PA and lateral COMPARISON: None FINDINGS: There is no focal consolidation pleural effusion or pneumothorax Bilateral nodular opacities that most likely represent nipple shadows The cardiomediastinal silhouette is normal Clips project over the left lung potentially within the breast The imaged upper abdomen is unremarkable Chronic deformity of the posterior left sixth and seventh ribs are noted IMPRESSION: No acute cardiopulmonary process'

strings = ('EXAMINATION','TECHNIQUE', 'COMPARISON','FINDINGS', 'IMPRESSION', '')
out = {}

for s1, s2 in zip(strings, strings[1:]):
    if not s2:
        text = data.split(s1)[1]
    else:
        text = data.split(s1)[1].split(s2)[0]
    out[s1] = [text]

print(pd.DataFrame(out))

Что приводит к:

                                         EXAMINATION                TECHNIQUE COMPARISON                                           FINDINGS                          IMPRESSION
0  : CHEST PA AND LAT INDICATION: F with new onse...  : Chest PA and lateral     : None   : There is no focal consolidation pleural effu...  : No acute cardiopulmonary process

В ответе в его нынешнем виде отсутствуют данные IMPRESSION из приведенного примера.

Kyle F Hartzenberg 28.12.2022 23:53

Хорошая точка зрения. Есть несколько способов обработки последнего слова. Я обновил ответ одним примером.

Alexander L. Hayes 29.12.2022 00:29

@KyleFHartzenberg Вы правы. Я считаю проблема со шлейфом, как вы думаете.

Moniruzzaman Khan 29.12.2022 01:56
Ответ принят как подходящий

Решение выглядит следующим образом, обратите внимание на следующие предположения:

  1. Ключевые слова в том виде, в котором они представлены, расположены в этом порядке в образце текста.
  2. Ключевые слова не содержатся в извлекаемом тексте.
  3. После каждого ключевого слова ставится «:» (двоеточие и пробел удаляются).

Решение

import pandas as pd

sample = "FINAL REPORT EXAMINATION: CHEST PA AND LAT INDICATION: F with new onset ascites eval for infection TECHNIQUE: Chest PA and lateral COMPARISON: None FINDINGS: There is no focal consolidation pleural effusion or pneumothorax Bilateral nodular opacities that most likely represent nipple shadows The cardiomediastinal silhouette is normal Clips project over the left lung potentially within the breast The imaged upper abdomen is unremarkable Chronic deformity of the posterior left sixth and seventh ribs are noted IMPRESSION: No acute cardiopulmonary process"

keywords = ["EXAMINATION", "TECHNIQUE", "COMPARISON", "FINDINGS", "IMPRESSION"]


# Create function to extract text between each of the keywords
def extract_text_using_keywords(clean_text, keyword_list):
    extracted_texts = []
    for prev_kw, current_kw in zip(keyword_list, keyword_list[1:]):
        prev_kw_index = clean_text.index(prev_kw)
        current_kw_index = clean_text.index(current_kw)
        extracted_texts.append(clean_text[prev_kw_index + len(prev_kw) + 2:current_kw_index])
        # Extract the text after the final keyword in keyword_list (i.e. "IMPRESSION")
        if current_kw == keyword_list[-1]:
            extracted_texts.append(clean_text[current_kw_index + len(current_kw) + 2:len(clean_text)])
    return extracted_texts


# Extract text
result = extract_text_using_keywords(sample, keywords)
# Create pandas dataframe
df = pd.DataFrame([result], columns=keywords)

print(df)

# To append future results to the end of the pandas df you can use
# df.loc[len(df)] = result

Выход

   EXAMINATION                                        TECHNIQUE                  COMPARISON    FINDINGS                                           IMPRESSION
0  CHEST PA AND LAT INDICATION: F with new onset ...  Chest PA and lateral       None          There is no focal consolidation pleural effusi...  No acute cardiopulmonary process

Другие вопросы по теме