主頁 >  其他 > 自然語言處理 Paddle NLP - 快遞單資訊抽取 (ERNIE 1.0)

自然語言處理 Paddle NLP - 快遞單資訊抽取 (ERNIE 1.0)

2023-06-20 08:46:25 其他

檔案檢索:需要把業務問題拆解成子任務,文本分類 -> 文本匹配 -> 等任務 -> Panddle API 完成子任務 -> 子任務再拼起來

介紹

在2017年之前,工業界和學術界對文本處理依賴于序列模型Recurrent Neural Network (RNN).



圖1:RNN示意圖

基于BiGRU+CRF的快遞單資訊抽取專案介紹了如何使用序列模型完成快遞單資訊抽取任務,

近年來隨著深度學習的發展,模型引數的數量飛速增長,為了訓練這些引數,需要更大的資料集來避免過擬合,然而,對于大部分NLP任務來說,構建大規模的標注資料集非常困難(成本過高),特別是對于句法和語意相關的任務,相比之下,大規模的未標注語料庫的構建則相對容易,為了利用這些資料,我們可以先從其中學習到一個好的表示,再將這些表示應用到其他任務中,最近的研究表明,基于大規模未標注語料庫的預訓練模型(Pretrained Models, PTM) 在NLP任務上取得了很好的表現,

近年來,大量的研究表明基于大型語料庫的預訓練模型(Pretrained Models, PTM)可以學習通用的語言表示,有利于下游NLP任務,同時能夠避免從零開始訓練模型,隨著計算能力的不斷提高,深度模型的出現(即 Transformer)和訓練技巧的增強使得 PTM 不斷發展,由淺變深,



圖2:預訓練模型一覽,圖片來源于:https://github.com/thunlp/PLMpapers

本示例展示了以ERNIE(Enhanced Representation through Knowledge Integration)為代表的預訓練模型如何Finetune完成序列標注任務,

物體定義標注

命名物體識別是NLP中一項非常基礎的任務,是資訊提取、問答系統、句法分析、機器翻譯等眾多NLP任務的重要基礎工具,命名物體識別的準確度,決定了下游任務的效果,是NLP中的一個基礎問題,在NER任務提供了兩種解決方案,一類LSTM/GRU + CRF,通過RNN類的模型來抽取底層文本的資訊,而CRF(條件隨機場)模型來學習底層Token之間的聯系;另外一類是通過預訓練模型,例如ERNIE,BERT模型,直接來預測Token的標簽資訊,

本專案將演示如何使用PaddleNLP語意預訓練模型ERNIE完成從快遞單中抽取姓名、電話、省、市、區、詳細地址等內容,形成結構化資訊,輔助物流行業從業者進行有效資訊的提取,從而降低客戶填單的成本,

典型的命名物體識別(Named Entity Recognition,NER)場景,各物體型別及相應符號表示見下表:

張三18625584663廣東省深圳市南山區百度國際大廈
人工定義物體,標注符號

抽取物體/欄位 符號 抽取結果
姓名 P 張三
電話 N 13812345678
A1 廣東省
A2 深圳市
A3 南山區
詳細地址 A4 百度國際大廈

在序列標注任務中,一般會定義一個標簽集合,來表示所以可能取到的預測結果,上文中針對需要抽取的“姓名、電話、省、市、區、詳細地址”等物體,標簽集合可以定義為:
label={P-B,P-I,T-B,T-I,A1-B,A1-I,A2-B,A2-I,A3-B,A3-I,A4-B,A4-I,0)

標簽 定義
P-B 姓名起始位置
P-I 姓名中間位置或結束位置
T-B 電話起始位置
T-I 電話中間位置或結束位置
A1-B 省份起始位置
A1-I 省份中間位置或結束位置
A2-B 城市起始位置
A2-I 城市中間位置或結束位置
A3-B 縣區起始位置
A3-I 縣區中間位置或結束位置
A4-B 詳細地址起始位置
A4-I 詳細地址中間位置或結束位置
O 無關字符

