偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

使用馬爾可夫鏈構(gòu)建文本生成器

人工智能 機(jī)器學(xué)習(xí)
本文中將介紹一個(gè)流行的機(jī)器學(xué)習(xí)項(xiàng)目——文本生成器,你將了解如何構(gòu)建文本生成器,并了解如何實(shí)現(xiàn)馬爾可夫鏈以實(shí)現(xiàn)更快的預(yù)測模型。

本文中將介紹一個(gè)流行的機(jī)器學(xué)習(xí)項(xiàng)目——文本生成器,你將了解如何構(gòu)建文本生成器,并了解如何實(shí)現(xiàn)馬爾可夫鏈以實(shí)現(xiàn)更快的預(yù)測模型。

圖片

文本生成器簡介

文本生成在各個(gè)行業(yè)都很受歡迎,特別是在移動、應(yīng)用和數(shù)據(jù)科學(xué)領(lǐng)域。甚至新聞界也使用文本生成來輔助寫作過程。

在日常生活中都會接觸到一些文本生成技術(shù),文本補(bǔ)全、搜索建議,Smart Compose,聊天機(jī)器人都是應(yīng)用的例子,

本文將使用馬爾可夫鏈構(gòu)建一個(gè)文本生成器。這將是一個(gè)基于字符的模型,它接受鏈的前一個(gè)字符并生成序列中的下一個(gè)字母。

通過使用樣例單詞訓(xùn)練我們的程序,文本生成器將學(xué)習(xí)常見的字符順序模式。然后,文本生成器將把這些模式應(yīng)用到輸入,即一個(gè)不完整的單詞,并輸出完成該單詞的概率最高的字符。

文本生成是自然語言處理的一個(gè)分支,它根據(jù)之前觀察到的語言模式預(yù)測并生成下一個(gè)字符。

在沒有機(jī)器學(xué)習(xí)之前,NLP是通過創(chuàng)建一個(gè)包含英語中所有單詞的表,并將傳遞的字符串與現(xiàn)有的單詞匹配來進(jìn)行文字生成的。這種方法有兩個(gè)問題。

  • 搜索成千上萬個(gè)單詞會非常慢。
  • 生成器只能補(bǔ)全它以前見過的單詞。

機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的出現(xiàn),使得NLP允許我們大幅減少運(yùn)行時(shí)并增加通用性,因?yàn)樯善骺梢酝瓿伤郧皬奈从龅竭^的單詞。如果需要NLP可以擴(kuò)展到預(yù)測單詞、短語或句子!

對于這個(gè)項(xiàng)目,我們將專門使用馬爾可夫鏈來完成。馬爾可夫過程是許多涉及書面語言和模擬復(fù)雜分布樣本的自然語言處理項(xiàng)目的基礎(chǔ)。

馬爾可夫過程是非常強(qiáng)大的,以至于它們只需要一個(gè)示例文檔就可以用來生成表面上看起來真實(shí)的文本。

什么是馬爾可夫鏈?

馬爾可夫鏈?zhǔn)且环N隨機(jī)過程,它為一系列事件建模,其中每個(gè)事件的概率取決于前一個(gè)事件的狀態(tài)。該模型有一組有限的狀態(tài),從一個(gè)狀態(tài)移動到另一個(gè)狀態(tài)的條件概率是固定的。

每次轉(zhuǎn)移的概率只取決于模型的前一個(gè)狀態(tài),而不是事件的整個(gè)歷史。

例如,假設(shè)想要構(gòu)建一個(gè)馬爾可夫鏈模型來預(yù)測天氣。

在這個(gè)模型中我們有兩種狀態(tài),晴天或雨天。如果我們今天一直處于晴朗的狀態(tài),明天就有更高的概率(70%)是晴天。雨也是如此;如果已經(jīng)下過雨,很可能還會繼續(xù)下雨。

但是天氣會改變狀態(tài)是有可能的(30%),所以我們也將其包含在我們的馬爾可夫鏈模型中。

馬爾可夫鏈?zhǔn)俏覀冞@個(gè)文本生成器的完美模型,因?yàn)槲覀兊哪P蛯H使用前一個(gè)字符預(yù)測下一個(gè)字符。使用馬爾可夫鏈的優(yōu)點(diǎn)是,它是準(zhǔn)確的,內(nèi)存少(只存儲1個(gè)以前的狀態(tài))并且執(zhí)行速度快。

文本生成的實(shí)現(xiàn)

這里將通過6個(gè)步驟完成文本生成器:

  1. 生成查找表:創(chuàng)建表來記錄詞頻
  2. 將頻率轉(zhuǎn)換為概率:將我們的發(fā)現(xiàn)轉(zhuǎn)換為可用的形式
  3. 加載數(shù)據(jù)集:加載并利用一個(gè)訓(xùn)練集
  4. 構(gòu)建馬爾可夫鏈:使用概率為每個(gè)單詞和字符創(chuàng)建鏈
  5. 對數(shù)據(jù)進(jìn)行采樣:創(chuàng)建一個(gè)函數(shù)對語料庫的各個(gè)部分進(jìn)行采樣
  6. 生成文本:測試我們的模型

