999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于自然語言處理的Word2Vec詞向量應用

2020-08-13 10:02:56石鳳貴
黑河學院學報 2020年7期
關鍵詞:文本模型

石鳳貴

(馬鞍山師范高等專科學校 軟件工程系,安徽 馬鞍山 243041)

計算機底層處理的是“0”和“1”,“0”和“1”是計算機特有的語言。計算機底層只能識別和計算數字,那么處理文本數據時,首先需要對文本數據進行數字化預處理。早期采用One-Hot獨熱編碼處理,但沒有考慮詞的含義和詞與詞的關系。目前,最常見且效果較好的是詞向量方法,其經典模型是Word2Vec[1]。詞向量包括詞和向量。英文中詞之間有明顯的分隔標記,中文中詞與詞之間沒有明顯的分隔,不同的斷句中文意思不同。制作詞向量之前需要進行文本分詞。文中將介紹詞向量機制和Word2Vec詞模型應用。

1 中文分詞

計算機進行文本分析與理解的首要任務就是分詞。中文語句結構復雜,不同的斷句表達的意思不同,同一個詞不同的語句和文本中表達的意思不盡相同,詞語的劃分難以界定。

句子中含有歧義詞、網絡詞、新詞。分詞就是采用一定的分詞規則和機制將語句切分為詞組成的詞列表,分詞算法主要有基于詞表的分詞算法、基于機器學習的分詞算法和基于理解的分詞算法[2]。

基于詞表的分詞算法是一種字符串匹配的分詞算法,包括正向最大匹配、逆向最大匹配和雙向匹配等,這種分詞算法簡單、快速、易實現。在字符串匹配的分詞算法基礎上,優化衍生出了其他的分詞算法。基于機器學習的分詞算法是一種基于統計的分詞算法,在處理歧義及新詞上較好,但需要依賴標注語料和訓練。

目前,出現了多種分詞算法和分詞工具,每種分詞工具既有優點,也有缺點。可以引入評價機制對分詞算法和工具進行評價,評價標準主要有混淆矩陣、準確率、精確率、召回率和F1值。

2 詞向量

自然語言處理對詞語語義的理解需要將詞轉化為數學表示形式,然后按照數學規則進行計算。自然語言處理需要解決三大問題:一是分詞、詞性標注和命名實體識別的語法層面任務;二是詞嵌入即詞向量,將詞映射到向量空間;三是句向量,將句子映射到向量空間。其中詞嵌入是自然語言處理的一個關鍵技術[2]。

2.1 “嵌入”數學含義

Embed詞中文意思為“嵌入”,其分詞在數學中是一個專有名詞——Embedding(嵌入),廣泛應用于代數、拓撲和幾何等數學領域,主要表征數學結構中的一個實例被包含在另外一個實例中。

如“整數”包含在“有理數”中,有理數為一個group,則整數為一個subgroup,整數“嵌入”到有理數中。假設對象X被嵌入到對象Y中,那么Embedding就可以表示為一個單射、結構保持的映射,結構保持依賴于X和Y的數據結構實例而定。整數集合中的每個數在有理數集合中均能找到唯一的一個對應數即其本身,同時,每個數的性質同樣在有理數集合中得到了保持[3]。

2.2 詞嵌入

Word Embedding(詞嵌入)并不是要把詞鑲嵌到某個地方,而是要把詞嵌入到一個空間,需要關注的是映射關系。Word Embedding是NLP(Natural Language Processing,自然語言處理)中一組語言模型(Language Model)和特征學習技術(Feature Learning Technique)的總稱,把詞匯表中的詞映射成實數構成的向量。

詞嵌入或分布式向量(Distributional Vectors)就是將自然語言表示的詞語轉換為計算機能夠理解的向量或矩陣形式的技術。計算機要理解自然語言,需要考慮詞的語義(包括同義、近義)、語料中詞的上下文關系和向量的維度(即處理復雜度)等。同義詞或表示同類事物的詞之間的距離應該很近,需要用一種理想的表示方式來表示詞才能更好地理解詞語,從而更容易去做翻譯、問答、信息抽取等進一步的工作[4]。

早期,表達詞的方法有One-Hot、N-Gram、Cooccurrence matrix等。

2003年,Bengio提出了NLM,也就是Word Embedding的雛形。

2013年,Mikolov在之前的基礎上進行了優化,提出了Word2Vec,包含Continuous Bag-of-Words Model和 Skip-Gram Model。

