在文本中查找语义相关的命名实体



我有一组带有标记的命名实体的文本文档,如"人""组织"位置"产品""数量"价格;等等。我已经对BERT模型进行了微调,以识别这些命名实体。但我也需要解决在文本中查找相关命名实体的问题。例如,假设我们有这样一部分文本:

嘿,杰克!有工作要做大公司的托马斯·史密斯今天早上打来电话,点了四个披萨,价格为十五美元;在28街的安迪点了寿司

BERT将在此文本中找到以下命名实体及其位置:

  • 杰克-人
  • 托马斯·史密斯-个人
  • 大公司-组织
  • 四位数
  • 比萨饼-产品
  • 十五美元-价格
  • 安迪-人
  • 28街-位置
  • 寿司制品

我需要一个模型,可以将这些实体划分为组,组中包含语义相关的实体,如下所示:

  • {Jack}
  • {托马斯·史密斯,大公司,四个,比萨饼,十五美元}
  • {安迪,28街,寿司}

如果我有一个实体之间有链接的训练数据集,有可能解决这样的问题吗?有没有任何神经网络架构可以在BERT模型嵌入之上用于解决这个问题?也许是一个图形模型?

在您的示例中,所有相关的实体都在同一个句子中(但不是同一句子中的所有实体都相关(。

如果是这种情况,那么我建议将句子拆分为多个成分,并将属于同一成分的实体标记为相关实体。

要构建组件,可以构建句子的语法依赖树,然后通过删除一些依赖边来剪切树。例如,如果一个句子有不同的主语,你可以把它们分成几个子句。

我使用spacy来查找实体和构建语法树(但spacy不将产品名称识别为实体,所以您应该使用自己的NER模型(。此外,你可能想发明自己的规则,把句子分成几个部分。

from collections import defaultdict
import spacy
nlp = spacy.load("en_core_web_sm")
text = "Hey, Jack! There is work for you. Thomas Smith of the Big Corporation called this morning and ordered four pizzas for fifteen dollars, and Andy on 28th Street ordered sushi."
doc = nlp(text)
def find_cluster(token):
# this token is a head of a sentence
if token.dep_ == 'ROOT' or token.head == token:
return token.idx
# this token is a head of autonomous sub-sentence
if token.dep_ == 'conj' and any(child.dep_ == 'nsubj' for child in token.children):
return token.idx
return find_cluster(token.head)
clusters = defaultdict(list)
for e in doc.ents:
clusters[find_cluster(e[0])].append(e)
for c in clusters.values():
print(c)

预期输出为:

# [Jack]
# [Thomas Smith, the Big Corporation, this morning, four, fifteen dollars]
# [Andy, 28th Street]

最新更新