При извлечении текстовых данных из файлов в разных подкаталогах возникает ошибка «ValueError: подстрока не найдена»

Я пытался извлечь текстовые данные из файлов в разных подкаталогах и поместить извлеченные данные в кадры данных pandas.

Пример текстовых данных приведен ниже:

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

Однако при попытке выполнить приведенный ниже код возникла следующая ошибка, как мне ее решить?

Ошибка

ValueError                                Traceback (most recent call last)
<ipython-input-108-bbeeb452bdef> in <module>
     48         df = pd.DataFrame(columns=keywords)
     49         # Extract text
---> 50         result = extract_text_using_keywords(text, keywords)
     51         # Append list of extracted text to the end of the pandas df
     52         df.loc[len(df)] = result

<ipython-input-108-bbeeb452bdef> in extract_text_using_keywords(clean_text, keyword_list)
     39             for prev_kw, current_kw in zip(keyword_list, keyword_list[1:]):
     40                 prev_kw_index = clean_text.index(prev_kw)
---> 41                 current_kw_index = clean_text.index(current_kw)
     42                 extracted_texts.append(clean_text[prev_kw_index + len(prev_kw) + 2:current_kw_index])
     43                 if current_kw == keyword_list[-1]:

ValueError: substring not found

Код

out = []
result = {}

for filename in glob.iglob('/content/sample_data/**/*.txt', recursive = True):
    
    out.append(filename)

print('File names: ',out)

for file in out:
      
        with open(file) as f:
          data = f.read()
          
    
        import re
        text = re.sub(r"[-_()\n\"#//@;<>{}=~|?,]*", "", data)
        text = re.sub(r'FINAL REPORT', '', text)
        text = re.sub(r'\s+', ' ', text)
        print(text)

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

        # Create function to extract text between each of the keywords
        # Assumption
        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])
                if current_kw == keyword_list[-1]:
                    extracted_texts.append(clean_text[current_kw_index + len(current_kw) + 2:len(clean_text)])
            return extracted_texts

        # Create empty pandas df with keywords as column names
        df = pd.DataFrame(columns=keywords)
        # Extract text
        result = extract_text_using_keywords(text, keywords)
        # Append list of extracted text to the end of the pandas df
        df.loc[len(df)] = result

        #print(df)

        with pd.option_context('display.max_colwidth', None): # For diplaying full columns
          display(df)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ValueError вызывается вызовом функции index() в строке current_kw_index = clean_text.index(current_kw), потому что clean_text не содержит current_kw, который пытается найти код.

Вполне вероятно, что в одном из ваших файлов data и, следовательно, text, который вы вводите в result = extract_text_using_keywords(text, keywords), не содержит ни «ИНДИКАЦИЯ», «ТЕХНИКА», «СРАВНЕНИЕ», «РЕЗУЛЬТАТЫ» или «ВПЕЧАТЛЕНИЕ». Поэтому самый простой способ решить эту проблему — проверить, какой файл вызывает проблему, и добавить необходимое ключевое слово.

Чтобы упростить эту отладку, вы можете обновить функцию extract_text_using_keywords(), включив в нее блок try except, чтобы получить более полезный вывод для ValueError. Вы также можете обновить другие части кода, чтобы справиться с последующими проблемами, которые возникнут в результате невозможности найти ключевое слово. Полное решение выглядит следующим образом:

import glob
import pandas as pd
import re

# Get & print all .txt file names with directory information
out = []
for filename in glob.iglob('content/sample_data/**/*.txt', recursive = True):
    out.append(filename)
print('File names: ', out)

# Define keywords
keywords = ["INDICATION", "TECHNIQUE", "COMPARISON", "FINDINGS", "IMPRESSION"]
# Create empty pandas df with keywords as column names
df = pd.DataFrame(columns=keywords)


