1. 程式人生 > >第六章(1.2)自然語言處理實戰——打造屬於自己的中文word2vector工具

第六章(1.2)自然語言處理實戰——打造屬於自己的中文word2vector工具

一、環境

二、實戰演練

  • 訓練語料source.txt
912日隨著頒獎典禮的結束,我院獲得了商委系統運動會系列活動之一——足球比賽的季軍,本次比賽立時十天,十二隻球隊分成兩個小組比賽。我院代表隊以小組第二名的成績出現,在和另一小組第二名石油公司爭奪三四名的比賽中,教師們超水平發揮,以五比一的比分大勝對手,獲得第三名的優異成績..
本次比賽由商委主辦,我院協辦,在我院漂亮的足球場地舉行。我院代表隊領隊孫增春、教練員張鵬,十八名隊員都是由學院各部門的老師組成,。並且是在不耽誤工作的情況下參加比賽的,商管系的張援越老師已經是年過四十的副教授,在場上依然是生龍活虎,不缺席每一場比賽,為球隊的勝利作出了很大的貢獻;體育部的樑浩老師, ,這次比賽擔任球隊的隊長,每場比賽都衝鋒在前,起到了表率作用;招辦的的張國權老師一直是帶傷比賽為球隊立下戰功。體育部的孫增春主任每常比賽親臨現場,給隊員打氣助威,為隊員們增加了信心.
學院領導對比賽非常重視,王院長几次到場為隊員們加油助威,許韻苓院助、許豔紅主任也給予了大力的支援,一切為了比賽開綠燈,為隊員們解決了很多後顧之憂。足球比賽第三名的成績,使我院在商務系統運動會總成績的排名又向前提升了一塊,同時也充分展示了學院在體育工作方面的優良成績。
體育教學部
  • 需要運用到的包
#!/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.4linux下部署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