
bert_ner Source Code
中文 Named Entity Recognition 命名實體識別 – NER
命名實體識別(英語:Named Entity Recognition,簡稱NER),又稱作專名識別、命名實體,是指識別文本中具有特定意義的實體,主要包括人名、地名、機構名、專有名詞等,以及時間、數量、貨幣、比例數值等文字。指的是可以用專有名詞(名稱)標識的事物,一個命名實體一般代表唯一一個具體事物個體,包括人名、地名等。 — wiki
基本上就是可以抓出一些特定物件,人名、地名、機構名、專有名詞,之前也有抓過金額、日期、時間、金流渠道等。 這次的資料集則是只有人名、地名、機構名。
為求方便,這次我就改成使用 Kashgari 提供的ChineseDailyNerCorpus,安裝方式請看官網 或是透過pip
pip install kashgari
快速啟動
python3 bert_ner.py
訓練部分
訓練參數
這是Kashgari官方給的
batch_size: 2317
sequence_length: 100
epochs: 200
個人使用
train_batch_size = 16
eval_batch_size = 16
predict_batch_size = 16
learning_rate = 5e-5
num_train_epochs = 5
但由於我沒有機器跑那麼久,這次提供的結果我只跑了很少的部分
輸入資料
基本上規則滿簡單的
- 不需特別標註的字(非訓練目標),則標註成 O
- 需標註的字,首字使用 B 開頭,其餘自使用I開頭
- 需標註的字,首字之後放標籤代號例如 組織名 -> B-ORG or I-ORG 其中一個
範例如下
| 內容 | 標註 |
|---|---|
| 中 | B-ORG |
| 共 | I-ORG |
| 中 | I-ORG |
| 央 | I-ORG |
| 致 | O |
| 中 | B-ORG |
| 国 | I-ORG |
| 致 | I-ORG |
| 公 | I-ORG |
| 党 | I-ORG |
| 十 | I-ORG |
| 一 | I-ORG |
| 大 | I-ORG |
| 的 | O |
| 贺 | O |
| 词 | O |
| 各 | O |
| 位 | O |
| 代 | O |
| 表 | O |
| 、 | O |
| 各 | O |
| 位 | O |
| 同 | O |
| 志 | O |
| : | O |
| 在 | O |
| 中 | B-ORG |
| 国 | I-ORG |
| 致 | I-ORG |
| 公 | I-ORG |
| 党 | I-ORG |
| 第 | I-ORG |
| 十 | I-ORG |
| 一 | I-ORG |
| 次 | I-ORG |
| 全 | I-ORG |
| 国 | I-ORG |
| 代 | I-ORG |
| 表 | I-ORG |
| 大 | I-ORG |
| 会 | I-ORG |
| 隆 | O |
| 重 | O |
| 召 | O |
| 开 | O |
| 之 | O |
| 际 | O |
| , | O |
| 中 | B-ORG |
| 国 | I-ORG |
| 共 | I-ORG |
| 产 | I-ORG |
| 党 | I-ORG |
| 中 | I-ORG |
| 央 | I-ORG |
| 委 | I-ORG |
| 员 | I-ORG |
| 会 | I-ORG |
| 谨 | O |
| 向 | O |
| 大 | O |
| 会 | O |
| 表 | O |
| 示 | O |
| 热 | O |
| 烈 | O |
| 的 | O |
| 祝 | O |
| 贺 | O |
| , | O |
| 向 | O |
| 致 | B-ORG |
| 公 | I-ORG |
| 党 | I-ORG |
| 的 | O |
| 同 | O |
| 志 | O |
| 们 | O |
查看一下 ChineseDailyNerCorpus 資料
from kashgari.corpus import ChineseDailyNerCorpus
train_x, train_y = ChineseDailyNerCorpus.load_data('train')
valid_x, valid_y = ChineseDailyNerCorpus.load_data('validate')
test_x, test_y = ChineseDailyNerCorpus.load_data('test')
def load_data2set(set_x, set_y, max_num = 50000):
data_set = []
idx = 0
sent_text,sent_slot="",""
for label,ans in zip(set_x,set_y):
idx+=1
if idx > max_num and max_num !=-1:
break
sent_text = " ".join(label)
sent_slot = " ".join(ans)
data_set.append([sent_text,sent_slot])
print("data_set: ",data_set[:50])
return data_set
print(f"train data count: {len(train_x)}")
print(f"validate data count: {len(valid_x)}")
print(f"test data count: {len(test_x)}")
load_data2set(train_x[:10],train_y[:10])`
result:
train data count: 20864
validate data count: 2318
test data count: 4636
data_set: [['这 是 古 代 乱 世 中 的 白 日 梦 : 在 山 间 清 流 中 荡 一 叶 扁 舟 独 行 , 穿 过 一 个 幽 暗 的 洞 口 , 眼 前 豁 然 开 朗 : 桃 花 林 夹 岸 , 芳 华 鲜 美 , 落 英 缤 纷 。', 'O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'], ['大 街 上 摩 肩 接 踵 , 人 们 扶 老 携 幼 , 举 家 出 动 。', 'O O O O O O O O O O O O O O O O O O O O'], ['换 言 之 , 理 解 与 划 分 新 时 期 小 说 流 派 , 理 论 要 落 实 到 实 践 的 生 命 实 体 中 , 而 非 拿 实 践 去 迎 合 理 论 框 框 。', 'O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'], ['受 外 界 因 素 的 影 响 , 今 天 菲 律 宾 比 索 对 美 元 的 汇 率 再 次 突 破 4 0 ∶ 1 防 线 。', 'O O O O O O O O O O O B-LOC I-LOC I-LOC O O O O O O O O O O O O O O O O O O O'], ['钟 添 发 同 时 还 宣 布 了 其 他 9 个 项 目 的 亚 运 会 目 标 。', 'B-PER I-PER I-PER O O O O O O O O O O O O O B-LOC O O O O O'], ['而 我 们 在 很 长 一 个 时 期 内 , 却 用 一 种 宗 派 主 义 的 态 度 来 对 待 外 国 史 学 , 这 就 使 我 们 的 史 学 故 步 自 封 , 知 识 结 构 老 化 。', 'O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'], ['这 只 穿 兜 肚 、 哼 小 曲 、 舞 龙 头 的 鸭 子 淘 气 又 可 爱 , 能 用 一 支 神 笔 对 付 繁 重 的 功 课 , 用 橡 皮 泥 吹 出 “ 孩 子 乐 园 ” 。', 'O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'], ['哥 伦 比 亚 大 学 的 研 究 人 员 通 过 对 这 个 家 族 进 行 脱 氧 核 糖 核 酸 检 测 和 利 用 实 验 鼠 进 行 实 验 , 发 现 在 第 八 个 染 色 体 的 某 个 区 域 存 在 一 种 脱 毛 基 因 。', 'B-ORG I-ORG I-ORG I-ORG I-ORG I-ORG O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'], ['他 们 这 样 做 , 为 某 些 人 私 设 “ 小 金 库 ” 开 了 方 便 之 门 , 原 本 该 上 缴 国 家 的 税 款 有 可 能 装 进 个 人 的 腰 包 。', 'O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'], ['而 具 有 创 新 头 脑 的 人 才 要 靠 教 育 来 培 养 。', 'O O O O O O O O O O O O O O O O O O']]
[['这 是 古 代 乱 世 中 的 白 日 梦 : 在 山 间 清 流 中 荡 一 叶 扁 舟 独 行 , 穿 过 一 个 幽 暗 的 洞 口 , 眼 前 豁 然 开 朗 : 桃 花 林 夹 岸 , 芳 华 鲜 美 , 落 英 缤 纷 。',
'O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'],
['大 街 上 摩 肩 接 踵 , 人 们 扶 老 携 幼 , 举 家 出 动 。',
'O O O O O O O O O O O O O O O O O O O O'],
['换 言 之 , 理 解 与 划 分 新 时 期 小 说 流 派 , 理 论 要 落 实 到 实 践 的 生 命 实 体 中 , 而 非 拿 实 践 去 迎 合 理 论 框 框 。',
'O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'],
['受 外 界 因 素 的 影 响 , 今 天 菲 律 宾 比 索 对 美 元 的 汇 率 再 次 突 破 4 0 ∶ 1 防 线 。',
'O O O O O O O O O O O B-LOC I-LOC I-LOC O O O O O O O O O O O O O O O O O O O'],
['钟 添 发 同 时 还 宣 布 了 其 他 9 个 项 目 的 亚 运 会 目 标 。',
'B-PER I-PER I-PER O O O O O O O O O O O O O B-LOC O O O O O'],
['而 我 们 在 很 长 一 个 时 期 内 , 却 用 一 种 宗 派 主 义 的 态 度 来 对 待 外 国 史 学 , 这 就 使 我 们 的 史 学 故 步 自 封 , 知 识 结 构 老 化 。',
'O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'],
['这 只 穿 兜 肚 、 哼 小 曲 、 舞 龙 头 的 鸭 子 淘 气 又 可 爱 , 能 用 一 支 神 笔 对 付 繁 重 的 功 课 , 用 橡 皮 泥 吹 出 “ 孩 子 乐 园 ” 。',
'O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'],
['哥 伦 比 亚 大 学 的 研 究 人 员 通 过 对 这 个 家 族 进 行 脱 氧 核 糖 核 酸 检 测 和 利 用 实 验 鼠 进 行 实 验 , 发 现 在 第 八 个 染 色 体 的 某 个 区 域 存 在 一 种 脱 毛 基 因 。',
'B-ORG I-ORG I-ORG I-ORG I-ORG I-ORG O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'],
['他 们 这 样 做 , 为 某 些 人 私 设 “ 小 金 库 ” 开 了 方 便 之 门 , 原 本 该 上 缴 国 家 的 税 款 有 可 能 装 进 个 人 的 腰 包 。',
'O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O'],
['而 具 有 创 新 头 脑 的 人 才 要 靠 教 育 来 培 养 。',
'O O O O O O O O O O O O O O O O O O']]
評估
eval_f = 0.7191007
eval_precision = 0.5988906
eval_recall = 0.9756849
global_step = 13040
loss = 20.316486
預測
有輸出一份結果 在 bert_ner/output/test_samples_results.xlsx裡面
| 模型預測 | 人工答案 | 內容 |
|---|---|---|
| [CLS] | [CLS] | [CLS] |
| O | O | 学 |
| O | O | 校 |
| O | O | 还 |
| O | O | 组 |
| O | O | 织 |
| O | O | 特 |
| O | O | 困 |
| O | O | 生 |
| O | O | 参 |
| O | O | 加 |
| O | O | 丰 |
| O | O | 富 |
| O | O | 多 |
| O | O | 彩 |
| O | O | 的 |
| O | O | 社 |
| O | O | 会 |
| O | O | 活 |
| O | O | 动 |
| O | O | , |
| O | O | 登 |
| B-LOC | B-LOC | 天 |
| I-LOC | I-LOC | 安 |
| I-LOC | I-LOC | 门 |
| O | O | 、 |
| O | O | 听 |
| O | O | 音 |
| O | O | 乐 |
| O | O | 会 |
| O | O | 等 |
| O | O | , |
| O | O | 让 |
| O | O | 孩 |
| O | O | 子 |
| O | O | 们 |
| O | O | 感 |
| O | O | 受 |
| O | O | 到 |
| O | O | 集 |
| O | O | 体 |
| O | O | 的 |
| O | O | 温 |
| O | O | 暖 |
| O | O | 。 |
| [SEP] | [SEP] | [SEP] |
| [CLS] | [CLS] | [CLS] |
| O | O | 所 |
| O | O | 谓 |
| O | O | 批 |
| O | O | 判 |
| O | O | 继 |
| O | O | 承 |
| O | O | , |
| O | O | 当 |
| O | O | 然 |
| O | O | 是 |
| O | O | 要 |
| O | O | 有 |
| O | O | 所 |
| O | O | 批 |
| O | O | 判 |
| O | O | , |
| O | O | 但 |
| O | O | 主 |
| O | O | 要 |
| O | O | 还 |
| O | O | 是 |
| O | O | 要 |
| O | O | 把 |
| O | O | 优 |
| O | O | 秀 |
| O | O | 的 |
| O | O | 传 |
| O | O | 统 |
| O | O | 继 |
| O | O | 承 |
| O | O | 下 |
| O | O | 来 |
| O | O | , |
| O | O | 发 |
| O | O | 扬 |
| O | O | 光 |
| O | O | 大 |
| O | O | 。 |
| [SEP] | [SEP] | [SEP] |
| [CLS] | [CLS] | [CLS] |
額外
去抓這邊的資料 改檔案名之後放到data/資料夾後也跑跑看,可能因為資料的關係,評估的效果更好
eval_f = 0.9072733
eval_precision = 0.85459185
eval_recall = 0.9898753
global_step = 23745
loss = 6.551677