主頁 > 後端開發 > 易于理解的 python 深度學習摘要演算法教程

易于理解的 python 深度學習摘要演算法教程

2020-11-07 03:50:47 後端開發

“我不想要一份完整的報告,只要給我一份結果摘要就好”,我經常發現自己處于這種狀況 -- 無論是在大學里還是在我的職業生涯中,我們準備一份全面的報告,但老師/主管卻只有時間閱讀摘要,

聽起來很熟悉吧?嗯,我決定做點什么,手動將報告轉換為匯總版本太耗時了,對嗎?我能依靠嗎 自然語言處理 (NLP) 幫助我的技巧?

這就是使用深度學習進行文本摘要真正幫助我的地方,它解決了一個一直困擾我的問題- 現在我們的模型可以理解整個文本的背景關系 ,對于我們所有需要快速知道檔案摘要的人來說,這是一個夢想成真!

以及我們在深度學習中使用文本摘要獲得的結果?了不起,因此,我在本文中,我們將逐步介紹構建 使用深度學習的文本摘要器 通過覆寫構建它所需的所有概念,然后,我們將在 Python 中實作我們的第一個文本摘要模型!

注意: 本文要求對一些深度學習概念有基本的了解,我建議瀏覽下面的文章,
  • [A Must-Read Introduction to Sequence Modelling (with use cases)](https://www.analyticsvidhya.com/blog/2018/04/sequence-modelling-an-introduction-with-practical-use-cases/?utm_source=blog&utm_medium=comprehensive-guide-text-summarization-using-deep-learning-python)
  • [Must-Read Tutorial to Learn Sequence Modeling (deeplearning.ai Course #5)](https://www.analyticsvidhya.com/blog/2019/01/sequence-models-deeplearning/?utm_source=blog&utm_medium=comprehensive-guide-text-summarization-using-deep-learning-python)
  • [Essentials of Deep Learning: Introduction to Long Short Term Memory](https://www.analyticsvidhya.com/blog/2017/12/fundamentals-of-deep-learning-introduction-to-lstm/?utm_source=blog&utm_medium=comprehensive-guide-text-summarization-using-deep-learning-python)

目錄

  1. NLP中的文本摘要是什么?
  2. 序列到序列 (Seq2Seq) 建模介紹
  3. 了解編碼器 - 解碼器體系結構
  4. 編碼器局限性 - 解碼器體系結構
  5. 注意機制背后的直覺
  6. 理解問題說明書
  7. 使用 Keras 在 Python 中實作文本摘要
  8. 如何進一步提高模型的性能?
  9. 注意力機制是如何作業的?
我保留了本文底部的 “注意力機制如何作業?” 部分,這是一個數學繁重的部分,不是理解Python代碼如何作業的強制性部分,然而,我鼓勵你去經歷它,因為它會讓你對這個令人敬畏的自然語言處理概念有一個堅實的概念,

1. NLP中的文本摘要是什么?

讓我們先了解什么是文本摘要,然后再看看它是如何作業的,這里有一個簡潔的定義來幫助我們開始:

“自動文本摘要是在保留關鍵資訊內容和總體意義的同時生成簡潔流暢的摘要的任務”

-文本總結技術: 簡要調查,2017

有大致兩種不同的方法用于文本總結:

  • 提取概括
  • 抽象概括

讓我們更詳細地看看這兩種型別,

1.1 提取摘要

這個名字透露了這種方法的作用, 我們從原文中識別出重要的句子或短語,并且只從原文中提取那些, 那些提取的句子將是我們的總結,下圖說明了提取摘要:

我建議仔細閱讀下面的文章,使用TextRank演算法構建提取文本摘要器:

  • 使用TextRank演算法的文本摘要介紹 (使用Python實作)

1.2 抽象摘要

這是一個非常有趣的方法,這里, 我們從原文生成新句子, 這與我們之前看到的只使用存在的句子的提取方法相反,通過抽象總結生成的句子可能不會出現在原文中:

你可能已經猜到了 -- 我們將在本文中使用深度學習來構建一個抽象的文本摘要器!在深入了解實作部分之前,讓我們首先了解構建文本摘要器模型所需的概念,

前方是激動人心的時刻!

2. 序列到序列 (Seq2Seq) 建模介紹

我們可以針對涉及順序資訊的任何問題構建Seq2Seq模型,這包括情感分類、神經機器翻譯和命名物體識別 -- 順序資訊的一些非常常見的應用,

在神經機器翻譯的情況下,輸入是一種語言的文本,輸出也是另一種語言的文本:

在命名物體識別中,輸入是單詞序列,輸出是輸入序列中每個單詞的標簽序列:

我們的目標是構建一個文本摘要器,其中輸入是一個長的單詞序列 (在文本正文中),輸出是一個短的摘要 (也是一個序列),所以, 我們可以將其建模為****多對多Seq2Seq問題, 以下是典型的Seq2Seq模型架構:

Seq2Seq 模型有兩個主要組成部分:

  • 編碼器
  • 解碼器

讓我們詳細了解這兩個,這些對于理解文本摘要在代碼下是如何作業是至關重要的,您也可以前往 本教程 更詳細地理解序列到序列建模,

3. 了解編碼器-解碼器體系結構

編碼器-解碼器體系結構主要用于解決輸入和輸出序列長度不同的序列到序列 (Seq2Seq) 問題,

讓我們從文本摘要的角度來理解這一點,輸入是一個長的單詞序列,輸出將是輸入序列的短版本,

通常,遞回神經網路 (RNNs) 的變體,即門控遞回神經網路 (GRU) 或長期短期記憶 (LSTM) 作為編碼器和解碼器組件是優選的,這是因為他們能夠通過克服梯度消失的問題來捕捉長期依賴性,

我們可以分兩個階段設定編碼器解碼器:

  • 訓練階段
  • 推理階段

讓我們通過LSTM模型的鏡頭來理解這些概念,

3.1 訓練階段

在訓練階段,我們將首先設定編碼器和解碼器,然后,我們將訓練模型以預測目標序列偏移一個時間步,讓我們詳細了解如何設定編碼器和解碼器,

編碼器

編碼器長期短期存盤模型 (LSTM) 讀取整個輸入序列,其中在每個時間步,一個字被輸入編碼器,然后,它在每個時間步處理資訊,并捕獲輸入序列中存在的背景關系資訊,

我把下面的圖表放在一起,說明了這個程序:

隱藏狀態 (h) 和細胞狀態 (c) 的最后一個時間步驟用于初始化解碼器,請記住,這是因為編碼器和解碼器是LSTM體系結構的兩組不同,

解碼器

解碼器也是一個LSTM網路,它逐字讀取整個目標序列,并通過一個時間步預測相同的序列偏移, 解碼器被訓練以預測給定前一個單詞的序列中的下一個單詞,

開始」 和 「結束」是在將目標序列輸入解碼器之前添加到目標序列中的特殊標記,解碼測驗序列時目標序列未知,因此,我們開始通過將第一個單詞傳遞到解碼器來預測目標序列,該解碼器始終是 「開始」指令和 「**結束」**令牌表示句子的結尾,

到目前為止相當直觀,

3.2 預測階段

訓練后,在目標序列未知的新源序列上測驗模型,因此,我們需要設定推理架構來解碼測驗序列:

預測程序是如何作業的?

以下是解碼測驗序列的步驟:

  1. 對整個輸入序列進行編碼,并用編碼器的內部狀態初始化解碼器
  2. 通過 <**開始>**令牌作為解碼器的輸入
  3. 使用內部狀態運行解碼器一次
  4. 輸出將是下一個單詞的概率,將選擇具有最大概率的單詞
  5. 在下一個時間步中將采樣的字作為輸入傳遞給解碼器,并用當前時間步更新內部狀態
  6. 重復步驟3-5,直到我們生成 <**結束>**標記或命中目標序列的最大長度

讓我們舉一個由 [x給出測驗序列的例子1,X2,X3,X4],對于這個測驗序列,推理程序是如何作業的?我想讓你在看下面我的想法之前先考慮一下,

  1. 將測驗序列編碼為內部狀態向量
  2. 觀察解碼器如何在每個時間步預測目標序列:

時間步長: t = 1

時間步長: t = 2

和,時間步長: t = 3

4.編碼器的局限性 - 解碼器體系結構

盡管這種編碼器-解碼器體系結構很有用,但它也有一定的局限性,

  • 編碼器將整個輸入序列轉換為固定長度矢量,然后解碼器預測輸出序列,這僅適用于短序列 由于解碼器正在查看預測的整個輸入序列
  • 長序列的問題來了, 編碼器很難將長序列記憶成固定長度的向量

“這種編碼器-解碼器方法的一個潛在問題是,神經網路需要能夠將源句子的所有必要資訊壓縮為固定長度的向量,這可能使神經網路難以處理長句,隨著輸入句子長度的增加,基本編碼器-解碼器的性能迅速下降,”

-通過共同學習對齊和翻譯的神經機器翻譯

那么我們如何克服長序列的問題呢?這是概念 注意機制 進入畫面,它旨在通過僅查看序列的幾個特定部分而不是整個序列來預測單詞,這真的和聽起來一樣棒!

5. 注意力機制背后的直覺

在時間步長生成一個單詞,我們需要對輸入序列中的每個單詞關注多少 T ?這是注意力機制概念背后的關鍵直覺,

讓我們考慮一個簡單的例子來了解注意力機制是如何作業的:

  • 源序列: “你最喜歡哪項運動?
  • 目標序列: “我喜歡板球”

第一個詞I 在目標序列中連接到第四個單詞 You 在源序列中,對嗎?同樣,第二個詞“**愛”**在目標序列中與第五個單詞相關聯 “喜歡” 在源序列中,

因此,我們可以增加導致目標序列的源序列的特定部分的重要性,而不是查看源序列中的所有單詞, 這是注意機制背后的基本思想,

根據參與的背景關系向量的匯出方式,有兩種不同類別的注意力機制:

  • 全球關注
  • 區域關注

讓我們簡單地談談這些課程,

5.1 全域關注

在這里,注意力集中在所有的源位置上,換言之,編碼器的所有隱藏狀態都被考慮用于匯出被關注的背景關系向量:

來源: 基于注意力的神經機器翻譯的有效方法 -- 2015

5.2 區域關注

在這里,注意力只放在幾個源位置上, 僅考慮編碼器的一些隱藏狀態來匯出參與的背景關系向量:

來源: 基于注意力的神經機器翻譯的有效方法 -- 2015

我們將在本文中使用全域注意力機制,

6. 理解問題陳述

顧客評論通常是長的和描述性的,可以想象,手動分析這些評論確實很耗時,這就是自然語言處理的輝煌之處,可以用來生成長時間評論的摘要,

我們將研究一個非常酷的資料集, 我們****這里的目標是使用我們在上面學到的基于抽象的方法為亞馬遜美食評論生成一個摘要,

您可以從以下位置下載資料集這里,

7. 使用 Keras 在 Python 中實作文本摘要

是時候啟動我們的Jupyter筆記本了!讓我們立即深入了解實作細節,

7.1 自定義注意力層

Keras不正式支持注意層,因此,我們可以實作我們自己的注意層或使用第三方實作,我們將在本文中選擇后一個選項, 您可以從以下位置下載注意力層 這里 并將其復制到另一個名為 注意py

讓我們將其匯入到我們的環境中:

7.2 匯入庫,讀取資料集

該資料集由亞馬遜美食評論組成,資料跨度超過10年,包括截至2012年10月的全部約500,000次審查,這些評論包括產品和用戶資訊、評分、純文本評論和摘要,它還包括來自所有其他亞馬遜類別的評論,

我們將對100,000篇評論進行抽樣,以減少我們模型的培訓時間,如果您的機器具有這種計算能力,請隨意使用整個資料集來訓練您的模型,

7.3 預處理,洗掉重復項和NA值

在進入模型構建部分之前,執行基本預處理步驟非常重要,使用混亂和未清理的文本資料是一個潛在的災難性舉動,所以在這一步中,我們將從文本中洗掉所有不需要的符號、字符等,這些不會影響我們問題的目標,

這是我們將用于擴展收縮的字典:

我們需要為預處理評論和生成摘要定義兩種不同的功能,因為文本和摘要中涉及的預處理步驟略有不同,

A) 文本清理

讓我們看一下資料集中的前10條評論,以了解文本預處理步驟:

資料 ['文本'][:10]

輸出 :

我們將為資料執行以下預處理任務:

  • 將所有內容轉換為小寫
  • 洗掉HTML標簽
  • 收縮映射
  • 洗掉 ()
  • 洗掉括號內的所有文本 ()
  • 消除標點符號和特殊字符
  • 洗掉停止符
  • 洗掉短詞

讓我們定義函式:

B) 整理清洗

現在,我們將查看評論的前10行,以了解 “摘要” 列的預處理步驟:

輸出 :

為此任務定義函式:

記得添加 啟動結束 摘要開頭和結尾處的特殊令牌:

現在,讓我們看一下前5條評論及其摘要:

輸出 :

7.4 了解序列的分布

在這里,我們將分析評論的長度和摘要,以全面了解文本長度的分布, 這將幫助我們確定序列的最大長度:

輸出 :

我們可以將評論的最大長度固定為80,因為這似乎是大多數評論的長度,同樣,我們可以將最大摘要長度設定為10:

我們越來越接近模型構建部分,在此之前,我們需要將資料集拆分為訓練和驗證集,我們將使用資料集的90% 作為訓練資料,并評估其余10% (保留集) 的性能:

7.5 準備標記器

標記器構建詞匯表并將單詞序列轉換為整數序列, 繼續為文本和摘要構建標記器:

A) 文本標記器

B) 摘要標記器

