91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用深度學習執(zhí)行文本實體提取

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2020-12-25 19:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文介紹了如何使用深度學習執(zhí)行文本實體提取。作者嘗試了分別使用深度學習和傳統(tǒng)方法來提取文章信息,結(jié)果深度學習的準確率達到了 85%,遠遠領(lǐng)先于傳統(tǒng)算法的 65%。

引言

文本實體提取是自然語言處理(NLP)的主要任務(wù)之一。隨著近期深度學習領(lǐng)域快速發(fā)展,我們可以將這些算法應(yīng)用到 NLP 任務(wù)中,并得到準確率遠超傳統(tǒng)方法的結(jié)果。我嘗試過分別使用深度學習和傳統(tǒng)方法來提取文章信息,結(jié)果非常驚人:深度學習的準確率達到了 85%,遠遠領(lǐng)先于傳統(tǒng)算法的 65%。

本項目的目標是把文章中的每個單詞標注為以下四種類別之一:組織、個人、雜項以及其他;然后找到文中最突出的組織和名稱。深度學習模型對每個單詞完成上述標注,隨后,我們使用基于規(guī)則的方法來過濾掉我們不想要的標注,并確定最突出的名稱和組織。

在這里要感謝 Guillaume Genthial 這篇關(guān)于序列標注的文章(https://guillaumegenthial.github.io/),本項目建立在這篇文章的基礎(chǔ)之上。

模型的高級架構(gòu)

架構(gòu)

上圖是對每個單詞進行分類標注的模型高級架構(gòu)。在建模過程中,最耗時間的部分是單詞分類。我將解釋模型的每個組成部分,幫助讀者對模型組件有一個全面的、更高層次的理解。通常,模型組件可分為三部分:

單詞表征:在建模第一步,我們需要做的是加載一些預(yù)訓練詞嵌入(GloVe)。同時,我們需要從字符中提取出一些含義。

語境單詞表征:我們需要利用 LSTM,對語境中的每一個單詞得到一個有意義的表征。

解碼:當我們得到表示單詞的向量后,我們就可以用它進行預(yù)測。

hot encoding(用數(shù)值表示單詞)

深度學習算法只接受數(shù)值型數(shù)據(jù)作為輸入,而無法處理文本數(shù)據(jù)。如果想要在大量的非數(shù)值場景下使用深度神經(jīng)網(wǎng)絡(luò),就需要將輸入數(shù)據(jù)轉(zhuǎn)變數(shù)值形式。這個過程就是 hot encoding。

下面是一小段實現(xiàn) hot encoding 的代碼示例:

word_counts = Counter(words)sorted_vocab = sorted(word_counts, key=word_counts.get, reverse=True)int_to_vocab = {ii: word for ii, word in enumerate(sorted_vocab)}vocab_to_int = {word: ii for ii, word in int_to_vocab.items()}

同樣地,我們必須獲取輸入數(shù)據(jù)中的所有字符,然后將其轉(zhuǎn)化為向量,作為字符嵌入。

單詞嵌入 & 字符嵌入

單詞嵌入是處理文本問題時使用的一種通過學習得到的表征方式,其中含義相同的單詞表征相近。通常,我們利用神經(jīng)網(wǎng)絡(luò)來實現(xiàn)單詞嵌入,其中使用的單詞或短語來自于詞庫,并需要轉(zhuǎn)變?yōu)閷崝?shù)構(gòu)成的向量形式。

但是,在數(shù)據(jù)集上生成詞向量計算成本很高,我們可以使用一些預(yù)訓練的單詞嵌入來避免這個問題:比如使用斯坦福大學的 NLP 研究者提供的 GloVe 向量。

字符嵌入是字符的向量表征,可用于推導詞向量。之所以會使用字符嵌入,是因為許多實體并沒有對應(yīng)的預(yù)訓練詞向量,所以我們需要用字符向量來計算詞向量。

LSTM

傳統(tǒng)神經(jīng)網(wǎng)絡(luò) VS 循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)

循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)是人工神經(jīng)網(wǎng)絡(luò)的一種,用于序列數(shù)據(jù)中的模式識別,例如文本、基因組、手寫筆跡、口語詞匯,或者來自傳感器、股市和政府機構(gòu)的數(shù)值型時間序列數(shù)據(jù)。它可以「理解」文本的語境含義。

RNN 神經(jīng)元

LSTM 是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò),相比于簡單的循環(huán)神經(jīng)網(wǎng)絡(luò),它可以存儲更多的語境信息。簡單的 RNN 和 LSTM 之間的主要區(qū)別在于它們各自神經(jīng)元的結(jié)構(gòu)不同。

