深度學習在文本分類中的應用

来源:https://www.cnblogs.com/llhthinker/archive/2017/12/28/8127788.html
-Advertisement-
Play Games

近期閱讀了一些深度學習在文本分類中的應用相關論文( " 論文筆記 " ),同時也參加了CCF 大數據與計算智能大賽(BDCI)2017的一個文本分類問題的比賽:讓AI當法官,並取得了最終評測第四名的成績(比賽的具體思路和代碼參見 " github項目repo " )。因此,本文總結了文本分類相關的深 ...


近期閱讀了一些深度學習在文本分類中的應用相關論文(論文筆記),同時也參加了CCF 大數據與計算智能大賽(BDCI)2017的一個文本分類問題的比賽:讓AI當法官,並取得了最終評測第四名的成績(比賽的具體思路和代碼參見github項目repo)。因此,本文總結了文本分類相關的深度學習模型、優化思路以及今後可以進行的一些工作。歡迎轉載,請保留本文鏈接:http://www.cnblogs.com/llhthinker/p/8127788.html

1. 文本分類任務介紹

文本分類是自然語言處理的一個基本任務,試圖推斷出給定的文本(句子、文檔等)的標簽或標簽集合。
文本分類的應用非常廣泛。如:

  • 垃圾郵件分類:二分類問題,判斷郵件是否為垃圾郵件
  • 情感分析
    • 二分類問題,判斷文本情感是積極(positive)還是消極(negative)
    • 多分類問題,判斷文本情感屬於{非常消極,消極,中立,積極,非常積極}中的哪一類
  • 新聞主題分類:判斷新聞屬於哪個類別,如財經、體育、娛樂等
  • 自動問答系統中的問句分類
  • 社區問答系統中的問題分類:多標簽分類,如知乎看山杯
  • 更多應用:

不同類型的文本分類往往有不同的評價指標,具體如下:

  • 二分類:accuracy,precision,recall,f1-score,...
  • 多分類: Micro-Averaged-F1, Macro-Averaged-F1, ...
  • 多標簽分類:Jaccard相似繫數, ...

2. 傳統機器學習方法

傳統的機器學習方法主要利用自然語言處理中的n-gram概念對文本進行特征提取,並且使用TFIDF對n-gram特征權重進行調整,然後將提取到的文本特征輸入到Logistics回歸、SVM等分類器中進行訓練。但是,上述的特征提取方法存在數據稀疏維度爆炸等問題,這對分類器來說是災難性的,並且使得訓練的模型泛化能力有限。因此,往往需要採取一些策略進行降維:

  • 人工降維:停用詞過濾,低頻n-gram過濾等
  • 自動降維:LDA等

值得指出的是,將深度學習中的word2vec,doc2vec作為文本特征與上文提取的特征進行融合,常常可以提高模型精度。

3. CNN用於文本分類

論文Convolutional Neural Networks for Sentence Classification提出了使用CNN進行句子分類的方法。

3.1 CNN模型推導

  • 一個句子是由多個詞拼接而成的,如果一個句子有\(n\)個詞,且第i個詞表示為\(x_i\),詞\(x_i\)通過embedding後表示為k維的向量,即\(x_i\in\Re^k\),則一個句子\(x_{1:n}\)\(n*k\)的矩陣,可以形式化如下:
    \[X_{1:n}=x_1\oplus x_2\oplus \dots \oplus x_n\]
  • 一個包含\(h\)個的詞的詞視窗表示為:\[X_{i:i+h-1}\in\Re^{hk}\]
  • 一個filter是大小為\(h*k\)的矩陣,表示為:\[W\in\Re^{hk}\]
  • 通過一個filter作用一個詞視窗提取可以提取一個特征\(c_i\),如下:
    \[c_i=f(W \cdot X_{i:i+h-1}+b)\]其中,\(b\in\Re\)是bias值,\(f\)為激活函數如Relu等。
  • 捲積操作:通過一個filter在整個句子上從句首到句尾掃描一遍,提取每個詞視窗的特征,可以得到一個特征圖(feature map) \(c\in\Re^{n-h+1}\),表示如下(這裡預設不對句子進行padding):
    \[c= [c_1, c_2, \dots , c_{n-h+1}]\]
  • 池化操作:對一個filter提取到的feature map進行max pooling,得到\(\hat{c}\in\Re\)即:
    \[\hat{c}=max(c)\]
  • 若有\(m\)個filter,則通過一層捲積、一層池化後可以得到一個長度為\(m\)的向量\(z\in\Re^m\):
    \[z = [\hat{c}_1, \hat{c}_2, \dots, \hat{c}_m]\]
  • 最後,將向量\(z\)輸入到全連接層,得到最終的特征提取向量\(y\) (這裡的\(W\)為全連接層的權重,註意與filter進行區分):
    \[y=W \cdot z+b\]