7.6 構建模型

我們終于進入了模型構建部分,但是在此之前,我們需要熟悉一些在構建模型之前需要的術語,

  • **回傳序列 = True:**當回傳序列引數設定為 真正 ,LSTM為每個時間步產生隱藏狀態和單元格狀態
  • **回傳狀態 = True:**當回傳狀態 = 真正 ,LSTM僅產生最后一個時間步的隱藏狀態和單元格狀態
  • **初始狀態:**這用于初始化第一個時間步驟的LSTM的內部狀態
  • **堆疊LSTM:**堆疊式LSTM有多層相互堆疊的LSTM,這導致序列的更好表示,我鼓勵您嘗試將LSTM的多層堆疊在一起 (這是學習此知識的好方法)

在這里,我們正在為編碼器構建一個3堆疊的LSTM:

輸出 :

我正在使用稀疏分類交叉熵 作為損失函式,因為它會將整數序列動態轉換為一個熱向量,這克服了任何記憶體問題,

還記得提前停車的概念嗎?它用于通過監視用戶指定的度量標準在正確的時間停止訓練神經網路,在這里,我正在監視驗證丟失 (val_loss),一旦驗證損失增加,我們的模型將停止訓練:

我們將在批處理大小為512的情況下訓練模型,并在保留集 (占我們資料集的10%) 上對其進行驗證:

