Я пытался извлечь текстовые данные из файлов в разных подкаталогах и поместить извлеченные данные в кадры данных 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)
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
@MoniruzzamanKhan Пожалуйста, посмотрите обновленный код, он должен обеспечить необходимую вам функциональность.
Спасибо за помощь, у меня есть еще один вопрос, если некоторые из ключевых слов отсутствуют, и я все еще хочу получить информацию о других ключевых словах в том же файле и поставить «NULL» или «0» в качестве значений отсутствующих ключевых слов. Что мне нужно сделать.
@MoniruzzamanKhan Пожалуйста. Эта функциональность не является быстрым решением, вероятно, лучше всего, если вы создадите минимальный пример того, что вы хотите сделать при обработке отсутствующих ключевых слов, а затем опубликуете еще один вопрос.
@MoniruzzamanKhan Пожалуйста. Если сообщение ответило на ваш вопрос, не забудьте отметить его как принятый ответ.
Спасибо за ответ, извините, меня не было. У меня тысячи таких текстовых файлов. ваш код только помещает последние данные процесса в фрейм данных pandas, как я могу поместить все данные процесса в фрейм данных. Спасибо за вашу помощь.