3.2 優化CNN模型

3.2.1 詞向量

  • 隨機初始化 (CNN-rand)
  • 預訓練詞向量進行初始化,在訓練過程中固定 (CNN-static)
  • 預訓練詞向量進行初始化,在訓練過程中進行微調 (CNN-non-static)
  • 多通道(CNN-multichannel):將固定的預訓練詞向量和微調的詞向量分別當作一個通道(channel),捲積操作同時在這兩個通道上進行,可以類比於圖像RGB三通道。

model

  • 上圖為模型架構示例,在示例中,句長\(n=9\),詞向量維度\(k=6\),filter有兩種視窗大小(或者說kernel size),每種有2個,因此filter總個數\(m=4\),其中:
    • 一種的視窗大小\(h=2\)(紅色框),捲積後的向量維度為\(n-h+1=8\)
    • 另一種視窗大小\(h=3\)(黃色框),捲積後的向量維度為\(n-h+1=7\)
      (論文原圖中少畫了一個維度,感謝@shoufengwei指正)

      3.2.2 正則化

  • Dropout: 對全連接層的輸入\(z\)向量進行dropout
    \[y=W \cdot (z \circ r)+b\]其中\(r\in\Re^m\)masking向量(每個維度值非0即1,可以通過伯努利分佈隨機生成),和向量\(z\)進行元素與元素對應相乘,讓\(r\)向量值為0的位置對應的\(z\)向量中的元素值失效(梯度無法更新)。
  • L2-norms: 對L2正則化項增加限制:當正則項\(\lVert W \rVert_2 > s\)時, 令\(\lVert W \rVert_2 = s\),其中\(s\)為超參數。

3.3 一些結論

  • Multichannel vs. Single Channel Models: 雖然作者一開始認為多通道可以預防過擬合,從而應該表現更高,尤其是在小規模數據集上。但事實是,單通道在一些語料上比多通道更好;
  • Static vs. Non-static Representations: 在大部分的語料上,CNN-non-static都優於CNN-static,一個解釋:預訓練詞向量可能認為‘good’和‘bad’類似(可能它們有許多類似的上下文),但是對於情感分析任務,good和bad應該要有明顯的區分,如果使用CNN-static就無法做調整了;
  • Dropout可以提高2%–4%性能(performance);
  • 對於不在預訓練的word2vec中的詞,使用均勻分佈\(U[-a,a]\)隨機初始化,並且調整\(a\)使得隨機初始化的詞向量和預訓練的詞向量保持相近的方差,可以有微弱提升;
  • 可以嘗試其他的詞向量預訓練語料,如Wikipedia[Collobert et al. (2011)]
  • Adadelta(Zeiler, 2012)和Adagrad(Duchi et al., 2011)可以得到相近的結果,但是所需epoch更少。

3.4 進一步思考CNN

3.4.1 為什麼CNN能夠用於文本分類(NLP)?

  • 為什麼CNN能夠用於文本分類(NLP)?
    • filter相當於N-gram ?
    • filter只提取局部特征?全局特征怎麼辦?可以融合嗎?
      • RNN可以提取全局特征
      • RCNN(下文說明): RNN和CNN的結合

3.4.2 超參數怎麼調?