對于語境中的每一個單詞,我們都需要利用 LSTM 得到它在所處語境中的有意義表征。

條件隨機場(CRF)

在預(yù)測標注最后的解碼步驟中,我們可以使用 softmax 函數(shù)。當我們使用 softmax 函數(shù)時,它給出單詞屬于每個分類的概率。但這個方法給出的是局部選擇;換句話說,即使我們從文本語境中提取出了一些信息,標注決策過程依然是局部的,我們在使用 softmax 激活函數(shù)時,并沒有使用到鄰近單詞的標注決策。例如,在「New York」這個詞中,我們將「York」標注為一個地方,事實上,這應(yīng)該可以幫助我們確定『New』對應(yīng)地方的開始。

在 CRF 中,我們的輸入數(shù)據(jù)是序列數(shù)據(jù);同時,我們在某個數(shù)據(jù)點上進行預(yù)測時,需要考慮先前文本的語境。在本項目中,我們使用的是線性鏈 CRF。在線性鏈 CRF 中,特征只依賴當前標注和之前的標注,而不是整個句子中的任意標注。

為了對這個行為建模,我們將使用特征函數(shù),該函數(shù)包含多個輸入值:

句子s

單詞在句子中的位置i

當前單詞的標注 l_i

前一個單詞的標注 l_i?1

接下來,對每一個特征函數(shù) f_j 賦予權(quán)重 λ_j。給定一個句子s,現(xiàn)在我們可以根據(jù)下式計算s的標注l:對句子中所有單詞的加權(quán)特征求和。

基于詞性標注的特征函數(shù)示例

如果 l_i= ADVERB,且第 i 個單詞以『-ly』結(jié)尾,則 f_1(s,i,l_i,l_i?1)=1,否則取 0。如果對應(yīng)的權(quán)重 λ1 為正,且非常大,那么這個特征基本上就表示我們傾向于把以『-ly』結(jié)尾的單詞標注為 ADVERB。

如果 i=1,l_i= VERB,且句子以問號結(jié)尾,則 f_2(s,i,l_i,l_i?1)=1,否則取 0。如果對應(yīng)的權(quán)重 λ2 為正,且非常大,那么這個特征基本上就表示我們傾向于把疑問句的第一個單詞標為 VERB。(例,「Is this a sentence beginning with a verb?」)

如果 l_i?1= ADJECTIVE,且 l_i= NOUN,則 f_3(s,i,l_i,l_i?1)=1,否則為0。對應(yīng)權(quán)重為正時,表示我們傾向于認為名詞跟在形容詞之后。

如果 l_i?1= PREPOSITION,且 l_i= PREPOSITION,則 f_4(s,i,l_i,l_i?1)=1。此函數(shù)對應(yīng)的權(quán)重 λ4 為負,表示介詞不應(yīng)該跟著另一個介詞,因此我們應(yīng)該避免這樣的標注出現(xiàn)。

最后,我們可以通過取指數(shù)和歸一化,將這些得分轉(zhuǎn)換為 0~1 之間的概率 p(l|s)。

總之,要建立一個條件隨機場,你只需要定義一組特征函數(shù)(可以依賴于整個句子、單詞的當前位置和附近單詞的標注)、賦予權(quán)重,然后加起來,最后如果有需要,轉(zhuǎn)化為概率形式。簡單地說,需要做兩件事情:

1. 找到得分最高的標注序列;

2. 在全體標注序列上求出概率分布。

幸運的是,TensorFlow 提供了相關(guān)的庫,幫助我們可以很容易地實現(xiàn) CRF。

log_likelihood, transition_params=tf.contrib.crf.crf_log_likelihood(scores, labels, sequence_lengths)

模型的運行原理

對于每一個單詞,我們希望建立一個向量來捕捉其意義以及和任務(wù)相關(guān)的特征。我們將該向量構(gòu)建為 GloVe 單詞嵌入與包含字符級特征的向量的級聯(lián)。我們還可以選擇使用一些特定的神經(jīng)網(wǎng)絡(luò),自動提取出這些特征。在本文中,我們將在字符層面上使用雙向 LSTM 算法。

我們將 CONLL 數(shù)據(jù)集中的所有單詞都進行 hot-encode,這些單詞都在 GloVe 單詞嵌入中有對應(yīng)的實體。如上文所述,神經(jīng)網(wǎng)絡(luò)只接受向量,不接受文本,因此我們需要將單詞轉(zhuǎn)換為向量。CONLL 數(shù)據(jù)集包含單詞及其對應(yīng)標注。在 hot encoding 后,單詞和標注都被轉(zhuǎn)換成了向量。