7.7 了解診斷圖

現在,我們將繪制一些診斷圖,以了解模型隨時間的行為:

輸出 :

我們可以推斷,在紀元10之后,驗證損失略有增加,因此,我們將在該紀元之后停止訓練該模型,

接下來,讓我們構建字典,將索引轉換為目標詞匯和源詞匯的單詞:

推理

為編碼器和解碼器設定推理:

我們在下面定義一個函式,它是推理程序的實作 (我們在上節中討論過):

讓我們定義將整數序列轉換為單詞序列以進行摘要和評論的函式:

以下是模型生成的一些摘要:

這真的很酷,盡管實際的總結和我們模型生成的總結在文字方面不匹配,但它們都傳達了相同的含義,我們的模型能夠根據文本中的背景關系生成清晰的摘要,這就是我們如何在Python中使用深度學習概念執行文本摘要,

8. 我們如何進一步提高模型的性能?

你的學習不止于此!你可以做更多的事情來嘗試這個模型:

  • 我建議你 增加訓練資料集的大小 并建立模型,深度學習模型的泛化能力隨著訓練資料集大小的增加而增強
  • 嘗試 實作雙向LSTM 它能夠從兩個方向捕獲背景關系并產生更好的背景關系向量
  • 使用 波束搜索策略 用于解碼測驗序列而不是使用貪婪方法 (argmax)
  • 評價 您的模型的性能基于 藍色分數
  • 實作指標生成器網路 和覆寫機制