論文A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification提供了一些策略。

  • 用什麼樣的詞向量
    • 使用預訓練詞向量比隨機初始化的效果要好
    • 採取微調策略(non-static)的效果比固定詞向量(static)的效果要好
    • 無法確定用哪種預訓練詞向量(Google word2vec / GloVe representations)更好,不同的任務結果不同,應該對於你當前的任務進行實驗;
  • filter視窗大小、數量
    • 每次使用一種類型的filter進行實驗,表明filter的視窗大小設置在1到10之間是一個比較合理的選擇。
    • 首先在一種類型的filter大小上執行搜索,以找到當前數據集的“最佳”大小,然後探索這個最佳大小附近的多種filter大小的組合。
    • 每種視窗類型的filter對應的“最好”的filter個數(feature map數量)取決於具體數據集;
    • 但是,可以看出,當feature map數量超過600時,performance提高有限,甚至會損害performance,這可能是過多的feature map數量導致過擬合了;
      • 在實踐中,100到600是一個比較合理的搜索空間。
  • 激活函數 (tanh, relu, ...)
    • Sigmoid, Cube, and tanh cube相較於Relu和Tanh的激活函數,表現很糟糕;
    • tanh比sigmoid好,這可能是由於tanh具有zero centering property(過原點);
    • 與Sigmoid相比,ReLU具有非飽和形式(a non-saturating form)的優點,並能夠加速SGD的收斂。
    • 對於某些數據集,線性變換(Iden,即不使用非線性激活函數)足夠捕獲詞嵌入與輸出標簽之間的相關性。(但是如果有多個隱藏層,相較於非線性激活函數,Iden就不太適合了,因為完全用線性激活函數,即使有多個隱藏層,組合後整個模型還是線性的,表達能力可能不足,無法捕獲足夠信息);
    • 因此,建議首先考慮ReLU和tanh,也可以嘗試Iden
  • 池化策略:最大池化就是最好的嗎
    • 對於句子分類任務,1-max pooling往往比其他池化策略要好;
    • 這可能是因為上下文的具體位置對於預測Label可能並不是很重要,而句子某個具體的n-gram(1-max pooling後filter提取出來的的特征)可能更可以刻畫整個句子的某些含義,對於預測label更有意義;
    • (但是在其他任務如釋義識別,k-max pooling可能更好。)
  • 正則化
    • 0.1到0.5之間的非零dropout rates能夠提高一些performance(儘管提升幅度很小),具體的最佳設置取決於具體數據集;
    • 對l2 norm加上一個約束往往不會提高performance(除了Opi數據集);
    • 當feature map的數量大於100時,可能導致過擬合,影響performance,而dropout將減輕這種影響;
    • 在捲積層上進行dropout幫助很小,而且較大的dropout rate對performance有壞的影響。

3.5 字元級別的CNN用於文本分類

論文Character-level convolutional networks for text classification將文本看成字元級別的序列,使用字元級別(Character-level)的CNN進行文本分類。

3.5.1 字元級CNN的模型設計

首先需要對字元進行數字化(quantization)。具體如下:

  • 定義字母表(Alphabet):大小為\(m​\) (對於英文\(m=70​\),如下圖,之後會考慮將大小寫字母都包含在內作為對比)
    alphabet
  • 字元數字化(編碼): "one-hot"編碼
  • 序列(文本)長度:\(l_0\) (定值)
    然後論文設計了兩種類型的捲積網路:Large和Small(作為對照實驗)
  • 它們都有9層,其中6層為捲積層(convolutional layer);3層為全連接層(fully-connected layer):
  • Dropout的概率都為0.5
  • 使用高斯分佈(Gaussian distribution)對權重進行初始化:
  • 最後一層捲積層單個filter輸出特征長度(the output frame length)為 \(l_6 = (l_0 - 96) / 27\),推
  • 第一層全連接層的輸入維度(其中1024和256為filter個數或者說frame/feature size):
    • Large: \(l_6 * 1024\)
    • Small: \(l_6 * 256\)
  • 下圖為模型的一個圖解示例。其中文本長度為10,第一層捲積的kernel size為3(半透明黃色正方形),捲積個數為9(Feature=9),步長為1,因此Length=10-3+1=8,然後進行非重疊的max-pooling(即pooling的stride=size),pooling size為2,因此池化後的Length = 8 / 2 = 4。
    model

