Skip to main content

本项目提供几个简单的对原始文本做增删改的函数,同时能够维护其实体列表中的各索引同步修改。

Project description

maintain_ner_position

在做实体抽取相关的任务时,在做预处理、后处理等工作时经常会遇到需要对原始文本做增删改。同时还想要保证对原始文本增删改之后,其对应的实体列表中各个实体起止索引能够同步做更新。

本项目提供几个简单的对原始文本做增删改的函数,同时能够维护其实体列表中的各索引同步修改。

使用说明

数据结构

实体支持两种数据结构:dicttuple

dict 类型

每个实体为一个字典时,包含四个字段:

  • start:该实体的起始索引,索引值遵循左闭右开规则;
  • end:该实体的终止索引,索引值遵循左闭右开规则;
  • type:该实体的类型;
  • value:该实体的值;

举例如下:

content = "小明去欧阳锋家。"
entity_list = [
    {"type": "人名", "start": 3, "end": 6, "value": "欧阳锋"},
    {"type": "复姓", "start": 3, "end": 5, "value": "欧阳"}  # 支持重叠实体
]

tuple 类型

每个实体为tuple类型时,也要包含上述四部分信息,其顺序为:(start, end, type, value)

举例如下:

content = "小明去欧阳锋家。"
entity_list = [(3, 6, "人名", "欧阳锋"), (3, 5, "复姓", "欧阳")]  # 支持重叠实体

推荐使用 dict 类型,代码内部实际上是先将 tuple 类型转为 dict 类型,然后进行逻辑处理,逻辑处理完成后再转换回去。

快速使用

插入文本

插入文本的功能如下面的代码示例。可以调用函数 insert_content 只插入一段文本;也可以调用函数 insert_entity 插入一个新实体,此时需要传入新实体的实体类型。

关于旧实体的扩展:如下面的例子所示,"招商银行"是一个实体,如果在文本"小明去招商银行。"的索引 3 位置插入新文本:"中国",由于新插入的文本与实体"招商银行"紧邻,那么实体"招商银行"可以保持不变,也扩展为"中国招商银行"。调用函数 insert_xxx 时不会对旧实体做扩展,调用函数 insert_xxx_extend_entity 时会对旧实体做扩展。

from maintain_ner_position import insert_content, insert_content_extend_entity

content = "小明去招商银行。"
entity_list = [
    {"type": "机构", "start": 3, "end": 7, "value": "招商银行"},
    {"type": "品牌", "start": 3, "end": 5, "value": "招商"},  # 支持重叠实体
]

print("不扩展实体:")
print(insert_content(content, deepcopy(entity_list), 3, "中国"))

print("\n扩展实体:")
print(insert_content_extend_entity(content, deepcopy(entity_list), 3, "中国"))

print("\n插入的文本作为一个新实体,旧实体不做扩展:")
print(insert_entity(content, deepcopy(entity_list), 3, "中国", insert_type="国家"))

print("\n插入的文本作为一个新实体,旧实体做扩展:")
print(insert_entity_extend_entity(content, deepcopy(entity_list), 3, "中国", insert_type="国家"))

输出:

不扩展实体:
('小明去中国招商银行。', [{'type': '机构', 'start': 5, 'end': 9, 'value': '招商银行'},
                      {'type': '品牌', 'start': 5, 'end': 7, 'value': '招商'}])

扩展实体:
('小明去中国招商银行。', [{'type': '机构', 'start': 3, 'end': 9, 'value': '中国招商银行'},
                      {'type': '品牌', 'start': 3, 'end': 7, 'value': '中国招商'}])

插入的文本作为一个新实体,旧实体不做扩展:
('小明去中国招商银行。', [{'type': '机构', 'start': 5, 'end': 9, 'value': '招商银行'},
                       {'type': '品牌', 'start': 5, 'end': 7, 'value': '招商'},
                       {'type': '国家', 'start': 3, 'end': 5, 'value': '中国'}])

插入的文本作为一个新实体,旧实体做扩展:
('小明去中国招商银行。', [{'type': '机构', 'start': 3, 'end': 9, 'value': '中国招商银行'},
                      {'type': '品牌', 'start': 3, 'end': 7, 'value': '中国招商'},
                      {'type': '国家', 'start': 3, 'end': 5, 'value': '中国'}])

说明:实际执行时,会直接在原实体列表上进行修改,如果不希望修改原始实体列表,则需要使用 deepcopy();如果可以在原实体列表上进行修改,则不需要使用 deepcopy();

删除文本

删除文本的功能如下面的代码示例。可以调用函数 delete_content 直接删除一段指定的文本;也可以调用函数 delete_entity_with_idx 删除一个指定实体对应的文本。

当一个实体被删除掉了一部分之后,该实体是否保留,可由参数 keep_sub_entity 控制。比如下例中的"招商银行",被删除掉了最后的那个"行"字之后,如果想保留"招商银"作为实体,可将参数 keep_sub_entity 设置为 True,如果不想保留可将该参数设置为 False

from maintain_ner_position import delete_sub_content, delete_entity_with_idx

content = "小明去招商银行。"
entity_list = [
    {"type": "机构", "start": 3, "end": 7, "value": "招商银行"},
    {"type": "品牌", "start": 3, "end": 5, "value": "招商"},  # 支持重叠实体
]

print("删除文本:\n",
      delete_content(content, deepcopy(entity_list), start=6, end=7, keep_sub_entity=True))

print("删除文本,丢弃所有被删除了一部分的实体:\n",
      delete_content(content, deepcopy(entity_list), start=5, end=7, keep_sub_entity=False))

print("删除指定实体对应的文本:\n",
      delete_entity_with_idx(content, deepcopy(entity_list), entity_idx=1, keep_sub_entity=True))

print("删除指定实体对应的文本,丢弃所有被删除了一部分的实体:\n",
      delete_entity_with_idx(content, deepcopy(entity_list), entity_idx=1, keep_sub_entity=False))

输出:

删除文本:
 ('小明去招商银。', [{'type': '机构', 'start': 3, 'end': 6, 'value': '招商银'},
                  {'type': '品牌', 'start': 3, 'end': 5, 'value': '招商'}])

删除文本,丢弃所有被删除了一部分的实体:
 ('小明去招商。', [{'type': '品牌', 'start': 3, 'end': 5, 'value': '招商'}])

删除指定实体对应的文本:
 ('小明去银行。', [{'type': '机构', 'start': 3, 'end': 5, 'value': '银行'}])

删除指定实体对应的文本,丢弃所有被删除了一部分的实体:
 ('小明去银行。', [])

其他使用说明

所有索引在使用时遵循左闭右开原则。

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

maintain_ner_position-0.0.1-py3-none-any.whl (7.9 kB view details)

Uploaded Python 3

File details

Details for the file maintain_ner_position-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: maintain_ner_position-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 7.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.2.0 pkginfo/1.8.2 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.49.0 CPython/3.7.6

File hashes

Hashes for maintain_ner_position-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a228ae0d4212bbc31edb1991428a3e151ddc45cac3f7cdb5d11301760cd4be9a
MD5 a1972c01b6c08b9fe28699ebb8807855
BLAKE2b-256 b5d996115712b4d6aa3ff3d43d6c4b609a49536b352ea92a2d148494009a6cb2

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page