目標是在文本中自動識別出命名實體,如人名、地名、組織機構等。早期的實體識別主要依賴於規則系統和標注語料庫,這些方法雖然能夠識別常見的實體,但對於新詞或模糊詞的識別效果有限。 

隨著統計模型和機器學習方法的引入,條件隨機場(CRF)、隱馬爾可夫模型 (HMM) 等技術在實體識別中開始廣泛應用。這些模型通過學習文本特徵之間的關聯來進行實體識別,學習實體的上下文特徵和標註規律。 

隨後,深度學習模型如LSTM和BERT的出現,能做到自動學習實體特徵,減少了人工干預的需求,並且更好地捕捉上下文信息。進一步提升NER的性能。 

再來是基於Transformer的BERT等,顯著提升了中文實體識別的準確度。這些模型可以處理長距離依賴問題,並通過上下文捕捉更豐富的語義信息,從而在實體識別任務中表現出色。 最後則是大型語言模型了,能做到更精準的實體表示,並且結合上下文信息,更準確地識別實體,特別是處理歧義現象和新興實體。(2024/10)

這是將命名實體識別應用在醫囑分析,使用的是 PaddleNLP的UIE,並搭配 doccano 標註數據,fine-tuning 前的結果;但用CPU,所以有點慢。(2023/03)

其中用到的 schema 分別有以下數個:

'住院觸發詞': ['起始日期', '終止日期', '天數'];'燒燙傷觸發詞': ['起始日期', '終止日期'];'加護病房觸發詞': ['起始日期', '終止日期', '天數', '次數']
'門診觸發詞': ['起始日期', '終止日期', '次數'];'手術觸發詞': ['起始日期', '終止日期', '項目'];'急診觸發詞': ['起始日期', '起始時間', '終止日期', '終止時間']

記得前後兩次陸續投入總計約100天或許有人會發現為何在分享這幾篇自然語言會強調中文數據?最好理解的說法就是中文是基於字表示再加上中文斷詞的效果,比起每個單詞只需空格來表示的英文硬是麻煩點。命名實體識別 (Named Entity Recognition, NER) 是指將語句中的元素分成預先定義的類別 (開放域來說包括實體、時間和數字3個大類,人名、地名、組織名、機構名、時間、日期、數量和名字等7個小類,特定領域就像是藥名、疾病等類別)。要應用在那方面?像是關係抽取、對話意圖理解、輿情分析、對話NLU任務等等都用得上,更廣義的就屬填槽 (Slot-Filling) 了

最早 (2019/08時) 我們需處理的場景是針對電話助理的對話內容 (就是APP幫你接電話跟對方對話) 在語音識別後跟語音合成前的處理,印像中沒做到非常深入;後來剛好招聘到熟悉NER這部份的小夥伴們,剛好一直想把聊天對話做個流程處理 (多輪對話的概念) ,就再花了點時間當做上手,因為不想依賴大量關鍵字和正規表示式做前處理,中間試了不少數據集,還做了像是用拼音、注音等,或者品牌定義等超多的實驗,甚至還一度想硬整合 RASA 等等的開源套件,也嘗試用了 "改寫" 來修正對話內容,去識別出語句中的重點字。至於這個的數據標據就真的更累人,意外找到一個蠻好用的標註系統 ChineseAnnotator,然後我們就瘋狂開始標註 !

NER

from transformers import *

import torch

input = 'hello'  # 定義input

tokenizer = BertTokenizer.from_pretrained('bert-base-cased') # 載入tokenizer

token = tokenizer.encode(input) # 對input進行編碼

token_tensor = torch.tensor([token]) # 將輸入轉換成tensor (張量)

model = BertModel.from_pretrained('bert-base-cased') # 載入模型

model.eval() # 將模型設定為evaluation模式並關閉dropout

model(token_tensor) # 將輸入轉換成embedding

Slot-Filling

Chatbot 系統流程

定義