3.5.2 字元級CNN的相關總結與思考

  • 字元級CNN是一個有效的方法
  • 數據集的大小可以為選擇傳統方法還是捲積網路模型提供指導:對於幾百上千等小規模數據集,可以優先考慮傳統方法,對於百萬規模的數據集,字元級CNN開始表現不錯。
  • 字元級捲積網路很適用於用戶生成數據(user-generated data)(如拼寫錯誤,表情符號等),
  • 沒有免費的午餐(There is no free lunch)
  • 中文怎麼辦
  • 將字元級和詞級進行結合是否結果更好
    • 英文如何結合
    • 中文如何結合

3.5.3 使用同義詞表進行數據增強

對於深度學習模型,採用適當的數據增強(Data Augmentation)技術可以提高模型的泛化能力。數據增強在電腦視覺領域比較常見,例如對圖像進行旋轉,適當扭曲,隨機增加雜訊等操作。對於NLP,最理想的數據增強方法是使用人類覆述句子(human rephrases of sentences),但是這比較不現實並且對於大規模語料來說代價昂貴。
一個更自然的選擇是使用詞語或短語的同義詞或同義短語進行替換,從而達到數據增強的目的。具體做法如下:

  • 英文同義詞典: from the mytheas component used in LibreOffice1 project. http://www.libreoffice.org/
  • 從給定的文本中抽取出所有可以替換的詞,然後隨機選擇\(r\)個進行替換,其中\(r\)由一個參數為\(p\)的幾何分佈(geometric distribution)確定,即\(P[r] \sim p^r\)
  • 給定一個待替換的詞,其同義詞可能有多個(一個列表),選擇第\(s\)個的概率也通過另一個幾何分佈確定,即\(P[s] \sim q^s\)。這樣是為了當前詞的同義詞列表中的距離較遠(\(s\)較大)的同義詞被選的概率更小。
  • 論文實驗設置: \(p=0.5, q=0.5\)

4. RNN用於文本分類

  • 策略1:直接使用RNN的最後一個單元輸出向量作為文本特征
  • 策略2:使用雙向RNN的兩個方向的輸出向量的連接(concatenate)或均值作為文本特征
  • 策略3:將所有RNN單元的輸出向量的均值pooling或者max-pooling作為文本特征
    lstm
  • 策略4:層次RNN+Attention, Hierarchical Attention Networks

5. RCNN(RNN+CNN)用於文本分類

論文Recurrent Convolutional Neural Networks for Text Classification設計了一種RNN和CNN結合的模型用於文本分類。

5.1 RCNN模型推導

5.1.1 詞表示學習

使用雙向RNN分別學習當前詞\(w_i\)的左上下文表示\(c_l(w_i)\)和右上下文表示\(c_r(w_i)\),再與當前詞自身的表示\(e(w_i)\)連接,構成捲積層的輸入\(x_i\)。具體如下:
\[ \begin{align} c_l(w_i) = f(W^{(l)}c_l(w_{i-1})+W^{(sl)}e(w_{i-1})) ; \\ c_r(w_i) = f(W^{(r)}c_r(w_{i-1})+W^{(sr)}e(w_{i-1})) ; \\ x_i = [c_l(w_i);e(w_i);c_r(w_i)] ; \\ \end{align} \]
然後將\(x_i\)作為\(w_i\)的表示,輸入到激活函數為tanh,kernel size為1的捲積層,得到\(w_i\)的潛在語義向量(latent semantic vector) $y^{(2)}_i=tanh(W^{(2)}x_i+b^{(2)}) $
將kernel size設置為1是因為\(x_i\)中已經包含\(w_i\)左右上下文的信息,無需再使用視窗大於1的filter進行特征提取。但是需要說明的是,在實踐中仍然可以同時使用多種kernel size的filter,如[1, 2, 3],可能取得更好的效果,一種可能的解釋是視窗大於1的filter強化了\(w_i\)的左右最近的上下文信息。此外,實踐中可以使用更複雜的RNN來捕獲\(w_i\)的上下文信息如LSTM和GRU等。

5.1 2 文本表示學習

