将通过 NER 与 Spacy 找到的同一个人的姓名形式合并

Merge name forms for same person found via NER with Spacy

我有一个文本文件,我想找出文本“最关于”的人,我对“最关于”的近似值将定义为提到最多的人。

我使用 Spacy 命名实体识别 (NER) 获取所有 NER 的列表,然后过滤类型 == 'PERSON'。然后我得到每个人的频率分布。这工作正常,但 Spacy 将每个文字命名实体令牌视为不同的,即“John Smith”不是“John”或“Smith”。

  1. 有没有更好的方法来找到文本“最 关于“?
  2. 如何计算 merged/combined 不同表格的计数 同名合并?
  3. 我自己可以想出办法,但是这个概念有没有特定的名称,所以我可以进一步研究?
  4. 某些 NLP 库(例如 Spacy 或 NLTK)是否有能力执行此操作?

这是我当前的代码和输出:

import spacy
import nltk


# Load English tokenizer, tagger, parser and NER
nlp = spacy.load("en_core_web_sm")


def get_frequency(word_list):
    """
    Get the frequency of each word
    """
    freqs = nltk.FreqDist(word_list)
    freq_list = [(k, v) for k, v in freqs.items()]
    print(freq_list)
    print()


def get_ner_frequency(text):
    """
    Extract Named Entity References (NER) of type "PERSON" from text

    """
    # Parse with spacy
    sp_doc = nlp(text)

    # Get named people entities
    people = [ent.text for ent in sp_doc.ents if ent.label_ == "PERSON"]

    return get_frequency(people)


text = """
Mr John Smith is a person.
Smith likes to ride horses.
Mike told John to be careful. J. Smith was very careful.
A man called Smithy told me to get a horse. John Smith fell off one day. John got hurt badly.
"""

get_ner_frequency(text)


当前输出:

[('John Smith', 2), ('Smith', 1), ('Mike', 1), ('John', 2), ('J. Smith', 1), ('Smithy', 1)]

理想情况下,我希望输出如下所示:

[('John Smith', 7), ('Mike', 1)]

与大多数其他 NLP 问题一样,我意识到这不能在所有情况下都完美地完成,我只是在进行适当的近似之后。

正如评论中提到的,你想做的是所谓的“共指消解”。 spaCy 还没有内置的共指代模型,但你可以试试 coreferee.