Word Embedding基于分布式假設,用低維向量表示一個詞,從而基于向量的計算實施對詞的計算。Word Embedding就是用數學的方法構建詞與上下文之間的關系模型。

2.3 One-Hot

One-Hot稱為獨熱編碼,把每個詞用一個長的向量表示,詞表的大小為向量的維度,是一種稀疏向量,絕大數元素為0,表示當前詞的元素為1。如:

“計算機”表示為[0 1 0 0 0 0 0 0 0...]

“電腦”表示為[0 0 0 1 0 0 0 0 0...

One-Hot采用稀疏方式存儲,程序實現起來較簡潔容易,但存在“語義鴻溝”,詞之間都是孤立的。分布式表達(Distributional Representation)考慮了詞的相關性和相似性,采用向量的距離來衡量,向量的距離可以使用歐氏距離和向量余弦值衡量。

One-Hot是一種簡單的Word Embedding方法,把語料中的詞匯去重后按照一定的順序排列為詞匯表,每個詞表示為一個長度為N的向量,N為單詞總數。向量中,該詞所在的分量為1,其余為0。

例如,有語料庫如下[4]:

John likes to watch movies. Mary likes movies too.

John also likes to watch football games.

假設詞匯表排序結果如下:

{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5,"also":6, "football": 7, "games": 8, "Mary": 9, "too": 10}

那么則有如下word的向量表示:

John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

……

同時文檔也可以表示成向量,直接將各詞的詞向量表示相加,則上面兩句話表示為:

[1, 2, 1, 1, 2, 0, 0, 0, 1, 1]

[1, 1, 1, 1, 0, 1, 1, 1, 0, 0]

但One-Hot存在很大的局限性:沒有考慮語義的相似性,如“Woman”和“Lady”語義上相近;英語單詞復數表示;詞之間的位置關系;詞向量太長。

2.4 共現矩陣

對于One-Hot中沒有考慮詞之間的位置關系,可以采用N—Gram方法,但會導致計算量急劇增長,可以采用共現矩陣(Co-occurrence matrix)解決這個問題。根據共現矩陣思想,可以認為一個詞的意思與其臨近的前后緊密詞相關。可以設定一個窗口來找詞的臨近緊密詞,如圖1所示[4]:

圖1 設定窗口找臨近詞

窗口大小為2,與“rests”共同出現的詞為life、he、in、peace。于是可以利用這種共現關系來生成詞向量。

假設語料庫中有3份文本:

文本1:我喜歡運動。

文本2:我喜歡學習。

文本3:我熱愛NLP。

設定窗口大小為1,則可以得到一個對陣矩陣——共現矩陣,見表1。“我”和“喜歡”作為鄰居同時出現2次,因此表1中“我”和“喜歡”交叉位置值為2。所以,可以實現將word(詞)變換成向量,共現矩陣中每一行或每一列對應一個詞的向量表示。

表1 共現矩陣表

盡管共現矩陣一定程度上解決了詞之間的位置問題,但面臨著維度災難,word詞的向量太長,處理多文本時可操作性較差。

2.5 語言模型

語言模型就是通過統計方法計算一個句子的概率的模型,可以進行形式化的描述(公式1):

3 Word2Vec模型

Word2Vec是Word Embedding模型,由Tomas Mikolov在Google就職時提出的,是Google開源的一個工具包,作為Python的第三方工具包。Word2Vec包括CBOW(Continuous Bag-of-Words)算法和Skip-Gram算法。Word2Vec不同于Word Embedding之前的方法,能夠計算詞的語義相似性和類比。語義類比反應的是如下關系:

“皇上”–“皇后”≈ “男人”–“女人”

“英國”–“倫敦”≈ “法國”–“巴黎”≈“首都”

文本數據中的每一個詞,制作了一個映射,而不是簡單的用一個數字來表示,重點考慮了詞的含義和詞與詞之間的影響。

3.1 分詞與處理數據格式

訓練Word2Vec模型前,需要進行文本預處理,包括對語料進行分詞、去停用詞等。然后把分詞結果處理成Word2Vec處理的格式,可使用如下方法實現:

word2vec.LineSentence(source, max_sentence_length=10000,limit=None)

word2vec.PathLineSentences(path,max_sentence_length =10000,limit = None )

word2vec.Text8Corpus(fname,max_sentence_length =10000 )

source為分詞結果文件或分詞列表,每句一行,每個詞用空格隔開。PathLineSentences()處理path目錄下所有文件,自動合并,語料較大時推薦使用該方法,防止內存過載。Text8Corpus()所有分詞內容作為一個列表,文本容量較大時不推薦使用這個方法。上述方法都生成一個可迭代的對象,封裝的內容是分詞后的詞組成的列表。不同的是,LineSentence()是每行封裝成一個列表,這個列表的最大長度是max_sentence_length;而Text8Corpus()是對整個語料庫進行分割,每次都是max_sentence_length這個長度的列表。

(1)分詞

import jieba

import jieba.analyse

from gensim.models import word2vec

import textPreprocessing as textPre # 為作者之前自行封裝的一個文本預處理模塊工具

# 分詞(保存為文件)

corpus_file = "data/corpus.txt" # 語料摘選自《西游記》,見圖2

stopword_file = "dicts/stopwords.txt"

corpus_seg_file = "data/corpus_seg.txt"

corpus_seg = textPre.segment_file_line(corpus_file,stopword_file, corpus_seg_file)

圖2 《西游記》摘選語料

圖3 分詞結果

(2)分詞表處理成gensim處理格式

from gensim.models.word2vec import LineSentence,PathLineS entences,Text8Corpus

s_ls = LineSentence(corpus_seg_file)

list(s_ls)

處理結果:

[['ufeff', '蓋聞', '天地', '之數', '十二萬', '九千', '百歲', '一元', '一元', '分為'],

['十二', '乃子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌'],

……,

['五千四百歲', '正當', '寅會', '生', '人生', '獸', '生禽', '正謂', '天地人'],

['三才', '定位', '故曰', '生于', '寅']]

#

s_pls = PathLineSentences("data") # 處理目錄下所有文件

list(s_pls)

#

s_t8 = Text8Corpus(corpus_seg_file)

list(s_t8)

處理結果:

[['ufeff','蓋聞','天地',……,'三才','定位','故曰','生于','寅']]

3.2 訓練詞向量模型

word2vec.Word2Vec(sentences=None, size=100, window=5,min_count=5)

sentences是3.1中處理的數據,size是生成詞向量的大小即特征向量的維度,window是一個詞上下文的最大關聯距離,即考慮上下文幾個詞對這個詞有影響,min_count是忽略詞頻小于這個值的詞。

from gensim.models import word2vec

model = word2vec.Word2Vec(s_ls,size = 100,window=5,min_count=2)

model.save("model/wordvec_model.model") # 保存模型

3.3 應用模型

使用語料訓練模型后,就可以使用模型查看詞的向量、計算詞的相關詞、詞之間的相似度等。需要注意的是,若詞未在文本中出現,會報錯;若詞出現在文本中,但加載使用模型時仍然報錯,可能是訓練模型的參數min_count設置過大。

# 查看某一個詞的向量(要在分詞詞典內)

print('"百歲"詞向量: ',model['百歲'])

# 查看某個詞關系密切的幾個詞

print('"萬物"相關詞: ',model.most_similar(u'萬物',topn=10))

# 查看構成的詞匯表

print('模型詞匯表: ',model.wv.vocab.keys())

輸出結果:

"百歲"詞向量:

[ 3.1722072e-03 3.8287034e-03 1.0290809e-03-4.7823749e-03

……

-2.9335637e-03 4.8004515e-03 3.8950804e-03-4.2258538e-03]

"萬物"相關詞:

[('寅 ', 0.20572435855865479), ('正 當 ',0.10449893772602081), ('曰', 0.10259617865085602), ('未',0.09095393121242523), ('謂之', 0.08863461762666702), ('之會',0.08583557605743408), ('丑會', 0.07503118366003036), ('天地', 0.06942173093557358), ('氣', 0.0571199469268322), ('亥',0.05302652716636658)]

模型詞匯表:

dict_keys(['天地', '百歲', '一元', '丑', '寅', '巳', '未', '酉', '戌', '亥', '氣', '萬物', '五千四百歲', '故曰', '之會', '曰', '正當', '子', '謂之', '生', '至此', '丑會', '交合'])

如果模型已訓練好,可以直接加載模型,省去模型訓練步驟。

model_load = word2vec.Word2Vec.load("model/wordvec_model.model")

print(model_load['故曰'])

similar_list = model_load.most_similar(u'萬物',topn=5)

print('與"萬物"詞最相似的5個詞:')

for item in similar_list:

print(item[0], ":", item[1])

輸出結果:

[1.7317259e-03 4.7753360e-03 -3.1557090e-03 3.9798431e-03

……

-3.7062964e-03 -1.6768617e-03 -2.4658823e-03-1.3406312e-03]

與"萬物"詞最相似的5個詞:

寅 : 0.20572435855865479

正當 : 0.10449893772602081

曰 : 0.10259617865085602

未 : 0.09095393121242523

謂之 : 0.08863461762666702

4 Word2Vec模型應用

以《西游記》全文為語料。

4.1 設置參數

size = 400 # 每個詞的向量維度

window = 5 # 詞向量訓練時的上下文掃描窗口大小,窗口為5就是考慮前5個詞和后5個詞

min_count = 5 # 設置最低頻率,默認是5,如果一個詞語在文檔中出現的次數小于5,那么就會丟棄

workers = multiprocessing.cpu_count() # 訓練的進程數,默認是當前運行機器的處理器核數。

xyjCorpus_file = "data/西游記.txt" # 語料

xyjCorpus_seg_file = "data/西游記_seg.txt"

stopword_file = "dicts/stopwords.txt"

model_file = 'model/word_embedding_{0}.model'.format(size)# 模型文件名

4.2 訓練模型

# 訓練模型:如果模型存在就直接加載模型

def trainWordvec():

if os.path.exists(model_file) == False: #判斷模型文件是否存在,不存在則訓練模型,否則直接加載

'分詞'

if os.path.exists(xyjCorpus_seg_file) == False: # 如果分詞表已存在,則省去分詞步驟

xyjCorpus_seg = textPre.segment_file_line(xyjCorpus_file,stopword_file, xyjCorpus_seg_file)

'分詞表處理成gensim處理格式'

xyjCorpus_seg_gensim = LineSentence(xyjCorpus_seg_file)

'訓練'

xyjModel = word2vec.Word2Vec(xyjCorpus_seg_gensim, size=size, window=window, min_count=min_count,workers=workers)

'保存模型'

xyjModel.save(model_file)

else:

xyjModel = word2vec.Word2Vec.load(model_file)

return xyjModel

'End'

model_xyj = trainWordvec()

4.3 應用模型

(1)輸出詞向量

'輸出詞向量:詞需要在詞匯表中出現過'

word = "孫悟空"

print('"',word,'"詞向量:',)

print(model_xyj[word])

輸出結果:

" 孫悟空 "詞向量:

[ 0.00654764 0.14949934 -0.1149347 0.01632355-0.09168267 -0.04984085 …… 0.11063104 0.20870967-0.06634782 0.09105506]

(2)計算一個詞的相似詞

'計算一個詞的相似詞(相關詞)'

word_cal = "八戒"

words_similar = model_xyj.most_similar(word_cal) #window*2個

print('"', word_cal,'"的最相似詞:')

print(words_similar) # [(詞,相關度)]

print()

for item in words_similar:

print(item[0], " :", item[1])

輸出結果:

" 八戒 "的最相似詞:

[('沙 僧 ', 0.9997132420539856), ('行 者 ',0.9996129870414734), ('師父', 0.9991767406463623), ('笑',0.9984909892082214), ('說', 0.9979647397994995), ('哥',0.9979634284973145), ('不瞞', 0.9978933334350586), ('罷',0.9978001713752747), ('哥哥', 0.9976719617843628), ('悟空',0.9975489377975464)]

沙僧 : 0.9997132420539856

行者 : 0.9996129870414734

師父 : 0.9991767406463623

笑 : 0.9984909892082214

說 : 0.9979647397994995

哥 : 0.9979634284973145

不瞞 : 0.9978933334350586

罷 : 0.9978001713752747

哥哥 : 0.9976719617843628

悟空 : 0.9975489377975464

(3)計算兩個詞的相似度

'計算兩個詞之間的相似度(計算兩個詞向量的余弦值)'

similar1 = model_xyj.similarity("唐僧","鐵扇公主")

print(similar1)

similar2 = model_xyj.similarity("三太子","豬八戒")

print(similar2)

輸出結果:

0.99750483

0.9998449

(4)計算兩個列表的相似度

'計算兩個詞列表的相似度即余弦'

list1 = ['豬八戒', '三太子']

list2 = ['太上老君', '猴子']

similar3 = model_xyj.n_similarity(list1, list2)

print(list1,list2,"相似度為:",similar3)

輸出結果:

['豬八戒', '三太子'] ['太上老君', '猴子'] 相似度為:0.9999646

(5)選出列表中不同類的詞

list3 = ['哪吒','孫悟空', '玉皇大帝','豬八戒' ]

print(list3,"不同類的詞為:",model_xyj.doesnt_match(list3))

輸出結果:

['哪吒', '孫悟空', '玉皇大帝', '豬八戒'] 不同類的詞為: 玉皇大帝

5 結語

詞向量又叫詞嵌入,是自然語言處理中語言模型和特征學習技術的總稱。Word2Vec是一款廣泛使用的詞向量模型,用來生產詞向量。本研究以《西游記》全文為語料,詳細介紹Word2Vec詞模型的應用,包括參數設置、模型訓練、模型應用。

猜你喜歡
文本模型
一半模型
重要模型『一線三等角』
初中群文閱讀的文本選擇及組織
甘肅教育(2020年8期)2020-06-11 06:10:02
重尾非線性自回歸模型自加權M-估計的漸近分布
在808DA上文本顯示的改善
基于doc2vec和TF-IDF的相似文本識別
電子制作(2018年18期)2018-11-14 01:48:06
3D打印中的模型分割與打包
文本之中·文本之外·文本之上——童話故事《坐井觀天》的教學隱喻
論《柳毅傳》對前代文本的繼承與轉化
人間(2015年20期)2016-01-04 12:47:10
FLUKA幾何模型到CAD幾何模型轉換方法初步研究
主站蜘蛛池模板: 亚洲综合在线最大成人| 不卡的在线视频免费观看| 国产原创自拍不卡第一页| 精品国产www| 国产高清免费午夜在线视频| 亚洲人成人无码www| 伊人久久综在合线亚洲2019| 欧类av怡春院| 欧美翘臀一区二区三区| 白丝美女办公室高潮喷水视频 | 思思热在线视频精品| 国产亚洲欧美另类一区二区| 91欧美亚洲国产五月天| 国产成人1024精品下载| 欧美性久久久久| 欧美国产视频| 99热亚洲精品6码| 日本久久久久久免费网络| 中文字幕资源站| 久久黄色毛片| 国产精品v欧美| 一本无码在线观看| 亚洲高清在线天堂精品| 欧美色综合网站| 欧美成人看片一区二区三区| 欧美无专区| 国产69精品久久久久孕妇大杂乱| 日韩大片免费观看视频播放| 欧美在线视频不卡第一页| 国产视频自拍一区| a级高清毛片| 亚洲第一在线播放| 国产办公室秘书无码精品| а∨天堂一区中文字幕| 91极品美女高潮叫床在线观看| 国产传媒一区二区三区四区五区| 狠狠做深爱婷婷综合一区| 久久无码免费束人妻| 欧美区一区二区三| 中文字幕无线码一区| 国产成人亚洲精品色欲AV| 国产精品高清国产三级囯产AV| 中文字幕在线免费看| 久久国产精品娇妻素人| 日本人妻一区二区三区不卡影院 | 青青热久免费精品视频6| 欧美精品v| 色婷婷成人| 怡红院美国分院一区二区| 精品视频91| 亚洲无码视频图片| 特级欧美视频aaaaaa| 精品无码国产自产野外拍在线| 99热免费在线| 国产凹凸视频在线观看| www中文字幕在线观看| 极品私人尤物在线精品首页| 人妻丰满熟妇啪啪| 亚洲精品国产乱码不卡| 老熟妇喷水一区二区三区| 91视频精品| 波多野结衣无码中文字幕在线观看一区二区| 18禁黄无遮挡网站| 亚洲AV无码乱码在线观看裸奔 | 日韩无码视频网站| 欧美成a人片在线观看| 97在线免费| 亚洲码在线中文在线观看| 国产69囗曝护士吞精在线视频| 97精品伊人久久大香线蕉| 91福利免费| 国产精品嫩草影院av| 国产簧片免费在线播放| 国产精品香蕉在线观看不卡| 99热这里只有精品免费国产| 国产成人久久777777| 亚洲欧美一区二区三区蜜芽| 国产情精品嫩草影院88av| 色综合久久88色综合天天提莫 | 天天躁夜夜躁狠狠躁图片| 久久亚洲国产一区二区| 中文毛片无遮挡播放免费|