用于 hot encoding 單詞及其對應(yīng)標注的代碼:

with open(self.filename) as f: words, tags = [], [] for line in f: line = line.strip() if (len(line) == 0 or line.startswith("-DOCSTART-")): if len(words) != 0: niter += 1 if self.max_iter is not None and niter > self.max_iter: break yield words, tags words, tags = [], [] else: ls = line.split(' ') word, tag = ls[0],ls[-1] if self.processing_word is not None: word = self.processing_word(word) if self.processing_tag is not None: tag = self.processing_tag(tag) words += [word] tags += [tag]

用于提取單詞、標注和字符向量的代碼:

if vocab_chars is not None and chars == True: char_ids = [] for char in word: # ignore chars out of vocabulary if char in vocab_chars: char_ids += [vocab_chars[char]]if lowercase: word = word.lower()if word.isdigit(): word = NUMif vocab_words is not None: if word in vocab_words: word = vocab_words[word] else: if allow_unk: word = vocab_words[UNK] else: print(word) print(vocab_words)if vocab_chars is not None and chars == True: return char_ids, wordelse: return word

現(xiàn)在,我們使用 TensorFlow 內(nèi)置的函數(shù)加載單詞嵌入。假定 embeddings 是一個 GloVe 嵌入的 numpy 數(shù)組,其中 embeddings[i] 表示第 i 個單詞的向量形式。

L = tf.Variable(embeddings, dtype=tf.float32, trainable=False)pretrained_embeddings = tf.nn.embedding_lookup(L, word_ids)

現(xiàn)在,我們可以構(gòu)建根據(jù)字符得到的單詞嵌入。這里,我們不需要任何預(yù)訓練字符嵌入。

_char_embeddings = tf.get_variable( nam, dtype=tf.float32, shape=[self.config.nchars, self.config.dim_char])char_embeddings = tf.nn.embedding_lookup(_char_embeddings, self.char_ids_tensor, nam)s = tf.shape(char_embeddings)char_embeddings = tf.reshape(char_embeddings, shape=[s[0]*s[1], s[-2], self.config.dim_char])word_lengths = tf.reshape(self.word_lengths_tensor, shape=[s[0]*s[1]])cell_fw = tf.contrib.rnn.LSTMCell(self.config.hidden_size_char, state_is_tuple=True)cell_bw = tf.contrib.rnn.LSTMCell(self.config.hidden_size_char, state_is_tuple=True)_output = tf.nn.bidirectional_dynamic_rnn( cell_fw, cell_bw, char_embeddings, sequence_length=word_lengths, dtype=tf.float32)

一旦得到了單詞表征,我們就可以直接在詞向量序列上運行 bi-LSTM,得到另一個向量序列。

cell_fw = tf.contrib.rnn.LSTMCell(self.config.hidden_size_lstm)cell_bw = tf.contrib.rnn.LSTMCell(self.config.hidden_size_lstm)(output_fw, output_bw), _ = tf.nn.bidirectional_dynamic_rnn( cell_fw, cell_bw, self.word_embeddings, sequence_length=self.sequence_lengths_tensor, dtype=tf.float32)output = tf.concat([output_fw, output_bw], axis=-1)output = tf.nn.dropout(output, self.dropout_tensor)

現(xiàn)在,每個單詞都和一個向量對應(yīng),其中向量記錄了這個單詞的含義、字符和語境。我們使用向量來做最后的預(yù)測。我們可以使用全連接神經(jīng)網(wǎng)絡(luò)求出一個向量,該向量中每個條目對應(yīng)每個標注的得分。

W = tf.get_variable("W", dtype=tf.float32, shape=[2*self.config.hidden_size_lstm, self.config.ntags])b = tf.get_variable("b", shape=[self.config.ntags], dtype=tf.float32, initializer=tf.zeros_initializer())nsteps = tf.shape(output)[1]output = tf.reshape(output, [-1, 2*self.config.hidden_size_lstm])pred = tf.matmul(output, W) + bself.logits = tf.reshape(pred, [-1, nsteps, self.config.ntags])

最后,我們使用 CRF 方法來計算每個單詞的標注。實現(xiàn) CRF 只需要一行代碼!下面的代碼計算出了損失,同時返回了在預(yù)測時很有用的 trans_params。

log_likelihood, _trans_params = tf.contrib.crf.crf_log_likelihood(self.logits, self.labels_tensor, self.sequence_lengths_tensor)self.trans_params = _trans_paramsself.loss = tf.reduce_mean(-log_likelihood)

