第六章(1.2)自然語言處理實戰——打造屬於自己的中文word2vector工具
一、環境
二、實戰演練
- 訓練語料
source.txt
9月12日隨著頒獎典禮的結束,我院獲得了商委系統運動會系列活動之一——足球比賽的季軍,本次比賽立時十天,十二隻球隊分成兩個小組比賽。我院代表隊以小組第二名的成績出現,在和另一小組第二名石油公司爭奪三四名的比賽中,教師們超水平發揮,以五比一的比分大勝對手,獲得第三名的優異成績..
本次比賽由商委主辦,我院協辦,在我院漂亮的足球場地舉行。我院代表隊領隊孫增春、教練員張鵬,十八名隊員都是由學院各部門的老師組成,。並且是在不耽誤工作的情況下參加比賽的,商管系的張援越老師已經是年過四十的副教授,在場上依然是生龍活虎,不缺席每一場比賽,為球隊的勝利作出了很大的貢獻;體育部的樑浩老師, ,這次比賽擔任球隊的隊長,每場比賽都衝鋒在前,起到了表率作用;招辦的的張國權老師一直是帶傷比賽為球隊立下戰功。體育部的孫增春主任每常比賽親臨現場,給隊員打氣助威,為隊員們增加了信心.
學院領導對比賽非常重視,王院長几次到場為隊員們加油助威,許韻苓院助、許豔紅主任也給予了大力的支援,一切為了比賽開綠燈,為隊員們解決了很多後顧之憂。足球比賽第三名的成績,使我院在商務系統運動會總成績的排名又向前提升了一塊,同時也充分展示了學院在體育工作方面的優良成績。
體育教學部
- 需要運用到的包
#!/bin/bash
# -*-coding=utf-8-*-
import jieba
import re
from gensim.models import word2vec
import multiprocessing
import gensim
- 使用
jieba
切詞,並過濾文字中的標點符號,生成切詞檔案
def segment_text(source_corpus, train_corpus, coding, punctuation):
'''
切詞,去除標點符號
:param source_corpus: 原始語料
:param train_corpus: 切詞語料
:param coding: 檔案編碼
:param punctuation: 去除的標點符號
:return:
'''
with open(source_corpus, 'r', encoding=coding) as f, open(train_corpus, 'w', encoding=coding) as w:
for line in f:
# 去除標點符號
line = re.sub('[{0}]+'.format(punctuation), '', line.strip())
# 切詞
words = jieba.cut(line)
w.write(' '.join(words))
- 設定需要過濾的標點符號(注意:這裡也可以過濾特殊字元)
# 嚴格限制標點符號
strict_punctuation = '。,、':∶;?‘’“”〝〞ˆˇ﹕︰﹔﹖﹑·¨….¸;!´?!~—ˉ|‖"〃`@﹫¡¿﹏﹋﹌︴々﹟#﹩$﹠&﹪%*﹡﹢﹦﹤‐ ̄¯―﹨ˆ˜﹍﹎+=<__-\ˇ~﹉﹊()〈〉‹›﹛﹜『』〖〗[]《》〔〕{}「」【】︵︷︿︹︽_﹁﹃︻︶︸﹀︺︾ˉ﹂﹄︼'
# 簡單限制標點符號
simple_punctuation = '’!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~'
# 去除標點符號
punctuation = simple_punctuation + strict_punctuation
- 設定檔案編碼,原始語料,切詞語料,輸出模型檔案,模型引數
# 檔案編碼
coding = 'utf-8'
# 原始語料
source_corpus_text = 'source.txt'
# 是每個詞的向量維度
size = 400
# 是詞向量訓練時的上下文掃描視窗大小,視窗為5就是考慮前5個詞和後5個詞
window = 5
# 設定最低頻率,預設是5,如果一個詞語在文件中出現的次數小於5,那麼就會丟棄
min_count = 1
# 是訓練的程序數,預設是當前執行機器的處理器核數。
workers = multiprocessing.cpu_count()
# 切詞語料
train_corpus_text = 'words.txt'
# w2v模型檔案
model_text = 'w2v_size_{0}.model'.format(size)
- 切詞
# 切詞 @TODO 切詞後註釋
segment_text(source_corpus_text, train_corpus_text, coding, punctuation)
- 訓練word2vector模型
# w2v訓練模型 @TODO 訓練後註釋
sentences = word2vec.Text8Corpus(train_corpus_text)
model = word2vec.Word2Vec(sentences=sentences, size=size, window=window, min_count=min_count, workers=workers)
model.save(model_text)
- 載入訓練模型,列印詞向量(注意:詞需要在文字中出現過)
model = gensim.models.Word2Vec.load(model_text)
print(model['運動會'])
[ 5.77729312e-04 6.29229005e-04 3.28074140e-03 -3.12230410e-03
3.58627993e-03 -1.17090892e-03 -1.19168102e-03 4.79813945e-03
2.53833435e-03 -4.91693895e-03 4.33469191e-04 4.36443230e-03
2.68062111e-03 -4.80209151e-03 -1.00263488e-03 -6.90411602e-04
1.44691532e-03 4.22825292e-03 2.65496224e-03 3.37875634e-03
9.92664369e-04 -5.25792711e-04 4.22688853e-03 3.42451921e-03
4.13528131e-03 -9.61833517e-04 -3.25134676e-03 -4.56051296e-03
-1.79338397e-03 -1.44107558e-03 -5.76348466e-05 3.97552829e-03
4.96467901e-03 2.99101393e-03 4.31695720e-03 1.33437128e-03
-2.85419100e-03 4.18939814e-03 3.87660973e-03 3.83673748e-03
4.17304545e-04 -1.07788993e-03 -1.12797145e-03 -4.58187424e-03
-3.77954915e-03 -3.86176654e-03 1.82412425e-03 3.85237101e-04
1.85760713e-04 -2.44700629e-03 -2.03684112e-03 1.23822887e-04
-4.58160602e-03 3.57383513e-04 2.92601017e-03 -1.15508388e-03
-2.67226575e-03 -3.23730893e-03 7.30269181e-04 2.51975632e-03
-7.53291533e-04 -4.10789764e-03 6.79552031e-04 -3.64084938e-03
-3.41395871e-03 3.35737667e-03 -2.09669583e-03 -2.52196239e-03
2.53840582e-03 1.40796602e-03 2.21067248e-03 2.54736491e-03
-4.86714346e-03 3.46355117e-03 3.78919905e-03 -2.19983887e-03
-1.70295069e-03 3.36180092e-03 2.82198866e-03 9.91262612e-04
2.30853050e-03 -2.77805189e-03 4.64708824e-03 3.24234832e-03
2.93854857e-03 8.39327520e-04 1.29010330e-03 2.45986215e-04
-3.73935048e-03 -3.95879382e-03 -5.32814476e-04 -5.52327721e-04
8.64025322e-04 8.57468927e-04 -3.78349214e-03 -2.84406659e-03
-2.61127157e-03 3.54953948e-03 3.86928394e-03 2.82278913e-03]
- 計算一個詞的最近似詞(注意:詞需要在文字中出現過)
# 計算一個詞的最近似的詞,倒序
similar_words = model.most_similar('球隊')
for word in similar_words:
print(word[0], word[1])
情況 0.2297670692205429
副教授 0.1899721473455429
樑浩 0.18567171692848206
系列 0.18228858709335327
許韻苓 0.16966953873634338
教練員 0.16140426695346832
和 0.15026438236236572
幾次 0.14221936464309692
不 0.13802526891231537
了 0.13522613048553467
- 計算兩詞之間的餘弦相似度(注意:詞需要在文字中出現過)
sim1 = model.similarity('運動會', '總成績')
sim2 = model.similarity('排名', '運動會')
sim3 = model.similarity('展示', '學院')
sim4 = model.similarity('學院', '體育')
print(sim1)
print(sim2)
print(sim3)
print(sim4)
-0.0917341372671
0.0526127512661
0.081955751928
-0.139067511821
0.578819521306
-0.0909827364054
- 計算兩個集合之間的餘弦似度(注意:詞需要在文字中出現過)
list1 = ['運動會', '總成績']
list2 = ['排名', '運動會']
list3 = ['學院', '體育']
list_sim1 = model.n_similarity(list1, list2)
print(list_sim1)
list_sim2 = model.n_similarity(list1, list3)
print(list_sim2)
- 選出集合中不同類的詞語(注意:詞需要在文字中出現過)
list = ['隊員', '足球比賽', '小組', '代表隊']
print(model.doesnt_match(list))
list = ['隊員', '足球比賽', '小組', '西瓜']
print(model.doesnt_match(list))
代表隊
小組
- 執行
python word2vector.py
三 、實戰程式碼
word2vector.py
#!/bin/bash
# -*-coding=utf-8-*-
import jieba
import re
from gensim.models import word2vec
import multiprocessing
import gensim
def segment_text(source_corpus, train_corpus, coding, punctuation):
'''
切詞,去除標點符號
:param source_corpus: 原始語料
:param train_corpus: 切詞語料
:param coding: 檔案編碼
:param punctuation: 去除的標點符號
:return:
'''
with open(source_corpus, 'r', encoding=coding) as f, open(train_corpus, 'w', encoding=coding) as w:
for line in f:
# 去除標點符號
line = re.sub('[{0}]+'.format(punctuation), '', line.strip())
# 切詞
words = jieba.cut(line)
w.write(' '.join(words))
if __name__ == '__main__':
# 嚴格限制標點符號
strict_punctuation = '。,、':∶;?‘’“”〝〞ˆˇ﹕︰﹔﹖﹑·¨….¸;!´?!~—ˉ|‖"〃`@﹫¡¿﹏﹋﹌︴々﹟#﹩$﹠&﹪%*﹡﹢﹦﹤‐ ̄¯―﹨ˆ˜﹍﹎+=<__-\ˇ~﹉﹊()〈〉‹›﹛﹜『』〖〗[]《》〔〕{}「」【】︵︷︿︹︽_﹁﹃︻︶︸﹀︺︾ˉ﹂﹄︼'
# 簡單限制標點符號
simple_punctuation = '’!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~'
# 去除標點符號
punctuation = simple_punctuation + strict_punctuation
# 檔案編碼
coding = 'utf-8'
# 原始語料
source_corpus_text = 'source.txt'
# 是每個詞的向量維度
size = 400
# 是詞向量訓練時的上下文掃描視窗大小,視窗為5就是考慮前5個詞和後5個詞
window = 5
# 設定最低頻率,預設是5,如果一個詞語在文件中出現的次數小於5,那麼就會丟棄
min_count = 1
# 是訓練的程序數,預設是當前執行機器的處理器核數。
workers = multiprocessing.cpu_count()
# 切詞語料
train_corpus_text = 'words.txt'
# w2v模型檔案
model_text = 'w2v_size_{0}.model'.format(size)
# 切詞 @TODO 切詞後註釋
# segment_text(source_corpus_text, train_corpus_text, coding, punctuation)
# w2v訓練模型 @TODO 訓練後註釋
sentences = word2vec.Text8Corpus(train_corpus_text)
model = word2vec.Word2Vec(sentences=sentences, size=size, window=window, min_count=min_count, workers=workers)
model.save(model_text)
# 載入模型
model = gensim.models.Word2Vec.load(model_text)
# print(model['運動會'])
# 計算一個詞的最近似的詞,倒序
# similar_words = model.most_similar('球隊')
# for word in similar_words:
# print(word[0], word[1])
# 計算兩詞之間的餘弦相似度
# sim1 = model.similarity('運動會', '總成績')
# sim2 = model.similarity('排名', '運動會')
# sim3 = model.similarity('展示', '學院')
# sim4 = model.similarity('學院', '體育')
# print(sim1)
# print(sim2)
# print(sim3)
# print(sim4)
# 計算兩個集合之間的餘弦似度
list1 = ['運動會', '總成績']
list2 = ['排名', '運動會']
list3 = ['學院', '體育']
list_sim1 = model.n_similarity(list1, list2)
print(list_sim1)
list_sim2 = model.n_similarity(list1, list3)
print(list_sim2)
# 選出集合中不同類的詞語
list = ['隊員', '足球比賽', '小組', '代表隊']
print(model.doesnt_match(list))
list = ['隊員', '足球比賽', '小組', '西瓜']
print(model.doesnt_match(list))
四、注意
- 若詞未在文字中出現,會報錯
Traceback (most recent call last):
File "E:/專案/test/word2vec.py", line 64, in <module>
print(model['一週'])
File "D:\software\work\Anaconda3\lib\site-packages\gensim\models\word2vec.py", line 1281, in __getitem__
return self.wv.__getitem__(words)
File "D:\software\work\Anaconda3\lib\site-packages\gensim\models\keyedvectors.py", line 589, in __getitem__
return self.word_vec(words)
File "D:\software\work\Anaconda3\lib\site-packages\gensim\models\keyedvectors.py", line 288, in word_vec
raise KeyError("word '%s' not in vocabulary" % word)
KeyError: "word '一週' not in vocabulary"
- 若詞出現在文字中,但載入使用模型時仍然報錯,可能是訓練模型的引數
min_count
設定過大
# 設定最低頻率,預設是5,如果一個詞語在文件中出現的次數小於5,那麼就會丟棄
min_count = 1
相關推薦
第六章(1.2)自然語言處理實戰——打造屬於自己的中文word2vector工具
一、環境 二、實戰演練 訓練語料source.txt 9月12日隨著頒獎典禮的結束,我院獲得了商委系統運動會系列活動之一——足球比賽的季軍,本次比賽立時十天,十二隻球隊分成兩個小組比賽。我院代表隊以小組第二名的成績出現,在和另一小組第二名石油公
第六章(1.3)自然語言處理實戰——使用tf-idf演算法實現簡單的文字聚類
一、原理 使用jieba切詞 用td-idf計算文字的詞頻和逆文件詞頻 排序選出最重要的2個或3個詞作為這段文字的id 具有相同id的文字被歸為一類 二、使用python實現簡單的文字聚類,其中使用了tf-idf演算法,jieba分詞,把相似的文字聚合在
第六章(1.4)自然語言處理實戰——時間語義抽取
一、簡介 本工具是由復旦NLP中的時間分析功能修改而來,做了一些細節和功能的優化,經SpringBoot封裝成web工具。 泛指時間的支援,如:早上、晚上、中午、傍晚等。 時間未來傾向。 如:在週五輸入“週一早上開會”,則識別到下週一早上的時間;在下午
吳恩達《深度學習》第五門課(2)自然語言處理與詞嵌入
星級 技術 ima lac 個數 應該 ras 時有 根據 2.1詞匯表征 (1)使用one-hot方法表示詞匯有兩個主要的缺點,以10000個詞為例,每個單詞需要用10000維來表示,而且只有一個數是零,其他維度都是1,造成表示非常冗余,存儲量大;第二每個單詞表示的向量相
SQL第六章(儲存過程)
1、儲存過程的優點 ①允許模組化程式設計 ②執行速度更快 ③減少網路流通量 ④提高系統安全性 2、儲存過程的分類 ①系統儲存過程 ②使用者自定義儲存過程 3、常用的系統儲存過程 4、使用儲存過程 ①定義儲存過程分語法 cr
第五章(1.6)深度學習——常用的八種神經網路效能調優方案
一、神經網路效能調優主要方法 資料增廣 影象預處理 網路初始化 訓練過程中的技巧 啟用函式的選擇 不同正則化方法 來自於資料的洞察 整合多個深度網路 1. 資料增廣 在不改變影象類別的情況下,增加資料量,能提高模型的泛化能力。 自然影象的資料增廣方式
JAVAOOP—第六章(集合框架)學習筆記
1.什麼是集合框架?集合框架是為表示和操作而規定的一種統一的標準體系結構,它包含大塊內容:對外的介面、介面的實現和對集合運算的演算法。它們都位於java.util包中。(1)介面:表示集合的抽象資料型別,在上面的圖中以虛線表示,如Collection、List、Set、Map
微信支付各種坑--終章(-1&-2)
001.微信支付一路坑,走過一坑又一坑,總之,微信支付太過於坑爹,詳細大家也或多或少遇到過,一路艱辛終於完美繼承微信支付,下面進入填坑之路!!! 002.一些微信平臺的
第一章(1.2)機器學習概念圖譜
一、機器學習概念圖譜 二、什麼是機器學習 機器學習(machine learning)是最近非常火的一個領域,關於其一些基本定義百度百科、維基百科或者網上隨便都可以找到很多資料,所以這裡不做過多解釋。 我們解決一個問題有兩種模式: 一種叫做模型驅動
演算法導論第六章(堆排序)
維護堆的性質(MAX-HEAPIFY): 每一步從A[i],A[LEFT(i)],A[RIGHT(i)]中選出最大的。如果A[i]是最大的,程式結束。如果不是,則A[i]和最大的那一個交換。以原來最大的節點為根的字數又可能違反最大堆的性質,因此,對該子樹遞迴呼叫MAX-HE
第五章(1.4)深度學習——神經網路架構和原理
一、為什麼需要機器學習 有些任務直接編碼較為複雜,我們不能處理所有的細微之處和簡單編碼,因此,機器學習很有必要。相反,我們向機器學習演算法提供大量資料,讓演算法不斷探索資料並構建模型來解決問題。比如:在新的雜亂照明場景內,從新的角度識別三維物體;編寫一個計算信
第三章(1.4)linux下部署tensorflow環境
一、在安裝好 anaconda後,即可通過anaconda安裝tensorflow anaconda安裝請參考:http://blog.csdn.net/lzc4869/article/detail
第五章(1.5)深度學習——卷積神經網路簡介
卷積神經網路(Convolutional Neural Network, CNN)是一種前饋神經網路, 在計算機視覺等領域被廣泛應用. 本文將簡單介紹其原理並分析Tensorflow官方提供的示例. 一、工作原理 卷積是影象處理中一種基本方法. 卷積核是一個
UNP學習第六章(二)
默認 clas 套接字 post 討論 默認值 第六章 數據 當前 一、描述符就緒條件 對於引起select返回套接字“就緒”的條件我們必須討論得更明確: (1)滿足一下塞個條件中的仍和一個時,一個套接字準備好讀。 a)該套接字接收緩沖區中的數據字節數不大於等於套接字接收緩
第四章(1) 流Stream介紹
1.使用流的好處 流是Java API的新成員,它允許你以宣告性方式處理資料集合(通過查詢語句來表達,而不是臨時編寫一個實現,例如你要在集合中篩選一個紅色的蘋果,你可以用類似於sql式的查詢結構來說明你要幹什麼就可以了,而無需想著如何的去實現它,比如使用for迴圈+if判
第三章(1) Lambda表示式
1.lambda表示式的基本形式 在上一章中,你瞭解了利用行為引數化來傳遞程式碼有助於應對不斷變化的需求。它允許你定義一個程式碼塊來表示一個行為,然後傳遞它。你可以決定在某一事件發生時(例如單擊一個按鈕)或在演算法中的某個特定時刻(例
安卓學習(初)第三章(1)(《第一行程式碼》)
佈局控制元件 一、TextView 1、<TextView>可以說是Android中最簡單的一個控制元件,主要用於在介面上顯示一段文字資訊。 2、指定控制元件的寬度和高度 android:layout_width="match_parent" android:layout
PMBOK(第六版) PMP筆記——《六》第六章(專案進度管理)
專案進度管理 專案進度管理包括為管理專案按時完成所需的各個過程。 專案進度計劃(Schedule)說明了專案如何以及何時交付專案範圍中定義的產品、服務 和成果。 建立 WBS 最底層得到的是工作包,但是為了更好的估算活動持續時間和活動成本。把 最底層的工作包繼續分解,就得到活動。活
C++primer 習題第四章(1)
4.7編寫程式碼實現一個數組賦值給另外一個數組,然後將這段程式碼改用vector實現。考慮如何將一個vector 賦值給另一個vector。 int main() { int a[3] = { 1,2,3 }; int b[3]; cout << "array :" <&l
第六章(隨機梯度下降)
測試資料1: 5,1 1 7,2 1 9,3 2 11,4 1 19,5 3 18,6 2 測試程式碼1: import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.regression