我有很多各种不同格式的非结构化医疗文档。 解析出用于 NLP 的所有好句子的最佳方法是什么?
目前我正在使用 SpaCy 来执行此操作,但即使使用多重处理,它也相当慢,并且默认的句子解析器不能 100% 地工作。以下是我如何尝试使用 SpaCy 获得好句子的示例:
def get_good_sents(texts, batch_size, n_process):
nlp = spacy.load("en_core_web_sm", disable=[
'ner',
'entity_linker',
'textcat',
'entity_ruler',
'sentencizer',
'merge_noun_chunks',
'merge_entities',
'merge_subtokens',
])
pipe = nlp.pipe(texts, batch_size=batch_size, n_process=n_process)
rows = []
for doc in pipe:
clean_text = []
for sent in doc.sents:
struct = [token.pos_ for token in sent]
subject = any(x in struct for x in ['NOUN', 'PRON'])
action = any(x in struct for x in ['VERB', 'ADJ', 'AUX'])
if subject and action :
clean_text.append(sent.text)
rows.append(' '.join(clean_text).replace('\n', ' ').replace('\r', ''))
return rows
一些文本摘录的示例
原始文本:
TITLE
Patient Name:
Has a heart Condition.
Is 70 Years old.
预期输出:
Has a heart Condition.
Is 70 Years old.
这个例子不太好,因为我有大量各种格式的不同文档。它们确实可以有很大的不同。基本上可以归结为我只是想去掉样板内容并获得实际的自由文本。
最佳答案
根据上述讨论的评论,我非常有信心 spaCy 不会为您提供非常好的结果,仅仅是因为它与有效语法句子的期望密切相关。
至少目前在每行中寻找“正确标记的单词”的方法,我认为这不会很好地工作,因为正确标记句子已经与合适的输入格式相关联; 又到了引用我的favorite concepts in Machine Learning之一的时候了。 .
根据您想要达到的准确性,我个人会采用防御性正则表达式方法,您手动整理标题(少于 4 个单词的行、以冒号/分号结尾的行等),尽管它将需要更多的努力。
另一个更直接的解决方案是采取 other common boilerplate tools are doing ,尽管其中大多数的目标是从 HTML 内容中删除样板文件,因此也可以更轻松地利用标签信息。
关于python - 从非结构化医疗文档中提取文本以进行 NLP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59994402/