从NLP的非结构化医疗文档中提取文本

时间:2020-01-30 20:57:28

标签: python nlp spacy

我有很多不同格式的非结构化医疗文件。 解析出所有用于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.

这个例子不是很好,因为我有成千上万种各种格式的不同文档。它们确实可以相差很大。基本上,这归结为我只是想剥离样板内容,而只是获得实际的自由文本。

1 个答案:

答案 0 :(得分:2)

基于以上讨论的评论,我非常有信心spaCy不会为您提供非常好的结果,仅仅是因为它与有效语法语句的期望紧密相关。

至少对于当前在每行中查找“正确标记的单词”的方法而言,我希望这种方法不能很好地工作,因为正确标记一个句子已经与一种体面的输入格式相关联; 再次引用我的favorite concepts in Machine Learning之一。

根据您要达到的精度,我个人会采用防御性的Regex方法,在该方法中,您可以手动分类标题(少于4个字的行,以冒号/分号结尾的行等),尽管它可以将需要更多的努力。

另一种更直接的解决方案是采用other common boilerplate tools are doing,尽管其中大多数目标是从HTML内容中删除样板,因此也可以通过利用标记信息来简化工作。