python - 从非结构化医疗文档中提取文本以进行 NLP

标签 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.

这个例子不太好,因为我有大量各种格式的不同文档。它们确实可以有很大的不同。基本上可以归结为我只是想去掉样板内容并获得实际的自由文本。

最佳答案

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

至少目前在每行中寻找“正确标记的单词”的方法,我认为这不会很好地工作,因为正确标记句子已经与合适的输入格式相关联; 又到了引用我的favorite concepts in Machine Learning之一的时候了。 .

根据您想要达到的准确性,我个人会采用防御性正则表达式方法,您手动整理标题(少于 4 个单词的行、以冒号/分号结尾的行等),尽管它将需要更多的努力。

另一个更直接的解决方案是采取 other common boilerplate tools are doing ,尽管其中大多数的目标是从 HTML 内容中删除样板文件,因此也可以更轻松地利用标签信息。

关于python - 从非结构化医疗文档中提取文本以进行 NLP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59994402/

相关文章:

python - 基本的 python 。如何禁止函数更改列表?

php - 寻找将文本分解成句子的企业解决方案

algorithm - 基于文档重要性的句子排序算法

python - 使用 StanfordParser 从已解析的句子中获取类型依赖项

python - 相当于Python中的wget下载网站和资源

python - 挂起进程超时(卡住操作系统调用)

python - Web.py 在这种情况下如何访问渲染函数

python - 如何使用 Spacy 解析动词

python - 是否可以将您自己的 WordNet 添加到图书馆中?

nlp - 使用 Spacy en_core_web_lg 模型的 POS 标记不一致