NER - 实体识别 - 国家过滤器

NER - Entity Recognition - Country Filter

我想从一个带有 spacy 的 Excel 文件中提取地理相关信息。它可以提取所有实体,但我只需要地理数据,但找不到过滤实体的方法。

import pandas as pd
import spacy

sp = spacy.load("en_core_web_sm")
df = pd.read_excel("test.xlsx", usecols=["Bio", "Author"])
df.head(1)
df=df.fillna('')
#df['Bio']
doc = df.values.tolist()
#print (doc)
#sp(', '.join(doc[0])).ents
for entry in doc:
    #print('Current entry\n {}'.format(entry))
    for entity in sp(', '.join(entry)).ents:
        print(entity.text, entity.label)

目前,输出如下:

Munich 384

Germany 384

Venezuela 384

London 384

Portrait | 9191306739292312949

 ℍ  ​ 383

  ​ 394

Visited: 383

 384

 392

最后,我想将地理相关实体(如果存在)写回新列中的用户行 "Location" csv.

非常感谢您的帮助,谨致问候

请参阅 entity.label_(带下划线)以查看实体标签的字符串版本,这可能会帮助您进行一些过滤。不过,默认的英语 NER 模型(在 web/newspaper 文本上训练)可能无法很好地处理这种文本,因为它对表情符号或其他一些 unicode 字符一无所知。

如前所述,您可以过滤 spacy 语言模型提供的 "LOC" 或 "GPE" 实体。但是,请注意 NER 语言模型需要有一个句子上下文才能预测位置实体。

sp = spacy.load("en_core_web_sm")
# loop over every row in the 'Bio' column
for text in df['Bio'].tolist():
    # use spacy to extract the entities
    doc = sp(text)
    for ent in doc.ents:    
        # check if entity is equal 'LOC' or 'GPE'
        if ent.label_ in ['LOC', 'GPE']:
            print(ent.text, ent.label_)   

此处 link spacy NER 文档:https://spacy.io/usage/linguistic-features#named-entities

编辑

这是文档中英文 spacy 实体类型的完整列表:

  • PERSON 人物,包括虚构人物。 NORP 国籍或宗教或政治团体。
  • FAC 建筑物、机场、高速公路、桥梁等
  • ORG 公司、机关、机构等
  • GPE 国家、城市、州。
  • LOC 非 GPE 位置、山脉、水域。
  • PRODUCT 对象、车辆、食品等(不是服务。)
  • EVENT 已命名的飓风、战斗、战争、体育赛事等
  • WORK_OF_ART 书名、歌曲等
  • LAW 命名文件制作 成法律。
  • LANGUAGE 任何指定的语言。
  • DATE 绝对或相对日期或期间。
  • TIME 小于一天的时间。
  • PERCENT 百分比,包括“%”。
  • MONEY 货币价值,包括单位。
  • QUANTITY 测量值,如重量或距离。
  • 序数“第一”、“第二”等
  • 不属于其他类型的基数。

来源:https://spacy.io/api/annotation#named-entities