經過捲積層後,獲得了所有詞的表示,然後在經過最大池化層和全連接層得到文本的表示,最後通過softmax層進行分類。具體如下:

  • Max-pooling layer: \(y^{(3)}=\max \limits_{i=1}^{n} y^{(2)}_i\)
  • Fully connected layer: \(y^{(4)}=W^{(4)}y^{(3)}+b^{(4)}\)
  • Softmax layer: \(p_i=\frac{\exp(y^{(4)}_i)}{\sum_{k=1}^n \exp(y^{(4)}_k)}\)
    下圖為上述過程的一個圖解:

model

5.2 RCNN相關總結

  • NN vs. traditional methods: 在該論文的所有實驗數據集上,神經網路比傳統方法的效果都要好
  • Convolution-based vs. RecursiveNN: 基於捲積的方法比基於遞歸神經網路的方法要好
  • RCNN vs. CFG and C&J: The RCNN可以捕獲更長的模式(patterns)
  • RCNN vs. CNN: 在該論文的所有實驗數據集上,RCNN比CNN更好
  • CNNs使用固定的詞視窗(window of words), 實驗結果受視窗大小影響
  • RCNNs使用迴圈結構捕獲廣泛的上下文信息

6. 一定要CNN/RNN嗎

上述的深度學習方法通過引入CNN或RNN進行特征提取,可以達到比較好的效果,但是也存在一些問題,如參數較多導致訓練時間過長,超參數較多模型調整麻煩等。下麵兩篇論文提出了一些簡單的模型用於文本分類,並且在簡單的模型上採用了一些優化策略。

6.1 深層無序組合方法

論文Deep Unordered Composition Rivals Syntactic Methods for Text Classification提出了NBOW(Neural Bag-of-Words)模型和DAN(Deep Averaging Networks)模型。對比了深層無序組合方法(Deep Unordered Composition)和句法方法(Syntactic Methods)應用在文本分類任務中的優缺點,強調深層無序組合方法的有效性、效率以及靈活性。

6.1.1 Neural Bag-of-Words Models

論文首先提出了一個最簡單的無序模型Neural Bag-of-Words Models (NBOW model)。該模型直接將文本中所有詞向量的平均值作為文本的表示,然後輸入到softmax 層,形式化表示如下:

  • Word embedding average : \(z=g(w \in X)=\frac{1}{X} \sum\limits_{w \in X} v_w\)
  • Softmax Layer: \(\hat{y} = softmax(W_s \cdot z + b)\)
  • Loss function: cross-entropy error, $\iota(\hat{y}) =\sum\limits_{p=1}^{k}y_p\log(\hat{y_p}) $

6.1.2 Considering Syntax for Composition

一些考慮語法的方法:

  • Recursive neural networks (RecNNs)
  • 可以考慮一些複雜的語言學現象,如否定、轉折等 (優點)
  • 實現效果依賴輸入序列(文本)的句法樹(可能不適合長文本和不太規範的文本)
  • 需要更多的訓練時間
  • Using a convolutional network instead of a RecNN
  • 時間複雜度同樣比較大,甚至更大(通過實驗結果得出的結論,這取決於filter大小、個數等超參數的設置)

6.1.3 Deep Averaging Networks

Deep Averaging Networks (DAN)是在NBOW model的基礎上,通過增加多個隱藏層,增加網路的深度(Deep)。下圖為帶有兩層隱藏層的DAN與RecNN模型的對比。

DAN

6.1.4 Word Dropout Improves Robustness

  • 針對DAN模型,論文提出一種word dropout策略:在求平均詞向量前,隨機使得文本中的某些單詞(token)失效。形式化表示如下:

\[ \begin{align} r_w \sim Bernoulli(p) ; \\ \hat{X} = \{w|w \in X and r_w > 0\} ; \\ z = g(w \in X ) = \frac{\sum_{w \in \hat{X}}v_w}{|\hat{X}|} ; \\ \end{align} \]

  • Word Dropout可能會使得某些非常重要的token失效。然而,使用word dropout往往確實有提升,這可能是因為,一些對標簽預測起到關鍵性作用的word數量往往小於無關緊要的word數量。例如,對於情感分析任務,中立(neutral)的單詞往往是最多的。
  • Word dropout 同樣可以用於其他基於神經網路的方法。
  • Word Dropout或許起到了類似數據增強(Data Augmentation)的作用?