注意每個標簽的結果只有 B、I、O 三種,這種標簽的定義方式叫做 BIO 體系,BIO(B-begin,I-inside,O-other) 標簽轉換,
B:表示一個標簽類別的開頭,比如 P-B 指的是姓名的開頭
I:中間或結束,表示一個標簽的延續
O:不想抽取的,無用的物體
對于句子“張三18625584663廣東省深圳市南山區百度國際大廈”,每個漢字及對應標簽為:


圖3:資料集標注示例

注意到“張“,”三”在這里表示成了“P-B” 和 “P-I”,“P-B”和“P-I”合并成“P” 這個標簽,這樣重新組合后可以得到以下資訊抽取結果:

張三 18625584663 廣東省 深圳市 南山區 百度國際大廈
P T A1 A2 A3 A4

準備

# 下載并解壓資料集
from paddle.utils.download import get_path_from_url
URL = "https://paddlenlp.bj.bcebos.com/paddlenlp/datasets/waybill.tar.gz"
get_path_from_url(URL, "./")

# 查看預測的資料
!head -n 5 data/test.txt
text_a	label
黑龍江省雙鴨山市尖山區八馬路與東平行路交叉口北40米韋業濤18600009172	A1-BA1-IA1-IA1-IA2-BA2-IA2-IA2-IA3-BA3-IA3-IA4-BA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IP-BP-IP-IT-BT-IT-IT-IT-IT-IT-IT-IT-IT-IT-I
廣西壯族自治區桂林市雁山區雁山鎮西龍村老年活動中心17610348888羊卓衛	A1-BA1-IA1-IA1-IA1-IA1-IA1-IA2-BA2-IA2-IA3-BA3-IA3-IA4-BA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IT-BT-IT-IT-IT-IT-IT-IT-IT-IT-IT-IP-BP-IP-I
15652864561河南省開封市順河回族區順河區公園路32號趙本山	T-BT-IT-IT-IT-IT-IT-IT-IT-IT-IT-IA1-BA1-IA1-IA2-BA2-IA2-IA3-BA3-IA3-IA3-IA3-IA4-BA4-IA4-IA4-IA4-IA4-IA4-IA4-IA4-IP-BP-IP-I
河北省唐山市玉田縣無終大街159號18614253058尚漢生	A1-BA1-IA1-IA2-BA2-IA2-IA3-BA3-IA3-IA4-BA4-IA4-IA4-IA4-IA4-IA4-IA4-IT-BT-IT-IT-IT-IT-IT-IT-IT-IT-IT-IP-BP-IP-I
from functools import partial
import paddle
from paddlenlp.datasets import MapDataset
from paddlenlp.data import Stack, Tuple, Pad
from paddlenlp.transformers import ErnieTokenizer, ErnieForTokenClassification
from paddlenlp.metrics import ChunkEvaluator # 詞與塊的指標 不是 A1-B 對了就算對,A1-B~A1I 全對了才算對
from utils import convert_example, evaluate, predict, load_dict

加載自定義資料集

推薦使用MapDataset()自定義資料集,

def load_dataset_1(datafiles):
    def read(data_path):
        with open(data_path, 'r', encoding='utf-8') as fp:
            next(fp)  # Skip header
            for line in fp.readlines():
                words, labels = line.strip('\n').split('\t')
                words = words.split('\002')
                labels = labels.split('\002')
                yield words, labels

    if isinstance(datafiles, str):
        return MapDataset(list(read(datafiles)))
    elif isinstance(datafiles, list) or isinstance(datafiles, tuple):
        return [MapDataset(list(read(datafile))) for datafile in datafiles]

# Create dataset, tokenizer and dataloader.
train_ds, dev_ds, test_ds = load_dataset_1(datafiles=(
        './data/train.txt', './data/dev.txt', './data/test.txt'))

for i in range(5):
    print(train_ds[i])
