我建议使用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