6.2 fastText

論文Bag of Tricks for Efficient Text Classification提出一個快速進行文本分類的模型和一些trick。

6.2.1 fastText模型架構

fastText模型直接對所有進行embedded的特征取均值,作為文本的特征表示,如下圖。

model

6.2.2 特點

  • 當類別數量較大時,使用Hierachical Softmax
  • 將N-gram融入特征中,並且使用Hashing trick[Weinberger et al.2009]提高效率

7. 最新研究

References
[1] Le and Mikolov - 2014 - Distributed representations of sentences and documents
[2] Kim - 2014 - Convolutional neural networks for sentence classification
[3] Zhang and Wallace - 2015 - A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification
[4] Zhang et al. - 2015 - Character-level convolutional networks for text classification
[5] Lai et al. - 2015 - Recurrent Convolutional Neural Networks for Text Classification
[6] Iyyer et al. - 2015 - Deep unordered composition rivals syntactic methods for Text Classification
[7] Joulin et al. - 2016 - Bag of tricks for efficient text classification
[8] Liu and Lapata - 2017 - Learning Structured Text Representations
[9] Yin and Schütze - 2017 - Attentive Convolution
[10] Zhang et al. - 2017 - Multi-Task Label Embedding for Text Classification


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本節總結: uboot啟動流程如下: 1)設置CPU為管理模式 2)關看門狗 3)關中斷 4)設置時鐘頻率 5)關mmu,初始化各個bank 6)進入board_init_f()函數 (初始化定時器,GPIO,串口等,劃分記憶體區域) 7)重定位 複製uboot,然後修改SDRAM上的uboot鏈接地 ...
  • 前言 一款不錯的代碼質量管理工具Sonar 前期準備 官方參考文檔 https://docs.sonarqube.org/display/SONAR/Documentation 軟體下載 https://www.sonarqube.org/downloads/ https://dev.mysql.c ...
  • 問題背景: 一塊近似最小系統的控制小板,主要用於對電機,氣閥,集成液晶屏以及其他的部件控制。考慮電流會較大採用DC-DC穩壓管。 電路焊接完成後,最小系統正常工作。 問題: 加上液晶屏後,串口屏出現閃爍,5V電壓不穩。排除線路板線徑過細問題。 更換晶元後問題依然存在,但是穩壓晶元在某寶買的,還是擔心 ...
  • 原文:http://os.51cto.com/art/201609/518191.htm 經常使用Linux的開發人員或者運維人員,可能對configure->make->make install相當熟悉。事實上,這叫GNU構建系統,利用腳本和make程式在特定平臺上構建軟體。這種方式成為一種習慣, ...
  • awk是一種編程語言,主要用於在linux/unix下對文本和數據進行處理,是linux/unix下的一個工具。數據可以來自標準輸入、一個或多個文件,或其它命令的輸出。awk的處理文本和數據的方式:逐行掃描文件,預設從第一行到最後一行,尋找匹配的特定模式的行,併在這些行上進行你想要的操作。gawk是 ...
  • 背景 預設都是筆記本鍵盤才有Fn組合功能鍵,台式機很少有。今天領到的是聯想鍵盤,給我的台式機使用後F12很麻煩,必須Fn+F12才可以。 需求 恢復預設的F1~F12功能 方案 只需要下載驅動安裝: Windows 7 32-bit,Windows Vista 32-bit,Windows XP(3 ...
  • 常用功能差異 1. 鎖差異 : • Oracle鎖加在數據塊上 • InnoDB 是在索引上加鎖,所以MySQL鎖的粒度沒有Oracle 精細。 2. 導入導出 : • Oracle採用EXP /IMP ,EXPDP/IMPDP導入導出。 • MySQL採用mysqldump導出,導入可以採用管道或 ...
  • 操作系統 : CentOS7.3.1611_x64 go語言版本:1.8.3 linux/amd64 InfluxDB版本:1.1.0 influxdata主目錄結構 目錄解析說明: influxdb 為源碼的主目錄 influxql 實現了InfluxDB查詢語言的解析器(源碼主目錄裡面引用的是i ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...