現(xiàn)在,我們可以定義我們的訓練算子:

optimizer = tf.train.AdamOptimizer(self.lr_tensor)self.train_op = optimizer.minimize(self.loss)

一旦我們定義好模型,在數(shù)據(jù)集上完成很少的幾次迭代,就可以得到訓練好的模型了。

如何使用訓練好的模型

TensorFlow 提供了存儲模型權(quán)重的功能,這樣我們就可以在之后的場景中復(fù)原訓練好的模型。無論什么時候需要進行預(yù)測,我們都可以加載模型權(quán)重,這樣就不需要重新訓練了。

def save_session(self): """Saves session = weights""" if not os.path.exists(self.config.dir_model): os.makedirs(self.config.dir_model) self.saver.save(self.sess, self.config.dir_model)def restore_session(self, dir_model): self.saver.restore(self.sess, dir_model)

每篇文章都被分解為單詞再輸入到模型中,然后經(jīng)過上文所述一系列過程,得到輸出結(jié)果。模型最終輸出結(jié)果將每個單詞分為 4 類:組織、個人、雜項以及其他。這個算法通過基于規(guī)則的方法過濾結(jié)果,然后進一步正確提取出文本中最突出的名稱和組織,它并沒有達到 100% 的準確率。

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Linux Shell文本處理神器合集:15個工具+實戰(zhàn)例子,效率直接翻倍

    在 Linux 系統(tǒng)中,文本是數(shù)據(jù)交互的 “通用語言”—— 日志文件、配置文件、數(shù)據(jù)報表、程序輸出幾乎都以文本形式存在。手動編輯文本不僅繁瑣,還容易出錯,而掌握 Shell 文本處理工
    的頭像 發(fā)表于 02-03 15:42 ?1445次閱讀
    Linux Shell<b class='flag-5'>文本</b>處理神器合集:15個工具+實戰(zhàn)例子,效率直接翻倍

    飛凌嵌入式ElfBoard-進程之什么是進程

    將源碼轉(zhuǎn)換為計算機可以理解的二進制機器語言指令。解釋型腳本形式:腳本是包含命令的文本文件,可以由shell或者其他命令解釋器之類的程序直接處理。(如:python、Bash)等腳本語言通過解釋器執(zhí)行腳本可執(zhí)行文
    發(fā)表于 01-26 08:42

    初識ros2 功能包建立與可執(zhí)行文件的配置

    本文介紹了ROS2程序的兩種啟動方式:直接運行可執(zhí)行文件(ros2 run)和使用啟動文件(ros2 launch)。重點講解了Python軟件包的結(jié)構(gòu),包括package.xml、setup.py
    的頭像 發(fā)表于 01-22 13:41 ?223次閱讀

    機器學習深度學習中需避免的 7 個常見錯誤與局限性

    無論你是剛?cè)腴T還是已經(jīng)從事人工智能模型相關(guān)工作一段時間,機器學習深度學習中都存在一些我們需要時刻關(guān)注并銘記的常見錯誤。如果對這些錯誤置之不理,日后可能會引發(fā)諸多麻煩!只要我們密切關(guān)注數(shù)據(jù)、模型架構(gòu)
    的頭像 發(fā)表于 01-07 15:37 ?183次閱讀
    機器<b class='flag-5'>學習</b>和<b class='flag-5'>深度</b><b class='flag-5'>學習</b>中需避免的 7 個常見錯誤與局限性

    如何深度學習機器視覺的應(yīng)用場景

    深度學習視覺應(yīng)用場景大全 工業(yè)制造領(lǐng)域 復(fù)雜缺陷檢測:處理傳統(tǒng)算法難以描述的非標準化缺陷模式 非標產(chǎn)品分類:對形狀、顏色、紋理多變的產(chǎn)品進行智能分類 外觀質(zhì)量評估:基于學習的外觀質(zhì)量標準判定 精密
    的頭像 發(fā)表于 11-27 10:19 ?218次閱讀

    如何在機器視覺中部署深度學習神經(jīng)網(wǎng)絡(luò)

    圖 1:基于深度學習的目標檢測可定位已訓練的目標類別,并通過矩形框(邊界框)對其進行標識。 在討論人工智能(AI)或深度學習時,經(jīng)常會出現(xiàn)“神經(jīng)網(wǎng)絡(luò)”、“黑箱”、“標注”等術(shù)語。這些概
    的頭像 發(fā)表于 09-10 17:38 ?897次閱讀
    如何在機器視覺中部署<b class='flag-5'>深度</b><b class='flag-5'>學習</b>神經(jīng)網(wǎng)絡(luò)

    深度學習對工業(yè)物聯(lián)網(wǎng)有哪些幫助

    深度學習作為人工智能的核心分支,通過模擬人腦神經(jīng)網(wǎng)絡(luò)的層級結(jié)構(gòu),能夠自動從海量工業(yè)數(shù)據(jù)中提取復(fù)雜特征,為工業(yè)物聯(lián)網(wǎng)(IIoT)提供了從數(shù)據(jù)感知到智能決策的全鏈路升級能力。以下從技術(shù)賦能、場景突破
    的頭像 發(fā)表于 08-20 14:56 ?1021次閱讀

    自動駕駛中Transformer大模型會取代深度學習嗎?

    [首發(fā)于智駕最前沿微信公眾號]近年來,隨著ChatGPT、Claude、文心一言等大語言模型在生成文本、對話交互等領(lǐng)域的驚艷表現(xiàn),“Transformer架構(gòu)是否正在取代傳統(tǒng)深度學習”這一話題一直被
    的頭像 發(fā)表于 08-13 09:15 ?4181次閱讀
    自動駕駛中Transformer大模型會取代<b class='flag-5'>深度</b><b class='flag-5'>學習</b>嗎?

    飛書開源“RTV”富文本組件 重塑鴻蒙應(yīng)用富文本渲染體驗

    更高效的富文本解決方案。 富文本作為內(nèi)容展示和信息交互的重要形式,在內(nèi)容創(chuàng)作、辦公協(xié)作、教育學習、企業(yè)應(yīng)用等多種復(fù)雜業(yè)務(wù)場景中扮演著重要角色。隨著鴻蒙生態(tài)應(yīng)用類型的不斷豐富,富文本渲染
    的頭像 發(fā)表于 07-11 15:20 ?639次閱讀
    飛書開源“RTV”富<b class='flag-5'>文本</b>組件 重塑鴻蒙應(yīng)用富<b class='flag-5'>文本</b>渲染體驗

    嵌入式AI技術(shù)之深度學習:數(shù)據(jù)樣本預(yù)處理過程中使用合適的特征變換對深度學習的意義

    ? 作者:蘇勇Andrew 使用神經(jīng)網(wǎng)絡(luò)實現(xiàn)機器學習,網(wǎng)絡(luò)的每個層都將對輸入的數(shù)據(jù)做一次抽象,多層神經(jīng)網(wǎng)絡(luò)構(gòu)成深度學習的框架,可以深度理解數(shù)據(jù)中所要表示的規(guī)律。從原理上看,使用
    的頭像 發(fā)表于 04-02 18:21 ?1511次閱讀

    用樹莓派搞深度學習?TensorFlow啟動!

    介紹本頁面將指導您在搭載64位Bullseye操作系統(tǒng)的RaspberryPi4上安裝TensorFlow。TensorFlow是一個專為深度學習開發(fā)的大型軟件庫,它消耗大量資源。您可以在
    的頭像 發(fā)表于 03-25 09:33 ?1198次閱讀
    用樹莓派搞<b class='flag-5'>深度</b><b class='flag-5'>學習</b>?TensorFlow啟動!

    把樹莓派打造成識別文本的“神器”!

    在許多項目中,RaspberryPi被用作監(jiān)控攝像頭或執(zhí)行機器學習任務(wù)。在這些場景中,圖像中經(jīng)常包含應(yīng)用程序感興趣的文本信息。我們希望提取這些信息并將其轉(zhuǎn)換,以便通過程序分析
    的頭像 發(fā)表于 03-25 09:30 ?978次閱讀
    把樹莓派打造成識別<b class='flag-5'>文本</b>的“神器”!

    在OpenVINO?工具套件的深度學習工作臺中無法導出INT8模型怎么解決?

    無法在 OpenVINO? 工具套件的深度學習 (DL) 工作臺中導出 INT8 模型
    發(fā)表于 03-06 07:54

    如何排除深度學習工作臺上量化OpenVINO?的特定層?

    無法確定如何排除要在深度學習工作臺上量化OpenVINO?特定層
    發(fā)表于 03-06 07:31

    創(chuàng)建OpenVINO? Python腳本,運行可執(zhí)行文件時遇到的報錯怎么解決?

    ;Devices:\", ie.available_devices) 執(zhí)行以下行以使用 PyInstaller 構(gòu)建可執(zhí)行文件: pyinstaller test.py --onefile 運行
    發(fā)表于 03-05 10:20