(['1', '6', '6', '2', '0', '2', '0', '0', '0', '7', '7', '宣', '榮', '嗣', '甘', '肅', '省', '白', '銀', '市', '會', '寧', '縣', '河', '畔', '鎮', '十', '字', '街', '金', '海', '超', '市', '西', '行', '5', '0', '米'], ['T-B', 'T-I', 'T-I', 'T-I', 'T-I', 'T-I', 'T-I', 'T-I', 'T-I', 'T-I', 'T-I', 'P-B', 'P-I', 'P-I', 'A1-B', 'A1-I', 'A1-I', 'A2-B', 'A2-I', 'A2-I', 'A3-B', 'A3-I', 'A3-I', 'A4-B', 'A4-I', 'A4-I', 'A4-I', 'A4-I', 'A4-I', 'A4-I', 'A4-I', 'A4-I', 'A4-I', 'A4-I', 'A4-I', 'A4-I', 'A4-I', 'A4-I'])
(['1', '3', '5', '5', '2', '6', '6', ...

每條資料包含一句文本和這個文本中每個漢字以及數字對應的label標簽,

之后,還需要對輸入句子進行資料處理,如切詞,映射詞表id等,

資料處理

預訓練模型ERNIE對中文資料的處理是以字為單位,PaddleNLP對于各種預訓練模型已經內置了相應的tokenizer,指定想要使用的模型名字即可加載對應的tokenizer,

tokenizer作用為將原始輸入文本轉化成模型model可以接受的輸入資料形式,




圖3:ERNIE模型示意圖

utils.py 工具類

import numpy as np
import paddle
import paddle.nn.functional as F
from paddlenlp.data import Stack, Tuple, Pad

def load_dict(dict_path):
    vocab = {}
    i = 0
    for line in open(dict_path, 'r', encoding='utf-8'):
        key = line.strip('\n')
        vocab[key] = i
        i+=1
    return vocab

def convert_example(example, tokenizer, label_vocab):
    tokens, labels = example
    tokenized_input = tokenizer(
        tokens, return_length=True, is_split_into_words=True)
    # Token '[CLS]' and '[SEP]' will get label 'O'
    labels = ['O'] + labels + ['O']
    tokenized_input['labels'] = [label_vocab[x] for x in labels]
    return tokenized_input['input_ids'], tokenized_input[
        'token_type_ids'], tokenized_input['seq_len'], tokenized_input['labels']

@paddle.no_grad()
def evaluate(model, metric, data_loader):
    model.eval()
    metric.reset()
    for input_ids, seg_ids, lens, labels in data_loader:
        logits = model(input_ids, seg_ids)
        preds = paddle.argmax(logits, axis=-1)
        n_infer, n_label, n_correct = metric.compute(None, lens, preds, labels)
        metric.update(n_infer.numpy(), n_label.numpy(), n_correct.numpy())
        precision, recall, f1_score = metric.accumulate()
    print("eval precision: %f - recall: %f - f1: %f" %
          (precision, recall, f1_score))
    model.train()

def predict(model, data_loader, ds, label_vocab):
    pred_list = []
    len_list = []
    for input_ids, seg_ids, lens, labels in data_loader:
        logits = model(input_ids, seg_ids)
        pred = paddle.argmax(logits, axis=-1)
        pred_list.append(pred.numpy())
        len_list.append(lens.numpy())
    preds = parse_decodes(ds, pred_list, len_list, label_vocab)
    return preds

def parse_decodes(ds, decodes, lens, label_vocab):
    decodes = [x for batch in decodes for x in batch]
    lens = [x for batch in lens for x in batch]
    id_label = dict(zip(label_vocab.values(), label_vocab.keys()))

    outputs = []
    for idx, end in enumerate(lens):
        sent = ds.data[idx][0][:end]
        tags = [id_label[x] for x in decodes[idx][1:end]]
        sent_out = []
        tags_out = []
        words = ""
        for s, t in zip(sent, tags):
            if t.endswith('-B') or t == 'O':
                if len(words):
                    sent_out.append(words)
                tags_out.append(t.split('-')[0])
                words = s
            else:
                words += s
        if len(sent_out) < len(tags_out):
            sent_out.append(words)
        outputs.append(''.join(
            [str((s, t)) for s, t in zip(sent_out, tags_out)]))
    return outputs
 
def predict(model, data_loader, ds, label_vocab):
    pred_list = []
    len_list = []
    for input_ids, seg_ids, lens, labels in data_loader:
        logits = model(input_ids, seg_ids)
        pred = paddle.argmax(logits, axis=-1)
        pred_list.append(pred.numpy())
        len_list.append(lens.numpy())
    preds = parse_decodes(ds, pred_list, len_list, label_vocab)
    return preds
label_vocab = load_dict('./data/tag.dic')
tokenizer = ErnieTokenizer.from_pretrained('ernie-1.0') # 現在3.0 了

# convert_example => utils.py,先把Id讀出來,加了 CLS
# label_vocab => 13個分類  cat tag.dic
# tokenizer => ERNIE 字典里面對應的位置
trans_func = partial(convert_example, tokenizer=tokenizer, label_vocab=label_vocab)

train_ds.map(trans_func)
dev_ds.map(trans_func)
test_ds.map(trans_func)
print (train_ds[0])

資料讀入

使用paddle.io.DataLoader介面多執行緒異步加載資料,

ignore_label = -1 # 在交叉熵計算時,PAD 位,就不會參與計算,目的:為了減少計算量
batchify_fn = lambda samples, fn=Tuple(
    Pad(axis=0, pad_val=tokenizer.pad_token_id),  # input_ids
    Pad(axis=0, pad_val=tokenizer.pad_token_type_id),  # token_type_ids
    Stack(),  # seq_len
    Pad(axis=0, pad_val=ignore_label)  # labels
): fn(samples)

train_loader = paddle.io.DataLoader(
    dataset=train_ds,
    batch_size=36, # 看性能監控,空閑多的話可以調大
    return_list=True,
    collate_fn=batchify_fn)
dev_loader = paddle.io.DataLoader(
    dataset=dev_ds,
    batch_size=36,
    return_list=True,
    collate_fn=batchify_fn)
test_loader = paddle.io.DataLoader(
    dataset=test_ds,
    batch_size=36,
    return_list=True,
    collate_fn=batchify_fn)

PaddleNLP一鍵加載預訓練模型

快遞單資訊抽取本質是一個序列標注任務,PaddleNLP對于各種預訓練模型已經內置了對于下游任務文本分類Fine-tune網路,以下教程以ERNIE為預訓練模型完成序列標注任務,

paddlenlp.transformers.ErnieForTokenClassification()一行代碼即可加載預訓練模型ERNIE用于序列標注任務的fine-tune網路,其在ERNIE模型后拼接上一個全連接網路進行分類,

paddlenlp.transformers.ErnieForTokenClassification.from_pretrained()方法只需指定想要使用的模型名稱和文本分類的類別數即可完成定義模型網路,

# Define the model netword and its loss
model = ErnieForTokenClassification.from_pretrained("ernie-1.0", num_classes=len(label_vocab))

PaddleNLP不僅支持ERNIE預訓練模型,還支持BERT、RoBERTa、Electra等預訓練模型,
下表匯總了目前PaddleNLP支持的各類預訓練模型,您可以使用PaddleNLP提供的模型,完成文本分類、序列標注、問答等任務,同時我們提供了眾多預訓練模型的引數權重供用戶使用,其中包含了二十多種中文語言模型的預訓練權重,中文的預訓練模型有bert-base-chinese, bert-wwm-chinese, bert-wwm-ext-chinese, ernie-1.0, ernie-tiny, gpt2-base-cn, roberta-wwm-ext, roberta-wwm-ext-large, rbt3, rbtl3, chinese-electra-base, chinese-electra-small, chinese-xlnet-base, chinese-xlnet-mid, chinese-xlnet-large, unified_transformer-12L-cn, unified_transformer-12L-cn-luge等,

更多預訓練模型參考:PaddleNLP Transformer API,

更多預訓練模型fine-tune下游任務使用方法,請參考:examples,

設定Fine-Tune優化策略,模型配置

適用于ERNIE/BERT這類Transformer模型的遷移優化學習率策略為warmup的動態學習率,
先慢慢加速,再衰減



圖4:動態學習率示意圖

# 定義評測指標
metric = ChunkEvaluator(label_list=label_vocab.keys(), suffix=True)
loss_fn = paddle.nn.loss.CrossEntropyLoss(ignore_index=ignore_label) # 忽略標簽計算,如果都是PAD標簽參與計算,費力不討好 -1 不參與交叉熵計算
optimizer = paddle.optimizer.AdamW(learning_rate=2e-5, parameters=model.parameters())

模型訓練與評估

模型訓練的程序通常有以下步驟:

  1. 從dataloader中取出一個batch data
  2. 將batch data喂給model,做前向計算
  3. 將前向計算結果傳給損失函式,計算loss,將前向計算結果傳給評價方法,計算評價指標,
  4. loss反向回傳,更新梯度,重復以上步驟,

每訓練一個epoch時,程式將會評估一次,評估當前模型訓練的效果,

step = 0
for epoch in range(10):
    for idx, (input_ids, token_type_ids, length, labels) in enumerate(train_loader):
        logits = model(input_ids, token_type_ids)
        loss = paddle.mean(loss_fn(logits, labels))
        loss.backward()
        optimizer.step()
        optimizer.clear_grad()
        step += 1
        print("epoch:%d - step:%d - loss: %f" % (epoch, step, loss))
    evaluate(model, metric, dev_loader)

    paddle.save(model.state_dict(),
                './ernie_result/model_%d.pdparams' % step)
# model.save_pretrained('./checkpoint')
# tokenizer.save_pretrained('./checkpoint')

wc -l /data/train.txt # 1601 條訓練集

epoch:0 - step:1 - loss: 2.623411
epoch:0 - step:2 - loss: 2.393340
epoch:0 - step:3 - loss: 2.246286
epoch:0 - step:4 - loss: 2.080738
epoch:0 - step:5 - loss: 1.959701
epoch:0 - step:6 - loss: 1.842479
epoch:0 - step:7 - loss: 1.765124
epoch:0 - step:8 - loss: 1.621435
epoch:0 - step:9 - loss: 1.590034
epoch:0 - step:10 - loss: 1.503715

image

模型預測

訓練保存好的模型,即可用于預測,如以下示例代碼自定義預測資料,呼叫predict()函式即可一鍵預測,

preds = predict(model, test_loader, test_ds, label_vocab)
file_path = "ernie_results.txt"
with open(file_path, "w", encoding="utf8") as fout:
    fout.write("\n".join(preds))
# Print some examples
print(
    "The results have been saved in the file: %s, some examples are shown below: "
    % file_path)
print("\n".join(preds[:10]))

想要更準一點,可以加上 PaddleNLP提供了CRF Layer

摘要生成:中文用 GPT-2、英文用 ERNIE-GEN 模型

原文:
視頻:https://aistudio.baidu.com/aistudio/course/introduce/24177?sharedLesson=1459080&sharedType=2&sharedUserId=2631487&ts=1686018319058
專案:https://aistudio.baidu.com/aistudio/projectdetail/6333693?forkThirdPart=1&sUid=2631487&shared=1&ts=1686018298519

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/555579.html

標籤:其他

上一篇:Liunx nginx服務

下一篇:返回列表

標籤雲
其他(161300) Python(38242) JavaScript(25505) Java(18249) C(15237) 區塊鏈(8271) C#(7972) AI(7469) 爪哇(7425) MySQL(7258) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4603) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2436) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1968) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 自然語言處理 Paddle NLP - 快遞單資訊抽取 (ERNIE 1.0)

    檔案檢索:需要把業務問題拆解成子任務。文本分類 -> 文本匹配 -> 等任務 -> Panddle API 完成子任務 -> 子任務再拼起來 ## 介紹 在2017年之前,工業界和學術界對文本處理依賴于序列模型[Recurrent Neural Network (RNN)](https://baik ......

    uj5u.com 2023-06-20 08:46:25 more
  • Liunx nginx服務

    目錄 一、nginx概念 二、nginx特點 三、nginx應用場景 四、nginx和apache 五、阻塞和非阻塞 六、同步和異步 七、編譯安裝nginx 八、升級nginx 九、總結 一、nginx概念 1.nginx概念 Nginx ("engine x") 是一個高性能的 HTTP 和反向代 ......

    uj5u.com 2023-06-20 08:45:46 more
  • 云原生周刊:Dapr v1.11 發布

    ## 開源專案推薦 ### [Kamaji](https://github.com/clastix/kamaji) Kamaji 可以大規模地部署和運行 Kubernetes 控制平面,而只需承擔一小部分操作負擔。Kamaji 的特別之處在于,控制平面組件是在一個單一的 pod 中運行,而不是在專用 ......

    uj5u.com 2023-06-20 08:45:25 more
  • API網關-APISIX簡介

    本文分享自天翼云開發者社區《API網關-APISIX簡介》,作者:w****n Apache APISIX 是一個動態、實時、高性能的云原生 API 網關,提供了負載均衡、動態上游、灰度發布、服務熔斷、身份認證、可觀測性等豐富的流量管理功能。APISIX 構建于nginx+ngx_lua的技識訓礎之 ......

    uj5u.com 2023-06-20 08:45:18 more
  • 華為云鄧明昆:云原生時代,以開源賦能數字化轉型

    摘要:云原生技術以“極致彈性、分布式、松耦合、高韌性”等特征,可有效幫助企業實作基礎架構升級,業務快速創新。 近日,以“開源賦能,貧訓未來”為主題的開放原子全球開源峰會在北京亦創國際會展中心順利舉行。其中,由華為云承辦的以“探索云原生技術發展與應用實踐,賦能企業數字化轉型”為主題的2023開放原子全 ......

    uj5u.com 2023-06-20 08:45:05 more
  • Grafana 系列-GaC-2-Grafana Terraform Provider 基礎

    ## 系列文章 * [Grafana 系列文章](https://ewhisper.cn/tags/Grafana/) * [Terraform 系列文章](https://ewhisper.cn/tags/Terraform/) ## 概述 [前文](https://ewhisper.cn/pos ......

    uj5u.com 2023-06-20 08:44:54 more
  • 在 Debian 12 上安裝 KubeSphere 實戰入門

    > 老 Z,運維架構師,云原生愛好者,目前專注于云原生運維,云原生領域技術堆疊涉及 Kubernetes、KubeSphere、DevOps、OpenStack、Ansible 等。 ## 前言 ### **知識點** - 定級:**入門級** - KubeKey 安裝部署 KubeSphere 和 ......

    uj5u.com 2023-06-20 08:39:22 more
  • 100個物聯網專案(基于ESP32)2快速入門

    ## 2快速入門 你將需要IDE來撰寫你的代碼。我們推薦初學者使用Arduino IDE。雖然它不是最好的IDE,但它可以完成作業,而且對初學者來說是直接和容易使用的。在熟悉了Arduino IDE并發展到更復雜的專案后,你可能會發現利用VS Code與Platformio插件來代替它更為方便。 # ......

    uj5u.com 2023-06-20 08:29:21 more
  • 海外交友原始碼平臺搭建:基礎功能的實作(一)

    今天我要分享的功能是利用海外交友原始碼去實作,這兩個功能并不會引起我們的特別關注,但是,當我們在使用海外交友原始碼平臺時,它們卻時時刻刻陪伴著我們。 ......

    uj5u.com 2023-06-20 08:23:56 more
  • 【工程應用八】終極的基于形狀匹配方案解決(小模型+預生成模型+無

    我估摸著這個應該是關于形狀匹配或者模版匹配的最后一篇文章了(同時紙質旋轉和縮放),其實大概是2個多月前這些東西都已經弄完了,只是一直靜不下來心整理文章,提醒一點,這篇文章后續可能會有多次修改(但不會重新發文章,而是在后臺直接修改或者增加),所以有需要的朋友可以隨時重復查看。 ......

    uj5u.com 2023-06-20 08:23:26 more