0

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

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

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

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

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

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

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

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

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

4

1 回答 1

1

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

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

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

  • 处理否定的一些规则,例如“非肯定”
  • 一个更好的属性分类器(这里我只是寻找形容词)
  • 关于应考虑哪些类型的依赖项和哪些令牌的一些规则

这是我的基线代码:

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
于 2020-10-29T10:12:17.917 回答