Как я могу извлечь шаблон из текста, когда он содержит новую строку? - PullRequest
0 голосов
/ 20 июня 2019

Скажем, у меня есть следующий текст в ячейке набора данных (CSV-файл):

enter image description here

Я хочу извлечь слова / фразы, которые появляются после ключевых слов Decision и reason. Я могу сделать это так:

import pandas as pd

text = '''Decision: Postpone\n\nreason:- medical history -  information obtained from attending physician\n\nto review with current assessment from Dr Cynthia Dominguez regarding medical history, and current CBC showing actual number of platelet count\n\nmib: F\n'''

keywords = ['decision', 'reason']
new_df = pd.DataFrame(0, index=[0], columns=keywords)

a = text.split('\n')
for cell in a:
    for keyword in keywords:
        if keyword in cell.lower():
            if len(cell.split(':'))>1:
                new_df[keyword][0]=cell.split(':')[1]

new_df

enter image description here

Однако в некоторых ячейках слова / фразы появляются в новой строке после ключевого слова, и в этом случае эта программа не может извлечь его:

enter image description here

import pandas as pd

text = '''Decision: Postpone\n\nreason: \n- medical history \n-  information obtained from attending physician\n\nto review with current assessment from Dr Cynthia Dominguez regarding medical history, and current CBC showing actual number of platelet count\n\nmib: F\n'''

keywords = ['decision', 'reason']
new_df = pd.DataFrame(0, index=[0], columns=keywords)

a = text.split('\n')
for cell in a:
    for keyword in keywords:
        if keyword in cell.lower():
            if len(cell.split(':'))>1:
                new_df[keyword][0]=cell.split(':')[1]
new_df

enter image description here

Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Если содержимое находится в другой строке, вы определенно не можете разбивать исходную строку на строки, а затем искать все «токены» в текущей строке.

Вместо этого вам следует:

  • подготовить регулярное выражение с 2 группами захвата (ключевое слово и содержание),
  • поиск совпадений, например, используя finditer .

Пример кода может быть следующим:

df = pd.DataFrame(columns=keywords)
keywords = ['decision', 'reason']
it = re.finditer(r'(?P<kwd>\w+):\n?(?P<cont>.+?(?=\n\w+:|$))',
    text, flags=re.DOTALL)
row = dict.fromkeys(keywords, '')
for m in it:
    kwd = m.group('kwd').lower()
    cont = m.group('cont').strip()
    if kwd in keywords:
        row[kwd] = cont
df = df.append(row, ignore_index=True)

Конечно, вы должны начать с import re .

И, возможно, вам также следует немного прочитать о регулярных выражениях.

0 голосов
/ 20 июня 2019

Используйте регулярное выражение для разделения данных, это уменьшит количество циклов

import re
import pandas as pd

text = '''Decision: Postpone\n\nreason: \n- medical history \n-  information obtained from attending physician\n\nto review with current assessment from Dr Cynthia Dominguez regarding medical history, and current CBC showing actual number of platelet count\n\nmib: F\n'''

keywords = ['decision', 'reason']
new_df = pd.DataFrame(0, index=[0], columns=keywords)
text =text.lower()
tokens = re.findall(r"[\w']+", text)
for key in keywords:
   if key =='decision':
     index = tokens.index(key)
     new_df[key][0] = ''.join(tokens[index+1:index+2])
   if key =='reason':
     index = tokens.index(key)
     meta = tokens.index('review')
     new_df[key][0] = " ".join(tokens[index + 1:meta -1])

print(new_df)


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...