9. 注意力機制是如何作業的?

現在,讓我們來談談注意機制的內部作業原理,正如我在文章開頭提到的,這是一個數學繁重的部分,所以把它看作是可選的學習,我仍然強烈建議通讀這篇文章,以真正理解注意力機制是如何作業的,

  • 編碼器輸出隱藏狀態 ( H**J** ) 對于每個時間步J 在源序列中
  • 同樣,解碼器輸出隱藏狀態 ( S**** ) 對于每個時間步 在目標序列中
  • 我們計算一個被稱為對準分數****(EIj),在此基礎上,使用分數函式將源詞與目標詞對齊,校準 分數從源隱藏狀態計算得出 HJ 和目標隱藏狀態 S 使用評分函式,這由:

**                                                eij= score (si, hj )**

哪里 E**Ij** 表示目標時間步的對齊得分 和源時間步 J

根據所使用的評分功能的型別,有不同型別的注意機制,我在下面提到了一些流行的注意機制:

  • 我們標準化校準分數使用softmax函式檢索注意權重 ( A**Ij**):

  • 我們計算注意力權重的線性乘積之和 AIj 和編碼器的隱藏狀態 HJ 生產 參與的背景關系向量 ( C****):

  • 參與的背景關系向量以及解碼器在時間步的目標隱藏狀態 連接以產生一個有參與的隱藏向量 S

