本專案連結:https://aistudio.baidu.com/aistudio/projectdetail/5423713?contributionType=1
文字匹配任務在自然語言處理中是非常重要的基礎任務之一,一般研究兩段文字之間的關係。有很多應用場景;如資訊檢索、問答系統、智慧對話、文字鑑別、智慧推薦、文字資料去重、文字相似度計算、自然語言推理、問答系統、資訊檢索等,但文字匹配或者說自然語言處理仍然存在很多難點。這些自然語言處理任務在很大程度上都可以抽象成文字匹配問題,比如資訊檢索可以歸結為搜尋詞和檔案資源的匹配,問答系統可以歸結為問題和候選答案的匹配,複述問題可以歸結為兩個同義句的匹配。
本專案主要圍繞著特定領域知識圖譜(Domain-specific KnowledgeGraph:DKG)融合方案:文字匹配演演算法、知識融合學術界方案、知識融合業界落地方案、演演算法測評KG生產質量保障講解了文字匹配演演算法的綜述,從經典的傳統模型到孿生神經網路「雙塔模型」再到預訓練模型以及有監督無監督聯合模型,期間也涉及了近幾年前沿的對比學習模型,之後提出了文字匹配技巧提升方案,最終給出了DKG的落地方案。這邊主要以原理講解和技術方案闡述為主,之後會慢慢把專案開源出來,一起共建KG,從知識抽取到知識融合、知識推理、質量評估等爭取走通完整的流程。
https://aistudio.baidu.com/aistudio/projectdetail/5398069?contributionType=1
在前面技術知識下可以看看後續的實際業務落地方案和學術方案
關於圖神經網路的知識融合技術學習參考下面連結:PGL圖學習專案合集&資料集分享&技術歸納業務落地技巧[系列十]
從入門知識到經典圖演演算法以及進階圖演演算法等,自行查閱食用!
文章篇幅有限請參考專欄按需查閱:NLP知識圖譜相關技術業務落地方案和碼源
方案連結:https://blog.csdn.net/sinat_39620217/article/details/128614951
方案連結:https://blog.csdn.net/sinat_39620217/article/details/128673963
方案連結:https://blog.csdn.net/sinat_39620217/article/details/128674429
方案連結:https://blog.csdn.net/sinat_39620217/article/details/128674929
方案連結:https://blog.csdn.net/sinat_39620217/article/details/128675199
論文資料連結:兩份內容不相同,且按照序號從小到大重要性依次遞減
知識圖譜實體對齊資料論文參考(PDF)+實體對齊方案+特定領域知識圖譜知識融合方案(實體對齊)
知識圖譜實體對齊資料論文參考(CAJ)+實體對齊方案+特定領域知識圖譜知識融合方案(實體對齊)
方案連結:https://blog.csdn.net/sinat_39620217/article/details/128675698
短文字語意匹配(SimilarityNet, SimNet)是一個計算短文字相似度的框架,可以根據使用者輸入的兩個文字,計算出相似度得分。 SimNet框架主要包括BOW、CNN、RNN、MMDNN等核心網路結構形式,提供語意相似度計算訓練和預測框架, 適用於資訊檢索、新聞推薦、智慧客服等多個應用場景解決語意匹配問題。
模型簡介:
通過呼叫Seq2Vec中內建的模型進行序列建模,完成句子的向量表示。包含最簡單的詞袋模型和一系列經典的RNN類模型。
詳情可以檢視SimNet檔案下的encoder檔案 or 參考:https://github.com/PaddlePaddle/PaddleNLP/tree/develop/paddlenlp/seq2vec
__all__ = ["BoWEncoder", "CNNEncoder", "GRUEncoder", "LSTMEncoder", "RNNEncoder", "TCNEncoder"]
模型 | 模型介紹 |
---|---|
BOW(Bag Of Words) | 非序列模型,將句子表示為其所包含詞的向量的加和 |
CNN | 序列模型,使用折積操作,提取區域性區域地特徵 |
GRU(Gated Recurrent Unit) | 序列模型,能夠較好地解決序列文字中長距離依賴的問題 |
LSTM(Long Short Term Memory) | 序列模型,能夠較好地解決序列文字中長距離依賴的問題 |
Temporal Convolutional Networks (TCN) | 序列模型,能夠更好地解決序列文字中長距離依賴的問題 |
Temporal Convolutional Networks (TCN)時間折積網路,18年提出的時序折積神經網路模型用來解決時間序列預測的演演算法。其中,時序問題建模通常採用RNN迴圈神經網路及其相關變種,比如LSTM、GRU等,這裡將折積神經網路通過膨脹折積達到抓取長時依賴資訊的效果,TCN在一些任務上甚至能超過RNN相關模型。
作為一個新的序列分析 model 它的特點主要有兩個:
論文連結:https://arxiv.org/pdf/1803.01271.pdf
github連結:https://github.com/LOCUSLAB/tcn
時序問題的建模大家一般習慣性的採用迴圈神經網路(RNN)來建模,這是因為RNN天生的迴圈自迴歸的結構是對時間序列的很好的表示。傳統的折積神經網路一般認為不太適合時序問題的建模,這主要由於其折積核大小的限制,不能很好的抓取長時的依賴資訊。 但是最近也有很多的工作顯示,特定的折積神經網路結構也可以達到很好的效果,比如Goolgle提出的用來做語音合成的wavenet,Facebook提出的用來做翻譯的折積神經網路。這就帶來一個問題,用折積來做神經網路到底是隻適用於特定的領域還是一種普適的模型? 本文就帶著這個問題,將一種特殊的折積神經網路——時序折積網路(Temporal convolutional network, TCN)與多種RNN結構相對比,發現在多種任務上TCN都能達到甚至超過RNN模型。
因果折積可以用上圖直觀表示。 即對於上一層t時刻的值,只依賴於下一層t時刻及其之前的值。和傳統的折積神經網路的不同之處在於,因果折積不能看到未來的資料,它是單向的結構,不是雙向的。也就是說只有有了前面的因才有後面的果,是一種嚴格的時間約束模型,因此被成為因果折積。
單純的因果折積還是存在傳統折積神經網路的問題,即對時間的建模長度受限於折積核大小的,如果要想抓去更長的依賴關係,就需要線性的堆疊很多的層。為了解決這個問題,研究人員提出了膨脹折積。如下圖a所示。
上圖b、c所示
殘差連結被證明是訓練深層網路的有效方法,它使得網路可以以跨層的方式傳遞資訊。本文構建了一個殘差塊來代替一層的折積。如上圖所示,一個殘差塊包含兩層的折積和非線性對映,在每層中還加入了WeightNorm和Dropout來正則化網路。
總體來講,TCN模型上的創新並不是很大,因果折積和擴充套件折積也並不是本論文提出來,本文主要是將TCN的結構梳理了一下,相比於wavenet中的結構,去掉了門機制,加入了殘差結構,並在很多的序列問題上進行了實驗。實驗效果如下:
在多個任務上,都比標準的LSTM、GRU等效果好。
其餘模擬結果:
優點 :
(1)並行性。當給定一個句子時,TCN可以將句子並行的處理,而不需要像RNN那樣順序的處理。
(2)靈活的感受野。TCN的感受野的大小受層數、折積核大小、擴張係數等決定。可以根據不同的任務不同的特性靈活客製化。
(3)穩定的梯度。RNN經常存在梯度消失和梯度爆炸的問題,這主要是由不同時間段上共用引數導致的,和傳統折積神經網路一樣,TCN不太存在梯度消失和爆炸問題。
(4)記憶體更低。RNN在使用時需要將每步的資訊都儲存下來,這會佔據大量的記憶體,TCN在一層裡面折積核是共用的,記憶體使用更低。
缺點:
(1)TCN 在遷移學習方面可能沒有那麼強的適應能力。這是因為在不同的領域,模型預測所需要的歷史資訊量可能是不同的。因此,在將一個模型從一個對記憶資訊需求量少的問題遷移到一個需要更長記憶的問題上時,TCN 可能會表現得很差,因為其感受野不夠大。
(2)論文中描述的TCN還是一種單向的結構,在語音識別和語音合成等任務上,純單向的結構還是相當有用的。但是在文字中大多使用雙向的結構,當然將TCN也很容易擴充套件成雙向的結構,不使用因果折積,使用傳統的折積結構即可。
(3)TCN畢竟是折積神經網路的變種,雖然使用擴充套件折積可以擴大感受野,但是仍然受到限制,相比於Transformer那種可以任意長度的相關資訊都可以抓取到的特性還是差了點。TCN在文字中的應用還有待檢驗。
參考連結:
https://blog.csdn.net/qq_27586341/article/details/90751794
程式碼說明:
simnet/
├── model.py # 模型組網
├── predict.py # 模型預測
├── utils.py # 資料處理工具
├── train.py # 訓練模型主程式入口,包括訓練、評估
程式執行時將會自動進行訓練,評估,測試。同時訓練過程中會自動儲存模型在指定的save_dir中。 如:
checkpoints_simnet_lstm/
├── 0.pdopt
├── 0.pdparams
├── 1.pdopt
├── 1.pdparams
├── ...
└── final.pdparams
NOTE: 如需恢復模型訓練,則init_from_ckpt只需指定到檔名即可,不需要新增檔案尾綴。如--init_from_ckpt=checkpoints/0即可,程式會自動載入模型引數checkpoints/0.pdparams,也會自動載入優化器狀態checkpoints/0.pdopt。
部分結果展示:
step 1790/1866 - loss: 0.2604 - acc: 0.9097 - 28ms/step
step 1800/1866 - loss: 0.2853 - acc: 0.9096 - 28ms/step
step 1810/1866 - loss: 0.3007 - acc: 0.9094 - 28ms/step
step 1820/1866 - loss: 0.2607 - acc: 0.9094 - 28ms/step
step 1830/1866 - loss: 0.3522 - acc: 0.9093 - 28ms/step
step 1840/1866 - loss: 0.2478 - acc: 0.9092 - 28ms/step
step 1850/1866 - loss: 0.2186 - acc: 0.9092 - 28ms/step
step 1860/1866 - loss: 0.1786 - acc: 0.9091 - 28ms/step
step 1866/1866 - loss: 0.2358 - acc: 0.9091 - 28ms/step
save checkpoint at /home/aistudio/SimNet/checkpoints_simnet_lstm/4
Eval begin...
step 10/69 - loss: 0.5209 - acc: 0.7336 - 31ms/step
step 20/69 - loss: 0.9080 - acc: 0.7352 - 34ms/step
step 30/69 - loss: 0.9188 - acc: 0.7352 - 34ms/step
step 40/69 - loss: 0.9328 - acc: 0.7393 - 34ms/step
step 50/69 - loss: 0.5988 - acc: 0.7398 - 32ms/step
step 60/69 - loss: 0.5592 - acc: 0.7367 - 32ms/step
step 69/69 - loss: 0.6573 - acc: 0.7384 - 30ms/step
啟動預測
測試案例可以在output檔案下test_1中有125000待預測結果,
{"query": "誰有狂三這張高清的", "title": "這張高清圖,誰有", "label": ""}
{"query": "英雄聯盟什麼英雄最好", "title": "英雄聯盟最好英雄是什麼", "label": ""}
{"query": "這是什麼意思,被蹭網嗎", "title": "我也是醉了,這是什麼意思", "label": ""}
{"query": "現在有什麼動畫片好看呢?", "title": "現在有什麼好看的動畫片嗎?", "label": ""}
{"query": "請問晶達電子廠現在的工資待遇怎麼樣要求有哪些", "title": "三星電子廠工資待遇怎麼樣啊", "label": ""}
{"query": "文章真的愛姚笛嗎", "title": "姚笛真的被文章幹了嗎", "label": ""}
{"query": "送自己做的閨蜜什麼生日禮物好", "title": "送閨蜜什麼生日禮物好", "label": ""}
{"query": "近期上映的電影", "title": "近期上映的電影有哪些", "label": ""}
{"query": "求英雄聯盟大神帶?", "title": "英雄聯盟,求大神帶~", "label": ""}
{"query": "如加上什麼部首", "title": "給東加上部首是什麼字?", "label": ""}
{"query": "杭州哪裡好玩", "title": "杭州哪裡好玩點", "label": ""}
{"query": "這是什麼烏龜值錢嗎", "title": "這是什麼烏龜!值錢嘛?", "label": ""}
{"query": "心各有所屬是什麼意思?", "title": "心有所屬是什麼意思?", "label": ""}
{"query": "什麼東西越熱爬得越高", "title": "什麼東西越熱爬得很高", "label": ""}
{"query": "世界盃哪位球員進球最多", "title": "世界盃單界進球最多是哪位球員", "label": ""}
{"query": "韭菜多吃什麼好處", "title": "多吃韭菜有什麼好處", "label": ""}
{"query": "雲賺錢怎麼樣", "title": "怎麼才能賺錢", "label": ""}
{"query": "何炅結婚了嘛", "title": "何炅結婚了麼", "label": ""}
{"query": "長的清新是什麼意思", "title": "小清新的意思是什麼", "label": ""}
如果需要批次預測自行修改程式碼,data部分。
模型 | train acc | dev acc |
---|---|---|
BoW | 0.8836 | 0.7297 |
CNN | 0.9517 | 0.7352 |
GRU | 0.9124 | 0.7489 |
LSTM | 0.9091 | 0.7384 |
TCN | ---- | ---- |
RNN | ---- | ---- |
關於RNN、TCN自行修改model檔案即可,參考/home/aistudio/SimNet/encoder.py 修改/home/aistudio/SimNet/model.py
CNN:
BOW:
GRU:
LSTM:
抽樣結果還是顯而易見的,越新的演演算法一般越優越。
本專案連結:https://aistudio.baidu.com/aistudio/projectdetail/5423713?contributionType=1
SimCSE 模型適合缺乏監督資料,但是又有大量無監督資料的匹配和檢索場景。
相關原理參考專案:https://aistudio.baidu.com/aistudio/projectdetail/5398069?contributionType=1 第4.2.4節 SimSCE 2021.04
下面將分別使用 LCQMC、BQ_Corpus、STS-B、ATEC 這 4 箇中文語意匹配資料集的訓練集作為無監督訓練集(僅使用文字資訊,不使用 Label),並且在各自資料集上的驗證集上進行效果評估,評估指標採用 SimCSE 論文中採用的 Spearman 相關係數,Spearman 相關係數越高,表示模型效果越好. 壓縮包名稱:senteval_cn
simcse/
├── model.py # SimCSE 模型組網程式碼
├── data.py # 無監督語意匹配訓練資料、測試資料的讀取邏輯
├── predict.py # 基於訓練好的無監督語意匹配模型計算文字 Pair 相似度
├── train.sh # 模型訓練的指令碼
└── train.py # SimCSE 模型訓練、評估邏輯
我們以中文文字匹配公開資料集 LCQMC 為範例資料集, 僅使用 LCQMC 的文字資料構造生成了無監督的訓練資料。可以執行如下命令,開始模型訓練並且在 LCQMC 的驗證集上進行 Spearman 相關係數評估。
%cd SimCSE
!unset CUDA_VISIBLE_DEVICES
!python -u -m paddle.distributed.launch --gpus '0' \
train.py \
--device gpu \
--save_dir ./checkpoints_simcse/ \
--batch_size 64 \
--learning_rate 5E-5 \
--epochs 1 \
--save_steps 100 \
--eval_steps 100 \
--max_seq_length 64 \
--dropout 0.3 \
--train_set_file "/home/aistudio/LCQMC/train.txt" \
--test_set_file "/home/aistudio/LCQMC/dev.tsv"
部分結果展示:
[2023-02-01 10:22:15,087] [ INFO] - tokenizer config file saved in ./checkpoints_simcse/model_1900/tokenizer_config.json
[2023-02-01 10:22:15,088] [ INFO] - Special tokens file saved in ./checkpoints_simcse/model_1900/special_tokens_map.json
global step 1910, epoch: 1, batch: 1910, loss: 0.03640, speed: 0.95 step/s
global step 1920, epoch: 1, batch: 1920, loss: 0.03480, speed: 6.70 step/s
global step 1930, epoch: 1, batch: 1930, loss: 0.00650, speed: 7.08 step/s
global step 1940, epoch: 1, batch: 1940, loss: 0.00571, speed: 6.75 step/s
global step 1950, epoch: 1, batch: 1950, loss: 0.00966, speed: 6.28 step/s
global step 1960, epoch: 1, batch: 1960, loss: 0.01481, speed: 6.54 step/s
global step 1970, epoch: 1, batch: 1970, loss: 0.00974, speed: 6.42 step/s
global step 1980, epoch: 1, batch: 1980, loss: 0.03734, speed: 6.67 step/s
global step 1990, epoch: 1, batch: 1990, loss: 0.00716, speed: 6.68 step/s
global step 2000, epoch: 1, batch: 2000, loss: 0.01359, speed: 7.04 step/s
global step: 2000, spearman_corr: 0.4231, total_num: 8802
設定的引數:
infer_with_fc_pooler:可選,在預測階段計算文字 embedding 表示的時候網路前向是否會過訓練階段最後一層的 fc; 建議關閉模型效果最好。
dup_rate: 可選,word reptition 的比例,預設是0.32,根據論文 Word Repetition 比例採用 0.32 效果最佳。
scale:可選,在計算 cross_entropy loss 之前對 cosine 相似度進行縮放的因子;預設為 20。
dropout:可選,SimCSE 網路前向使用的 dropout 取值;預設 0.1。
save_dir:可選,儲存訓練模型的目錄;預設儲存在當前目錄checkpoints資料夾下。
max_seq_length:可選,ERNIE-Gram 模型使用的最大序列長度,最大不能超過512, 若出現視訊記憶體不足,請適當調低這一引數;預設為128。
batch_size:可選,批次處理大小,請結合視訊記憶體情況進行調整,若出現視訊記憶體不足,請適當調低這一引數;預設為32。
learning_rate:可選,Fine-tune的最大學習率;預設為5e-5。
weight_decay:可選,控制正則項力度的引數,用於防止過擬合,預設為0.0。
epochs: 訓練輪次,預設為1。
warmup_proption:可選,學習率warmup策略的比例,如果0.1,則學習率會在前10%訓練step的過程中從0慢慢增長到learning_rate, 而後再緩慢衰減,預設為0.0。
init_from_ckpt:可選,模型引數路徑,熱啟動模型訓練;預設為None。
seed:可選,隨機種子,預設為1000.
device: 選用什麼裝置進行訓練,可選cpu或gpu。如使用gpu訓練則引數gpus指定GPU卡號。
程式執行時將會自動進行訓練,評估。同時訓練過程中會自動儲存模型在指定的save_dir中。 如:
checkpoints/
├── model_100
│ ├── model_state.pdparams
│ ├── tokenizer_config.json
│ └── vocab.txt
└── ...
NOTE:如需恢復模型訓練,則可以設定init_from_ckpt, 如init_from_ckpt=checkpoints/model_100/model_state.pdparams。
我們用 LCQMC 的測試集作為預測資料, 測試資料範例如下:
誰有狂三這張高清的 這張高清圖,誰有
英雄聯盟什麼英雄最好 英雄聯盟最好英雄是什麼
這是什麼意思,被蹭網嗎 我也是醉了,這是什麼意思
現在有什麼動畫片好看呢? 現在有什麼好看的動畫片嗎?
請問晶達電子廠現在的工資待遇怎麼樣要求有哪些 三星電子廠工資待遇怎麼樣啊
所有資料集可自行調整執行,超引數也可自行調優,下面展示部分結果:
模型 | LCQMC | BQ_Corpus | STS-B | ATEC |
---|---|---|---|---|
SimCSE | 57.01 | 51.72 | 74.76 | 33.56 |
SimCSE + WR | 58.97 | 51.58 | 78.32 | 33.73 |
資料集 | epoch | learning rate | dropout | dup rate |
---|---|---|---|---|
LCQMC | 1 | 5E-5 | 0.3 | 0.32 |
BQ_Corpus | 1 | 1E-5 | 0.3 | 0.32 |
STS-B | 8 | 5E-5 | 0.1 | 0.32 |
ATEC | 1 | 5E-5 | 0.3 | 0.32 |
相關原理參考專案:https://aistudio.baidu.com/aistudio/projectdetail/5398069?contributionType=1 第4.2.9節 DiffSCE 2022.04
相比於 SimCSE 模型,DiffCSE模型會更關注語句之間的差異性,具有精確的向量表示能力。DiffCSE 模型同樣適合缺乏監督資料,但是又有大量無監督資料的匹配和檢索場景。
程式碼結構:
DiffCSE/
├── model.py # DiffCSE 模型組網程式碼
├── custom_ernie.py # 為適配 DiffCSE 模型,對ERNIE模型進行了部分修改
├── data.py # 無監督語意匹配訓練資料、測試資料的讀取邏輯
├── run_diffcse.py # 模型訓練、評估、預測的主指令碼
├── utils.py # 包括一些常用的工具式函數
├── run_train.sh # 模型訓練的指令碼
├── run_eval.sh # 模型評估的指令碼
└── run_infer.sh # 模型預測的指令碼
預設使用無監督模式進行訓練 DiffCSE,模型訓練資料的資料樣例如下所示,每行表示一條訓練樣本:
全年地方財政總收入3686.81億元,比上年增長12.3%。
「我對案情並不十分清楚,所以沒辦法提出批評,建議,只能希望通過質詢,要求檢察院對此做出說明。」他說。
據調查結果顯示:2015年微商行業總體市場規模達到1819.5億元,預計2016年將達到3607.3億元,增長率為98.3%。
前往岡仁波齊需要辦理目的地包含日喀則和阿里地區的邊防證,外轉沿途有一些補給點,可購買到乾糧和飲料。
資料集以及相關指標參考:Chinese-STS-B資料集,共包含0到5的6個標籤,數位越大表示文字對越相似。在資料處理過程中,將標籤為5的文字對當作匹配文字對(標記為1),將標籤為0-2的文字對當作不匹配文字對(標記為0)。
https://zhuanlan.zhihu.com/p/388680608
https://zhuanlan.zhihu.com/p/454173790
部分展示
一個戴著安全帽的男人在跳舞。 一個戴著安全帽的男人在跳舞。 5
一個小孩在騎馬。 孩子在騎馬。 4
一個女人在彈吉他。 一個人在彈吉他。 2
一個女人在切洋蔥。 一個人在切洋蔥。 2
一個女人在吹長笛。 一個人在吹長笛。 2
一個男人在擦粉筆。 那人在擦粉筆。 5
一個女人抱著一個男孩。 一個女人懷了她的孩子。 2
女人剝土豆。 一個女人在剝土豆。 5
人們在玩板球。 男人們在打板球。 3
一個男人在彈吉他。 一個人在吹長笛。 1
美洲獅在追熊。 一隻美洲獅正在追趕一隻熊。 5
那人在彈吉他。 一個男人在彈吉他。 4
一個男人在找東西。 一個女人在切東西。 0
女孩對著麥克風唱歌。 這位女士對著麥克風唱歌。 2
一個男人在爬繩子。 一個男人爬上一根繩子。 5
小貓在吃東西。 小貓從盤子裡吃東西。 4
評測指標:斯皮爾曼等級相關係數Spearman's rank correlation coefficient把句子對分別輸入模型編碼得到embedding對後,計算embedding對的餘弦距離。由於STS-B資料集是把句子對進行0~5的打分,所以評測指標採用斯皮爾曼等級相關係數。
模型 | LCQMC | STS-B |
---|---|---|
Simcse | 58.97% | 74.58 |
Diffcse | 63.23% | 71.79(未調優) |
調優過程可以參考文章:
https://zhuanlan.zhihu.com/p/388680608
整體看出Diffcse優於Simcse
文字匹配任務在自然語言處理中是非常重要的基礎任務之一,一般研究兩段文字之間的關係。有很多應用場景;如資訊檢索、問答系統、智慧對話、文字鑑別、智慧推薦、文字資料去重、文字相似度計算、自然語言推理、問答系統、資訊檢索等,但文字匹配或者說自然語言處理仍然存在很多難點。這些自然語言處理任務在很大程度上都可以抽象成文字匹配問題,比如資訊檢索可以歸結為搜尋詞和檔案資源的匹配,問答系統可以歸結為問題和候選答案的匹配,複述問題可以歸結為兩個同義句的匹配。
本專案主要圍繞著特定領域知識圖譜(Domain-specific KnowledgeGraph:DKG)融合方案:文字匹配演演算法、知識融合學術界方案、知識融合業界落地方案、演演算法測評KG生產質量保障講解了文字匹配演演算法的綜述,從經典的傳統模型到孿生神經網路「雙塔模型」再到預訓練模型以及有監督無監督聯合模型,期間也涉及了近幾年前沿的對比學習模型,之後提出了文字匹配技巧提升方案,最終給出了DKG的落地方案。這邊主要以原理講解和技術方案闡述為主,之後會慢慢把專案開源出來,一起共建KG,從知識抽取到知識融合、知識推理、質量評估等爭取走通完整的流程。
本專案連結:https://aistudio.baidu.com/aistudio/projectdetail/5423713?contributionType=1