# 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:]):
        try:            
            prev_kw_index = clean_text.index(prev_kw)
        except ValueError:
            print("Keyword {} was not found in the text.".format(prev_kw))
        try:
            current_kw_index = clean_text.index(current_kw)
        except ValueError:
            print("Keyword {} was not found in the text.".format(current_kw))
        try:
            extracted_texts.append(clean_text[prev_kw_index + len(prev_kw) + 2:current_kw_index])
            if current_kw == keyword_list[-1]:
                extracted_texts.append(clean_text[current_kw_index + len(current_kw) + 2:len(clean_text)])
        except UnboundLocalError:
            print("An index was not assigned for a particular keyword.")
    return extracted_texts


# Iterate over all .txt files
for file in out:
    with open(file) as f:
      data = f.read()

    text = re.sub(r"[-_()\n\"#//@;<>{}=~|?,]*", "", data)
    text = re.sub(r'FINAL REPORT', '', text)
    text = re.sub(r'\s+', ' ', text)
    # print(text)

    # Extract text
    result = extract_text_using_keywords(text, keywords)

    # If all keywords and their results were found
    if len(result) == len(keywords):
        # Append list of extracted text to the end of the pandas df
        df.loc[len(df)] = result
    else:
        print("\nFailed to extract text for one or more keywords.\
        \nPlease check that {} are all present in the following text:\n\n{}\n".format(keywords, text))

# Display results
print(df)
# with pd.option_context('display.max_colwidth', None): # For diplaying full columns
#     display(df)

Выдает следующую ошибку, если ключевое слово не включено (например, «ТЕХНИКА»):

Keyword TECHNIQUE was not found in the text.
An index was not assigned for a particular keyword.
Keyword TECHNIQUE was not found in the text.

Failed to extract text for one or more keywords.
Please check that ['EXAMINATION', 'TECHNIQUE', 'COMPARISON', 'FINDINGS', 'IMPRESSION'] are all present in the following text:

 EXAMINATION: CHEST PA AND LAT INDICATION: F with new onset ascites eval for infection : 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

Empty DataFrame
Columns: [INDICATION, TECHNIQUE, COMPARISON, FINDINGS, IMPRESSION]
Index: []

И производит желаемый результат, когда включены все ключевые слова:

File names:  ['content/sample_data\\my_data.txt', 'content/sample_data\\my_data2.txt']
                                     INDICATION              TECHNIQUE COMPARISON                                           FINDINGS                        IMPRESSION
0  F with new onset ascites eval for infection   Chest PA and lateral       None   There is no focal consolidation pleural effusi...  No acute cardiopulmonary process
1   Chronic pain noted in lower erector spinae                Palpate       None   Upper iliocostalis thoracis triggers pain alon...                               Nil

Спасибо за ответ, извините, меня не было. У меня тысячи таких текстовых файлов. ваш код только помещает последние данные процесса в фрейм данных pandas, как я могу поместить все данные процесса в фрейм данных. Спасибо за вашу помощь.

Moniruzzaman Khan 03.01.2023 21:59

@MoniruzzamanKhan Пожалуйста, посмотрите обновленный код, он должен обеспечить необходимую вам функциональность.

Kyle F Hartzenberg 03.01.2023 23:49

Спасибо за помощь, у меня есть еще один вопрос, если некоторые из ключевых слов отсутствуют, и я все еще хочу получить информацию о других ключевых словах в том же файле и поставить «NULL» или «0» в качестве значений отсутствующих ключевых слов. Что мне нужно сделать.

Moniruzzaman Khan 04.01.2023 19:29

@MoniruzzamanKhan Пожалуйста. Эта функциональность не является быстрым решением, вероятно, лучше всего, если вы создадите минимальный пример того, что вы хотите сделать при обработке отсутствующих ключевых слов, а затем опубликуете еще один вопрос.

Kyle F Hartzenberg 04.01.2023 23:23

@MoniruzzamanKhan Пожалуйста. Если сообщение ответило на ваш вопрос, не забудьте отметить его как принятый ответ.

Kyle F Hartzenberg 05.01.2023 04:08

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