1、生成查找表

首先,我們將創(chuàng)建一個(gè)表,記錄訓(xùn)練語料庫中每個(gè)字符狀態(tài)的出現(xiàn)情況。從訓(xùn)練語料庫中保存最后的' K '字符和' K+1 '字符,并將它們保存在一個(gè)查找表中。

例如,想象我們的訓(xùn)練語料庫包含,“the man was, they, then, the, the”。那么單詞的出現(xiàn)次數(shù)為:

  • “the” — 3
  • “then” — 1
  • “they” — 1
  • “man” — 1

下面是查找表中的結(jié)果:

圖片

在上面的例子中,我們?nèi) = 3,表示將一次考慮3個(gè)字符,并將下一個(gè)字符(K+1)作為輸出字符。在上面的查找表中將單詞(X)作為字符,將輸出字符(Y)作為單個(gè)空格(" "),因?yàn)榈谝粋€(gè)the后面沒有單詞了。此外還計(jì)算了這個(gè)序列在數(shù)據(jù)集中出現(xiàn)的次數(shù),在本例中為3次。

這樣就生成了語料庫中的每個(gè)單詞的數(shù)據(jù),也就是生成所有可能的X和Y對。

下面是我們?nèi)绾卧诖a中生成查找表:

 def generateTable(data,k=4):

T = {}
for i in range(len(data)-k):
X = data[i:i+k]
Y = data[i+k]
#print("X %s and Y %s "%(X,Y))
if T.get(X) is None:
T[X] = {}
T[X][Y] = 1
else:
if T[X].get(Y) is None:
T[X][Y] = 1
else:
T[X][Y] += 1
return T
T = generateTable("hello hello helli")
print(T)

#{'llo ': {'h': 2}, 'ello': {' ': 2}, 'o he': {'l': 2}, 'lo h': {'e': 2}, 'hell': {'i': 1, 'o': 2}, ' hel': {'l': 2}}

代碼的簡單解釋:

在第3行,創(chuàng)建了一個(gè)字典,它將存儲X及其對應(yīng)的Y和頻率值。第9行到第17行,檢查X和Y的出現(xiàn)情況,如果查找字典中已經(jīng)有X和Y對,那么只需將其增加1。

2、將頻率轉(zhuǎn)換為概率

一旦我們有了這個(gè)表和出現(xiàn)的次數(shù),就可以得到在給定x出現(xiàn)之后出現(xiàn)Y的概率。公式是:

例如如果X = the, Y = n,我們的公式是這樣的:

當(dāng)X =the時(shí)Y = n的頻率:2,表中總頻率:8,因此:P = 2/8= 0.125= 12.5%

以下是我們?nèi)绾螒?yīng)用這個(gè)公式將查找表轉(zhuǎn)換為馬爾科夫鏈可用的概率:

 def convertFreqIntoProb(T):    
for kx in T.keys():
s = float(sum(T[kx].values()))
for k in T[kx].keys():
T[kx][k] = T[kx][k]/s

return T

T = convertFreqIntoProb(T)
print(T)
#{'llo ': {'h': 1.0}, 'ello': {' ': 1.0}, 'o he': {'l': 1.0}, 'lo h': {'e': 1.0}, 'hell': {'i': 0.3333333333333333, 'o': 0.6666666666666666}, ' hel': {'l': 1.0}}

簡單解釋:

把一個(gè)特定鍵的頻率值加起來,然后把這個(gè)鍵的每個(gè)頻率值除以這個(gè)加起來的值,就得到了概率。

3、加載數(shù)據(jù)集

接下來將加載真正的訓(xùn)練語料庫??梢允褂萌魏蜗胍拈L文本(.txt)文檔。

為了簡單起見將使用一個(gè)政治演講來提供足夠的詞匯來教授我們的模型。

 text_path = "train_corpus.txt"
def load_text(filename):
with open(filename,encoding='utf8') as f:
return f.read().lower()

text = load_text(text_path)
print('Loaded the dataset.')

這個(gè)數(shù)據(jù)集可以為我們這個(gè)樣例的項(xiàng)目提供足夠的事件,從而做出合理準(zhǔn)確的預(yù)測。與所有機(jī)器學(xué)習(xí)一樣,更大的訓(xùn)練語料庫將產(chǎn)生更準(zhǔn)確的預(yù)測。

4、建立馬爾可夫鏈

讓我們構(gòu)建馬爾可夫鏈,并將概率與每個(gè)字符聯(lián)系起來。這里將使用在第1步和第2步中創(chuàng)建的generateTable()和convertFreqIntoProb()函數(shù)來構(gòu)建馬爾可夫模型。

 def MarkovChain(text,k=4):
T = generateTable(text,k)
T = convertFreqIntoProb(T)
return T

model = MarkovChain(text)

