将通过 NER 与 Spacy 找到的同一个人的姓名形式合并
Merge name forms for same person found via NER with Spacy
我有一个文本文件,我想找出文本“最关于”的人,我对“最关于”的近似值将定义为提到最多的人。
我使用 Spacy 命名实体识别 (NER) 获取所有 NER 的列表,然后过滤类型 == 'PERSON'。然后我得到每个人的频率分布。这工作正常,但 Spacy 将每个文字命名实体令牌视为不同的,即“John Smith”不是“John”或“Smith”。
- 有没有更好的方法来找到文本“最
关于“?
- 如何计算 merged/combined 不同表格的计数
同名合并?
- 我自己可以想出办法,但是这个概念有没有特定的名称,所以我可以进一步研究?
- 某些 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.
我有一个文本文件,我想找出文本“最关于”的人,我对“最关于”的近似值将定义为提到最多的人。
我使用 Spacy 命名实体识别 (NER) 获取所有 NER 的列表,然后过滤类型 == 'PERSON'。然后我得到每个人的频率分布。这工作正常,但 Spacy 将每个文字命名实体令牌视为不同的,即“John Smith”不是“John”或“Smith”。
- 有没有更好的方法来找到文本“最 关于“?
- 如何计算 merged/combined 不同表格的计数 同名合并?
- 我自己可以想出办法,但是这个概念有没有特定的名称,所以我可以进一步研究?
- 某些 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.