【问题标题】:Entity Attribute Extraction On Unstructured Medical Text非结构化医学文本的实体属性提取
【发布时间】:2020-10-04 08:30:13
【问题描述】:

我正在研究命名实体及其属性提取。我的目标是提取与句子中特定实体相关的属性。

例如 - “患者报告对 ABC 疾病呈阳性”

在上面的句子中,ABC 是一个实体,Positive 是一个定义 ABC 的属性。

我正在寻找一种简洁的方法来提取属性,我已经制定了一个提取实体的解决方案,该解决方案可以以相当高的准确性无缝工作,现在正在处理问题陈述的第二部分以提取其相关属性。

我尝试使用基于规则的方法提取属性,该方法提供下降结果但具有以下缺点:

  • 源代码无法管理。
  • 它一点也不通用,也很难管理新场景。
  • 耗时。

为了描述一个更通用的解决方案,我探索了不同的 NLP 技术并发现依赖树解析是一种潜在的解决方案。

寻找有关如何使用 Python/Java 进行依赖树解析来解决此问题的建议/输入。

请随意提出任何其他可能有帮助的技术。

【问题讨论】:

    标签: python nlp stanford-nlp spacy dependency-parsing


    【解决方案1】:

    我建议使用spacy python 库,因为它易于使用并且具有不错的依赖解析器。

    基线解决方案将从您感兴趣的实体开始以广度优先方式遍历依赖关系树,直到遇到看起来像属性的标记或直到它离实体太远。

    对此解决方案的进一步改进包括:

    • 处理“非肯定”等否定的一些规则
    • 更好的属性分类器(这里我只寻找形容词)
    • 关于应考虑哪些依赖类型和哪些标记的一些规则

    这是我的基线代码:

    import spacy
    nlp = spacy.load("en_core_web_sm")
    text = "The Patient report is Positive for ABC disease"
    doc = nlp(text)
    tokens = {token.text:token for token in doc}
    
    def is_attribute(token):
        # todo: use a classifier to determine whether the token is an attrubute
        return token.pos_ == 'ADJ'
    
    def bfs(token, predicate, max_distance=3):
        queue = [(token, 0)]
        while queue:
            t, dist = queue.pop(0)
            if max_distance and dist > max_distance:
                return
            if predicate(t):
                return t
            # todo: maybe, consider only specific types of dependencies or tokens
            neighbors =  [t.head] + list(t.children)
            for n in neighbors:
                if n and n.text:
                    queue.append((n, dist+1))
    
    print(bfs(tokens['ABC'], is_attribute))  # Positive
    

    【讨论】:

    • 非常感谢您提供宝贵意见。绝对是一个好的开始,并将开始添加更多内容和属性分类器以提取精确的属性。还开始查看解析树中的不同模式以在 BFS 代码中具有正确的条件。 :)
    猜你喜欢
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2016-09-07
    • 2011-08-18
    • 2021-11-29
    • 1970-01-01
    • 2023-03-30
    • 2018-10-28
    相关资源
    最近更新 更多