第1行,創(chuàng)建了一個(gè)方法來生成馬爾可夫模型。該方法接受文本語料庫和K值,K值是告訴馬爾可夫模型考慮K個(gè)字符并預(yù)測下一個(gè)字符的值。第2行,通過向方法generateTable()提供文本語料庫和K來生成查找表,該方法是我們在上一節(jié)中創(chuàng)建的。第3行,使用convertFreqIntoProb()方法將頻率轉(zhuǎn)換為概率值,該方法也是我們在上一課中創(chuàng)建的。

5、文本采樣

創(chuàng)建一個(gè)抽樣函數(shù),它使用未完成的單詞(ctx)、第4步中的馬爾可夫鏈模型(模型)和用于形成單詞基的字符數(shù)量(k)。

我們將使用這個(gè)函數(shù)對傳遞的上下文進(jìn)行采樣,并返回下一個(gè)可能的字符,并判斷它是正確的字符的概率。

 import numpy as np

def sample_next(ctx,model,k):

ctx = ctx[-k:]
if model.get(ctx) is None:
return " "
possible_Chars = list(model[ctx].keys())
possible_values = list(model[ctx].values())

print(possible_Chars)
print(possible_values)

return np.random.choice(possible_Chars,p=possible_values)

sample_next("commo",model,4)

#['n']
#[1.0]

代碼解釋:

函數(shù)sample_next接受三個(gè)參數(shù):ctx、model和k的值。

ctx是用來生成一些新文本的文本。但是這里只有ctx中的最后K個(gè)字符會被模型用來預(yù)測序列中的下一個(gè)字符。例如,我們傳遞common,K = 4,模型用來生成下一個(gè)字符的文本是是ommo,因?yàn)轳R爾可夫模型只使用以前的歷史。

在第 9 行和第 10 行,打印了可能的字符及其概率值,因?yàn)檫@些字符也存在于我們的模型中。我們得到下一個(gè)預(yù)測字符為n,其概率為1.0。因?yàn)?commo 這個(gè)詞在生成下一個(gè)字符后更可能是更常見的

在第12行,我們根據(jù)上面討論的概率值返回一個(gè)字符。

6、生成文本

最后結(jié)合上述所有函數(shù)來生成一些文本。

def generateText(starting_sent,k=4,maxLen=1000):

sentence = starting_sent
ctx = starting_sent[-k:]

for ix in range(maxLen):
next_prediction = sample_next(ctx,model,k)
sentence += next_prediction
ctx = sentence[-k:]
return sentence

print("Function Created Successfully!")

text = generateText("dear",k=4,maxLen=2000)
print(text)

結(jié)果如下:

dear country brought new consciousness. i heartily great service of their lives, our country, many of tricoloring a color flag on their lives independence today.my devoted to be oppression of independence.these day the obc common many country, millions of oppression of massacrifice of indian whom everest.
my dear country is not in the sevents went was demanding and nights by plowing in the message of the country is crossed, oppressed, women, to overcrowding for years of the south, it is like the ashok chakra of constitutional states crossed, deprived, oppressions of freedom, i bow my heart to proud of our country.my dear country, millions under to be a hundred years of the south, it is going their heroes.

上面的函數(shù)接受三個(gè)參數(shù):生成文本的起始詞、K的值以及需要文本的最大字符長度。運(yùn)行代碼將得到一個(gè)以“dear”開頭的2000個(gè)字符的文本。

雖然這段講話可能沒有太多意義,但這些詞都是完整的,通常模仿了單詞中熟悉的模式。

接下來要學(xué)什么

這是一個(gè)簡單的文本生成項(xiàng)目。通過這個(gè)項(xiàng)目可以了解自然語言處理和馬爾可夫鏈實(shí)際工作模式,可以在繼續(xù)您的深度學(xué)習(xí)之旅時(shí)使用。

本文只是為了介紹馬爾可夫鏈來進(jìn)行的實(shí)驗(yàn)項(xiàng)目,因?yàn)樗粫賹?shí)際應(yīng)用中起到任何的作用,如果你想獲得更好的文本生成效果,那么請學(xué)習(xí)GPT-3這樣的工具。

責(zé)任編輯:華軒 來源: DeepHub IMBA
相關(guān)推薦

2024-12-23 08:00:00

2009-10-12 13:10:58

馬爾可夫鏈

2024-03-28 14:29:52

人工智能

2018-03-27 13:33:48

百度

2024-02-23 15:53:13

OpenAISora人工智能

2016-01-08 10:55:31

PHP莫斯電碼生成器

2016-12-21 10:55:55

PHP莫斯電碼生成器

2022-12-15 08:49:58

ReactQR生成器

2024-03-07 20:35:20

微軟人工智能

2022-02-15 10:30:58

UUID

2021-12-10 09:45:19

生成器配置代碼

2022-10-17 18:29:55

2022-08-28 19:10:37

JavaScript二維碼源碼

2015-08-25 11:07:58

2017-07-01 16:02:39

分布式ID生成器

2025-01-23 08:36:27

CSS開發(fā)工具

2011-12-23 13:42:05

JavaScript

2010-09-07 16:31:17

SQL語句insert

2021-04-22 21:15:38

Generator函數(shù)生成器

2023-04-18 14:43:05

人工智能語言模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號