S= 串聯 ([s; C])

  • 有人值守的隱藏矢量 S 然后被送入致密層以產生 Y****

Y= 密集 (秒)

讓我們借助一個例子來理解上述注意機制步驟,將源序列視為 [x1,X2,X3,X4] 和目標序列是 [y1,Y2],

  • 編碼器讀取整個源序列并輸出每個時間步的隱藏狀態,例如 H1,H2,H3,H4

  • 解碼器讀取偏移一個時間步的整個目標序列,并輸出每個時間步的隱藏狀態,例如 S1,S2,S3

目標時間步長i = 1

  • 校準分數 E1j 從源隱藏狀態計算 H 和目標隱藏狀態 S1 使用評分功能:

E11= 分數1,H1)

E12= 分數1,H2)

E13= 分數1,H3)

E14= 分數1,H4)

  • 標準化校準分數 E1j 使用softmax可產生注意力權重 A1j :

A11= Exp (e11)/((Exp (e11) + Exp (e12) + Exp (e13) + Exp (e14))

A12= Exp (e12)/(Exp (e11) + Exp (e12) + Exp (e13) + Exp (e14))

A13= Exp (e13)/(Exp (e11) + Exp (e12) + Exp (e13) + Exp (e14))

A14= Exp (e14)/(Exp (e11) + Exp (e12) + Exp (e13) + Exp (e14))

  • 參與背景關系向量 C**1** 由編碼器隱藏狀態的乘積的線性和匯出 H**J** 和校準分數 A**1j**:

C1= H1* A11+ H2* A12+ H3* A13+ H4* A14

  • 參與背景關系向量 C1 和目標隱藏狀態 S1 連接以產生一個有參與的隱藏向量 S1

S1= 串聯 ([s1; C1])

  • 注意隱藏向量 S1 然后被送入致密層以產生 Y**1**

Y1= 密集 (秒1)

目標時間步長i = 2

  • 校準分數 E2j 從源隱藏狀態計算 H 和目標隱藏狀態 S2 使用給定的分數函式

E21= 分數2,H1)

E22= 分數2,H2)

E23= 分數2,H3)

E24= 分數2,H4)

  • 標準化校準分數 E**2j** 使用softmax可產生注意力權重 A**2j**:

A21= Exp (e21)/(Exp (e21) + Exp (e22) + Exp (e23) + Exp (e24))

A22= Exp (e22)/(Exp (e21) + Exp (e22) + Exp (e23) + Exp (e24))

A23= Exp (e23)/(Exp (e21) + Exp (e22) + Exp (e23) + Exp (e24))

A24= Exp (e24)/(Exp (e21) + Exp (e22) + Exp (e23) + Exp (e24))

  • 參與背景關系向量 C2 由編碼器隱藏狀態的乘積的線性和匯出 H 對齊得分a 2j :

C2= H1* A21+ H2* A22+ H3* A23+ H4* A24

  • 參與背景關系向量 C2 和目標隱藏狀態 S2 連接以產生一個有參與的隱藏向量 S2

S2= 串聯 ([s2; C2])

  • 有人參與隱藏矢量 S2 然后被送入致密層以產生 Y2

Y2= 密集 (秒2)

我們可以對目標時間步驟i = 3執行類似的步驟來產生 Y**3.**

我知道這是大量的數學和理論,但是現在理解這一點將有助于你掌握注意力機制背后的基本思想,這催生了NLP的許多最新發展,現在你已經準備好留下自己的印記了!

示例代碼

找到整個筆記本 這里 ,

寫在最后

深呼吸 -- 我們在這篇文章中談到了很多地方,恭喜您使用深度學習構建了第一個文本摘要模型!我們已經了解了如何使用 Python 中的 Seq2Seq 建模來構建我們自己的文本摘要器,

如果您對本文有任何反饋或任何疑問/疑問,請在下面的評論部分分享,我會回復您,并確保您使用我們在此處構建的模型進行實驗,并與社區分享您的結果!


作者:設計稿智能生成代碼
鏈接:https://juejin.im/post/6891937843103727630
來源:掘金
著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處,

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

標籤:其他

上一篇:Verilog小總結

下一篇:SpringBoot其實一點都不難

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

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more