級(jí)NLP平臺(tái):從多模態(tài)解析到知識(shí)圖譜的實(shí)踐指南)
簡(jiǎn)介思通數(shù)科自然語(yǔ)言處理平臺(tái)是一套支持本地化部署的企業(yè)級(jí)AI文本分析系統(tǒng)面向需要處理網(wǎng)頁(yè)、文檔、音視頻及圖像等多模態(tài)數(shù)據(jù)的企業(yè)用戶解決非結(jié)構(gòu)化信息向結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)化的難題并提供實(shí)體識(shí)別、情感分析與知識(shí)圖譜構(gòu)建等能力滿足企業(yè)對(duì)數(shù)據(jù)安全與自主可控的要求。資源包共含412個(gè)文件約51.78MB以JavaScript/CSS前端頁(yè)面、Java后端邏輯、HTML界面及PNG圖片等為主另有工程配置文件、SQL腳本與說(shuō)明文檔整體結(jié)構(gòu)清晰適合用于平臺(tái)部署實(shí)踐與深度學(xué)習(xí)。目前已有136人瀏覽學(xué)習(xí)。通過(guò)這份資源包讀者可獲得完整的前端展示層與后端服務(wù)代碼、API接口示例、部署配置參考以及docx/txt使用說(shuō)明便于在企業(yè)環(huán)境中搭建私有化文本分析平臺(tái)或參考其技術(shù)路徑開(kāi)展NLP相關(guān)項(xiàng)目研發(fā)。1. 企業(yè)級(jí)NLP平臺(tái)為什么必須本地化數(shù)據(jù)不出內(nèi)網(wǎng)才是剛需上一家客戶讓我印象很深他們要分析幾十萬(wàn)份質(zhì)檢文檔、上千小時(shí)操作視頻和內(nèi)部網(wǎng)站的招標(biāo)公告但第一條規(guī)定就是“數(shù)據(jù)絕不能出內(nèi)網(wǎng)”。公有云上的自然語(yǔ)言處理接口再好也過(guò)不了安全和合規(guī)這一關(guān)。于是我只能轉(zhuǎn)向支持本地化部署的AI文本分析系統(tǒng)思通數(shù)科自然語(yǔ)言處理平臺(tái)就是當(dāng)時(shí)壓測(cè)的候選之一。它把網(wǎng)頁(yè)、文檔、音視頻、圖像統(tǒng)一做解析和結(jié)構(gòu)化再用深度學(xué)習(xí)做實(shí)體識(shí)別、情感分析最后落到企業(yè)級(jí)知識(shí)圖譜。這套東西很適合數(shù)據(jù)敏感、又需要內(nèi)容挖掘和知識(shí)圖譜的團(tuán)隊(duì)。下面我會(huì)按這類(lèi)平臺(tái)從選型到落地的完整路徑把方案、參數(shù)和坑一起說(shuō)清。2. 拆解多模態(tài)解析管線網(wǎng)頁(yè)、文檔、音視頻先變成同一種中間JSON2.1 多模態(tài)數(shù)據(jù)接入層為什么先做解析再談NLP多模態(tài)數(shù)據(jù)最大的問(wèn)題是“格式不統(tǒng)一”。PDF有掃描版和電子版網(wǎng)頁(yè)有靜態(tài)和動(dòng)態(tài)渲染視頻帶著音頻和畫(huà)面圖像又有分辨率差異。如果直接把這些原始數(shù)據(jù)塞給BERT或者CLIP預(yù)處理邏輯會(huì)亂成一團(tuán)。我一般會(huì)把接入層單獨(dú)拆開(kāi)先做“多模態(tài)統(tǒng)一解析”讓所有數(shù)據(jù)變成結(jié)構(gòu)化的文本段和對(duì)應(yīng)的圖像幀再進(jìn)入下游分析。常見(jiàn)的做法是文檔用Apache Tika加Tesseract OCR網(wǎng)頁(yè)用Playwright預(yù)渲染后轉(zhuǎn)HTML正文圖像走OCR或CLIP編碼音視頻用ffmpeg抽幀、Whisper做語(yǔ)音轉(zhuǎn)寫(xiě)。統(tǒng)一入口看起來(lái)像這樣# multimodal_ingest.py - 多模態(tài)解析入口 import subprocess import json from pathlib import Path def parse_document(path): # 用Tika解析PDF/Word/HTML保留文本和元數(shù)據(jù) from tika import parser parsed parser.from_file(str(path)) return {text: parsed[content], source: str(path)} def parse_video(path, fps1, audio_chunk_sec10): # 用ffmpeg按固定幀率抽取畫(huà)面幀 subprocess.run( [ffmpeg, -i, str(path), -vf, ffps{fps}, /tmp/frame_%04d.jpg], checkTrue ) frames sorted(Path(/tmp).glob(frame_*.jpg)) # 音頻轉(zhuǎn)寫(xiě)交給Whisper這里只返回幀路徑列表 return {frame_paths: [str(f) for f in frames], fps: fps}這里的fps1表示每秒抽一幀對(duì)大部分質(zhì)檢視頻夠用如果場(chǎng)景動(dòng)作快可以調(diào)到5。audio_chunk_sec控制音頻分片長(zhǎng)度Whisper按片轉(zhuǎn)寫(xiě)能避免長(zhǎng)音頻截?cái)鄬?dǎo)致的上下文丟失。解析層的關(guān)鍵是每個(gè)函數(shù)只做一件事后續(xù)的模型調(diào)用不感知原始格式差異。2.2 結(jié)構(gòu)化數(shù)據(jù)模型帶時(shí)間戳與置信度的統(tǒng)一文檔解析結(jié)果不能各存各的否則下游實(shí)體識(shí)別和情感分析要寫(xiě)一堆適配代碼。我會(huì)讓所有模態(tài)最終都變成“統(tǒng)一文檔結(jié)構(gòu)”核心字段只有幾個(gè)文本內(nèi)容、偏移量時(shí)間戳或頁(yè)碼、置信度、來(lái)源路徑。這個(gè)結(jié)構(gòu)既方便存JSON也能灌進(jìn)Elasticsearch或PostgreSQL做檢索。一個(gè)典型的數(shù)據(jù)類(lèi)定義是# schema.py - 統(tǒng)一中間文檔結(jié)構(gòu) from dataclasses import dataclass dataclass class TextSegment: text: str # 一段可分析的文本 offset: int # 視頻是毫秒時(shí)間戳文檔是字符偏移 confidence: float # OCR/ASR的置信度低于閾值可直接丟棄 dataclass class UnifiedDoc: doc_type: str # pdf, web, video, image raw_path: str # 原始文件絕對(duì)路徑 segments: list[TextSegment] metadata: dict # 文件大小、分辨率、語(yǔ)言等offset在文檔場(chǎng)景表示這段文本在原文中的字符位置方便回看上下文在視頻場(chǎng)景表示開(kāi)始毫秒數(shù)方便定位畫(huà)面。confidence是個(gè)容易被忽略的字段——OCR識(shí)別“合同”兩個(gè)字置信度只有0.6后面實(shí)體識(shí)別就容易跟著錯(cuò)。我習(xí)慣在接入層就定一個(gè)閾值比如0.75以下不進(jìn)分析管道寧可少一條結(jié)果也不制造噪音。2.3 多模態(tài)特征與文本嵌入融合淺層對(duì)齊比暴力拼接更穩(wěn)文本解析完只是第一步圖像、視頻畫(huà)面里的信息同樣有價(jià)值。所以思通數(shù)科這類(lèi)平臺(tái)會(huì)做“多模態(tài)融合”而不是只跑文本模型。常見(jiàn)做法是文本用多語(yǔ)言BERT編碼圖像用CLIP編碼再把兩個(gè)向量做淺層融合接一個(gè)MLP分類(lèi)器。這樣做的好處是不需要端到端重訓(xùn)一個(gè)大模型也能在情感分析、內(nèi)容審核場(chǎng)景拿到不錯(cuò)的提升。以下是我常用的融合代碼# embed_fusion.py - 文本與圖像向量融合 from sentence_transformers import SentenceTransformer import torch text_model SentenceTransformer(paraphrase-multilingual-MiniLM-L12-v2) # 實(shí)際項(xiàng)目中用open_clip加載預(yù)訓(xùn)練CLIP模型這里假設(shè)已存在 clip_model torch.load(/models/clip.pt) def fuse(text, image_tensor): t_vec text_model.encode(text, convert_to_tensorTrue) i_vec clip_model.encode_image(image_tensor) # 簡(jiǎn)單concat后過(guò)一層線性降維維度由文本和視覺(jué)特征維度決定 fused torch.cat([t_vec, i_vec], dim-1) fused torch.nn.Linear(fused.shape[-1], 256)(fused) return fused文本模型我選多語(yǔ)言版本因?yàn)橹形暮陀⑽幕炫诺墓I(yè)文檔很常見(jiàn)。concat后接線性層是最保守的融合方式足夠穩(wěn)定。如果數(shù)據(jù)量大再升級(jí)成跨模態(tài)注意力。這里的一個(gè)調(diào)參點(diǎn)是CLIP和BERT的特征向量維度如果不一致concat后的總長(zhǎng)度會(huì)變得很大容易過(guò)擬合所以降維到256是起步值具體可以看驗(yàn)證集表現(xiàn)。3. 本地化部署的完整落地步驟從裸機(jī)到跑通NER與情感分析3.1 環(huán)境準(zhǔn)備GPU驅(qū)動(dòng)、CUDA與容器運(yùn)行時(shí)的“玄學(xué)”檢查本地化部署的核心是把模型和依賴隔離在容器里最常用的編排方式是docker-compose。但很多團(tuán)隊(duì)卡在第一步容器里根本用不了GPU。這不是平臺(tái)的問(wèn)題而是宿主機(jī)沒(méi)裝nvidia-container-toolkit。我一般在裝環(huán)境時(shí)先跑一套檢查命令# 檢查GPU驅(qū)動(dòng)與容器運(yùn)行時(shí)是否就緒 nvidia-smi docker info | grep -i runtimedocker info的輸出里必須能看到nvidiaruntime。如果只有runc說(shuō)明容器跑起來(lái)只能CPU計(jì)算把BERT模型跑一遍可能要天荒地老。裝nvidia-container-toolkit之后再在docker-compose里聲明GPU資源才算有效。環(huán)境和版本上我用的是Ubuntu 22.04、CUDA 11.8、Docker 24。CUDA版本不必追求最新關(guān)鍵是鏡像里的cudnn要和你的驅(qū)動(dòng)兼容。3.2 用docker-compose拉起平臺(tái)核心服務(wù)思通數(shù)科這類(lèi)NLP平臺(tái)往往不只一個(gè)服務(wù)至少包括推理API、模型目錄、知識(shí)圖譜數(shù)據(jù)庫(kù)。我用一個(gè)compose文件把它們組織起來(lái)模型目錄從宿主機(jī)掛載進(jìn)容器這樣換模型不用重建鏡像。# docker-compose.yml - 本地化部署核心服務(wù) version: 3.8 services: nlp-api: image: sitong-nlp-api:2.1 # 平臺(tái)方的推理服務(wù)鏡像 ports: - 8080:8080 # 對(duì)外提供HTTP接口 environment: - MODEL_DIR/models - DEVICEcuda:0 volumes: - ./models:/models # 模型權(quán)重只掛載不打進(jìn)鏡像 - ./data:/data deploy: resources: reservations: devices: - driver: nvidia capabilities: [gpu] neo4j: image: neo4j:5.18 environment: NEO4J_AUTH: neo4j/change-me-in-prod volumes: - ./neo4j_data:/data服務(wù)名nlp-api是平臺(tái)推理入口MODEL_DIR指向模型目錄DEVICEcuda:0指定第一塊GPU。模型目錄用volumes掛載好處是更新一個(gè)微調(diào)后的權(quán)重時(shí)不用重新打鏡像缺點(diǎn)是啟動(dòng)前要確認(rèn)目錄里確實(shí)有模型文件否則API會(huì)一直報(bào)模型加載失敗。neo4j的密碼在生產(chǎn)環(huán)境里絕不能寫(xiě)默認(rèn)值這里的change-me-in-prod只是演示。3.3 加載預(yù)訓(xùn)練模型并驗(yàn)證實(shí)體識(shí)別接口服務(wù)起來(lái)后我習(xí)慣先用一個(gè)最小請(qǐng)求驗(yàn)證命名實(shí)體識(shí)別鏈路。假設(shè)平臺(tái)API路徑是/ner用curl發(fā)一條包含組織名和人名的文本預(yù)期返回JSON數(shù)組curl -X POST http://localhost:8080/ner \ -H Content-Type: application/json \ -d {text: 思通數(shù)科宣布與華創(chuàng)公司合作張偉在深圳出席發(fā)布會(huì)。} # 期望返回示例{ entities: [ {text:思通數(shù)科,type:ORG}, {text:華創(chuàng)公司,type:ORG}, {text:張偉,type:PERSON}, {text:深圳,type:GPE} ] }這條請(qǐng)求同時(shí)驗(yàn)證了API連通、模型加載和中文分詞。如果返回空列表先看容器日志里有沒(méi)有報(bào)錯(cuò)再確認(rèn)模型文件是否用對(duì)。最常翻車(chē)的是UTF-8編碼問(wèn)題——終端發(fā)curl時(shí)中文被轉(zhuǎn)成GBK服務(wù)端解出來(lái)全是亂碼實(shí)體當(dāng)然一個(gè)也識(shí)別不到。所以我會(huì)在請(qǐng)求頭里顯式帶charsetUTF-8并且用Python腳本而非curl來(lái)發(fā)長(zhǎng)文本。3.4 實(shí)體識(shí)別與情感分析的推理參數(shù)調(diào)優(yōu)batch和max_seq_len怎么配這兩個(gè)參數(shù)是部署后最先要調(diào)的batch_size和max_seq_len。batch_size太大會(huì)讓顯存OOM太小則GPU利用率低max_seq_len太長(zhǎng)會(huì)拖慢速度太短會(huì)截?cái)嚓P(guān)鍵信息。我習(xí)慣從一組保守值開(kāi)始先跑通再往上加# sentiment_infer.py - 批量情感分析調(diào)用示例 import requests def sentiment_batch(texts, endpointhttp://localhost:8080/sentiment, batch_size16): results [] for i in range(0, len(texts), batch_size): r requests.post(endpoint, json{texts: texts[i:i batch_size]}) results.extend(r.json()[results]) # batch_size 16 起步觀察GPU顯存占用后逐步提到32 return resultsbatch_size16是起步值不是千篇一律的最優(yōu)值。如果你的文本平均長(zhǎng)度只有50字GPU是A100那直接調(diào)到64也沒(méi)問(wèn)題但如果長(zhǎng)文本多到2000字max_seq_len必須設(shè)到512這時(shí)batch_size8都可能讓顯存爆掉。另外平臺(tái)側(cè)API可能也內(nèi)置了max_seq_len參數(shù)我建議先按模型訓(xùn)練時(shí)的采集長(zhǎng)度設(shè)不要盲目加大。4. 從實(shí)體識(shí)別到企業(yè)級(jí)知識(shí)圖譜Neo4j落庫(kù)與本體設(shè)計(jì)4.1 實(shí)體關(guān)系抽取NER結(jié)果怎么變成三元組NER只標(biāo)出“誰(shuí)是誰(shuí)”知識(shí)圖譜需要的是“誰(shuí)和誰(shuí)有什么關(guān)系”。所以實(shí)體識(shí)別之后還有一步關(guān)系抽取。關(guān)系抽取在企業(yè)級(jí)落地中最穩(wěn)妥的不是復(fù)雜模型而是“規(guī)則遠(yuǎn)程監(jiān)督”的組合——先通過(guò)正則和依存句法抽高置信度的三元組再用人工校驗(yàn)的樣本訓(xùn)練一個(gè)BERT關(guān)系分類(lèi)器去補(bǔ)召回。這樣冷啟動(dòng)快也不會(huì)因?yàn)橛?xùn)練數(shù)據(jù)不足而全面翻車(chē)。一條簡(jiǎn)單規(guī)則如下# re_extract.py - 用規(guī)則從句子中抽三元組 import re sentence 思通數(shù)科發(fā)布了一款知識(shí)圖譜平臺(tái) pattern r([\u4e00-\u9fff]{2,10}|[A-Za-z0-9])\s*(發(fā)布|推出|研發(fā))\s*([\u4e00-\u9fff]{2,20}) m re.search(pattern, sentence) if m: print({head: m.group(1), relation: m.group(2), tail: m.group(3)}) # 輸出: {head: 思通數(shù)科, relation: 發(fā)布, tail: 知識(shí)圖譜平臺(tái)}這個(gè)正則里的中文范圍{2,10}是為了避開(kāi)單字噪音動(dòng)詞表發(fā)布|推出|研發(fā)可以按業(yè)務(wù)擴(kuò)展。規(guī)則抽取的問(wèn)題在召回率低比如被動(dòng)句“這款平臺(tái)被思通數(shù)科推出”就抽不出來(lái)。所以我會(huì)在規(guī)則層只保留高置信的結(jié)果其他文本進(jìn)入下游模型分類(lèi)。4.2 本體與Schema設(shè)計(jì)先定實(shí)體類(lèi)型再談1024維向量企業(yè)級(jí)知識(shí)圖譜最容易犯的錯(cuò)是“先存圖再想結(jié)構(gòu)”。沒(méi)有本體的圖譜查詢和推理都做不動(dòng)。本體建模要明確三件事有哪些實(shí)體類(lèi)型、實(shí)體有哪些屬性、類(lèi)型之間允許哪些關(guān)系。比如“組織發(fā)布產(chǎn)品”合理“產(chǎn)品發(fā)布組織”就是反的。下面是一個(gè)極簡(jiǎn)的本體JSON Schema{ entity_types: { Organization: { properties: [name, industry, headquarter], aliases: [公司, 集團(tuán), 企業(yè)] }, Product: { properties: [name, category], aliases: [平臺(tái), 系統(tǒng), 軟件] } }, relation_rules: { publish: { domain: Organization, range: Product, max_per_pair: 1 } } }這個(gè)Schema規(guī)定了publish關(guān)系只能從Organization指向Product。有了它后面寫(xiě)Cypher和校驗(yàn)都輕松。至于很多團(tuán)隊(duì)熱衷的“圖嵌入1024維”我的看法是那是圖譜下游分析的事不要在落庫(kù)階段急著做。先讓本體干凈、實(shí)體不重復(fù)嵌入才有意義。4.3 用Neo4j寫(xiě)入知識(shí)圖譜Cypher批量MERGE與性能參數(shù)拿到的三元組最終要進(jìn)圖數(shù)據(jù)庫(kù)我用Neo4j最頻繁的寫(xiě)入操作是MERGE而不是CREATE因?yàn)樗鼙苊庵貜?fù)節(jié)點(diǎn)。批量寫(xiě)入時(shí)把三元組列表作為參數(shù)傳給Cypher// upsert_triples.cypher - 批量寫(xiě)入三元組 UNWIND $batch AS row MERGE (h:Entity {name: row.head}) ON CREATE SET h.type row.head_type MERGE (t:Entity {name: row.tail}) ON CREATE SET t.type row.tail_type MERGE (h)-[r:REL {name: row.relation}]-(t) RETURN count(r)UNWIND $batch把Python傳進(jìn)來(lái)的列表逐條展開(kāi)MERGE基于name屬性做唯一匹配。這里有一個(gè)前提實(shí)體必須提前做對(duì)齊否則“阿里巴巴”和“阿里”會(huì)變成兩個(gè)節(jié)點(diǎn)。寫(xiě)入性能上單條事務(wù)寫(xiě)入幾千條沒(méi)問(wèn)題但如果你一次灌幾百萬(wàn)條就要調(diào)整Neo4j的dbms.memory.heap.max_size和批量事務(wù)大小或者改用neo4j-admin import先導(dǎo)出CSV再導(dǎo)入。我一般先小批量跑通再上全量。5. 本地化部署思通數(shù)科平臺(tái)的5個(gè)常見(jiàn)問(wèn)題排查與避坑記錄5.1 部署與推理環(huán)境排查GPU直通和OOM這倆坑**現(xiàn)象一**容器里跑nvidia-smi提示NVIDIA-SMI has failed或者干脆沒(méi)有這臺(tái)命令。**原因**宿主機(jī)安裝了NVIDIA驅(qū)動(dòng)但沒(méi)有配置nvidia-container-toolkitDocker默認(rèn)使用runc運(yùn)行時(shí)無(wú)法把GPU設(shè)備暴露給容器。**解決**在宿主機(jī)上安裝并配置nvidia-container-toolkit然后重啟Docker確認(rèn)docker info里出現(xiàn)nvidiaruntime再在compose文件中給服務(wù)聲明GPU資源。**現(xiàn)象二**調(diào)用情感分析接口時(shí)返回CUDA out of memory。原因batch_size和max_seq_len組合之下顯存超限。有些平臺(tái)會(huì)同時(shí)在NLP API容器里加載多個(gè)模型NER、情感分析、術(shù)語(yǔ)抽取顯存被并行服務(wù)吃滿。**解決**把同時(shí)加載的模型拆到不同服務(wù)或者給每個(gè)模型設(shè)置獨(dú)立的GPU。先在batch_size8、max_seq_len256下跑通再逐步上調(diào)直到顯存占用穩(wěn)定在90%以內(nèi)。5.2 數(shù)據(jù)與圖譜效果排查OCR亂碼、頁(yè)面抓取、實(shí)體重復(fù)和情感偏移**現(xiàn)象一**掃描版PDF識(shí)別出來(lái)全是方塊或亂碼。**原因**OCR容器鏡像里沒(méi)有中文字體庫(kù)Tesseract識(shí)別出字符但渲染時(shí)找不到字形。**解決**在Dockerfile里安裝fonts-noto-cjk然后重新加載字體緩存。這是最常見(jiàn)的“黑匣子”級(jí)問(wèn)題表面是識(shí)別差實(shí)際是缺字體。**現(xiàn)象二**網(wǎng)頁(yè)解析只拿到登錄框和導(dǎo)航正文是空的。**原因**目標(biāo)網(wǎng)站是動(dòng)態(tài)渲染的單頁(yè)應(yīng)用普通requests抓不到執(zhí)行JavaScript之后生成的DOM。**解決**接入層改用Playwright無(wú)頭瀏覽器預(yù)渲染等待網(wǎng)絡(luò)空閑后再取正文。注意抓取頻率要設(shè)限否則會(huì)被目標(biāo)網(wǎng)站封IP。**現(xiàn)象三**知識(shí)圖譜里“蘋(píng)果”和“Apple”出現(xiàn)兩個(gè)節(jié)點(diǎn)明明是一個(gè)實(shí)體。**原因**實(shí)體識(shí)別后的結(jié)果沒(méi)有做實(shí)體對(duì)齊同義詞、別名和多語(yǔ)言名稱沒(méi)有歸一化。**解決**在寫(xiě)入Neo4j之前先跑一遍實(shí)體規(guī)范化小寫(xiě)化、去空格、同義詞映射表再用字符串相似度做模糊合并。**現(xiàn)象四**情感分析在維修工單上幾乎全是正面結(jié)果。**原因**預(yù)訓(xùn)練情感模型來(lái)自互聯(lián)網(wǎng)評(píng)論語(yǔ)料“維修”“故障”“報(bào)錯(cuò)”這些詞在那種語(yǔ)料里不代表負(fù)面情緒所以模型學(xué)偏了。**解決**準(zhǔn)備幾百條真實(shí)工單標(biāo)注正/中/負(fù)做領(lǐng)域微調(diào)。如果標(biāo)注資源不夠至少做一個(gè)領(lǐng)域詞典映射把“報(bào)錯(cuò)”“停機(jī)”一類(lèi)詞強(qiáng)制關(guān)聯(lián)為負(fù)面。**現(xiàn)象五**實(shí)體識(shí)別在長(zhǎng)文檔上丟失后半段信息。**原因**平臺(tái)默認(rèn)max_seq_len只有128超過(guò)部分被截?cái)喽P(guān)鍵實(shí)體往往分布在文檔中間。**解決**拉長(zhǎng)max_seq_len到512同時(shí)開(kāi)啟滑窗重疊讓每段文本有前后文感知。代價(jià)是推理時(shí)間變長(zhǎng)可以用并行請(qǐng)求緩解。6. 用一套自建評(píng)測(cè)集判斷平臺(tái)值不值得投入判斷一個(gè)本地化NLP平臺(tái)好不好不能只看廠商演示。我落地時(shí)會(huì)先建一個(gè)小型評(píng)測(cè)集找100條真實(shí)業(yè)務(wù)文檔分別標(biāo)注實(shí)體邊界、實(shí)體類(lèi)型和情感標(biāo)簽。然后寫(xiě)一段腳本用平臺(tái)的API跑批算精確率、召回率和F1。# evaluate.py - 簡(jiǎn)單F1評(píng)估 def evaluate(gold, pred): tp len(set(gold) set(pred)) fp len(set(pred) - set(gold)) fn len(set(gold) - set(pred)) p tp / (tp fp 0.01) r tp / (tp fn 0.01) return 2 * p * r / (p r 0.01), p, r這里的gold和pred是實(shí)體(文本, 類(lèi)型)元組的集合。如果平臺(tái)在中文公司名上F1低于0.85建議優(yōu)先做微調(diào)而不是換平臺(tái)。評(píng)測(cè)集要覆蓋三種難度標(biāo)準(zhǔn)新聞、OCR質(zhì)量差的掃描件、大量數(shù)字代碼的工單。三者的F1差距過(guò)大說(shuō)明平臺(tái)泛化不行。我自己的教訓(xùn)是第一次部署這類(lèi)平臺(tái)時(shí)過(guò)度關(guān)注情感分析的準(zhǔn)確率反復(fù)調(diào)模型結(jié)果發(fā)現(xiàn)知識(shí)圖譜里實(shí)體重復(fù)率高得驚人一半以上的查詢結(jié)果都帶著冗余節(jié)點(diǎn)。后來(lái)才把重心放到實(shí)體對(duì)齊和本體Schema上。先讓數(shù)據(jù)底座干凈上層應(yīng)用才有意義。如果你現(xiàn)在正準(zhǔn)備選型建議用這份評(píng)測(cè)集思路去試壓而不是光看演示效果。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取