word2vecトレーニング例にgensim使用 - 文字の関係における三国の分析を

免責事項:著者は限られている、ブログ必然的に欠陥がたくさんあっても、重大なミス、私はあなたが修正したいと考えています。最大の目標を書くことは、学習関心と広がりを払っていない交換することもありますが。行く、とあなたがお互いを奨励するための長い道のり。https://blog.csdn.net/yexiaohhjk/article/details/85086503

序文

すべてJieke埋め込み

ピットcs224Nおよび関連書類の中に第二週見た後。短周期コンテキスト(エンティティ)セマンティック言語学習とベクトル空間に埋め込まれた、ことを非常に興味深く、そして、2つの単語が(エンティティ)相関判定さWord2vec。私は大きなホイールが良いgensimを作った気づいた、なぜいくつかのないシンプルで面白い実験を、さらに綿密な調査。

私は勧告を行うword2Vecで、クレソンのユーザ履歴を登りたかったが、最近はテスト期間、ネットブラシ準備クラス事項を入力していました。まず、彼は別のバーを取得する時間後、伏線を埋め、スキルは体以上です。だから、「三国志」の最初の使用は、コーパスとして、学び、どのような興味深い結論を見ることができます埋め込む、あなたの手のgensimを練習します。

レディコーパス

要求beautifoup分析ツールを使用して起動し、ウェブサイト私の小学校では、下歴史小説「三国志」(レビュー・爬虫類のスキルを)大好きです。シンプルなテキストの撤廃や句読点の使用jieba小説は古典近似であるので、効果は言葉の良好な分離はありませんが、ポイントに良い言葉を。

def crawl(url = None):
    """
     从http://www.purepen.com/sgyy/爬下《三国演义》到本地txt文件
    :param url:
    :return:
    """
    print('Waitting for crawling sentence!')
    url  = 'http://www.purepen.com/sgyy/'
    contents = ''
    for num in range(1,121):
        num_str = str(num)
        if len(num_str) == 1 : num_str = '00'+ num_str
        if len(num_str) == 2 : num_str = '0'+ num_str
        urls = url + num_str + '.htm'
        html = requests.get(urls)
        html.encoding = html.apparent_encoding # 保证中文编码方式的正确
        soup =  BeautifulSoup(html.text,'lxml')
        title  = soup.find(align = 'center').text
        contents += title
        content = soup.find(face = '宋体').text
        contents += content

    with open('三国演义.txt','w') as f:
        f.write(contents)
        
def segment(document_path= '三国演义.txt'):
    """

    :param document_path:
    :return:
    """
    with open(document_path) as f:
        document = f.read()
        document = re.sub('[()::?“”《》,。!·、\d ]+', ' ', document)  # 去标点
        document_cut = jieba.cut(document)
        result = ' '.join(document_cut)
        with open('segement.txt', 'w') as f2:
            f2.write(result)
        print('Segement Endding')        

使用gensimでWord2vecトレーニングモデル

まず、非常に使いやすいですgensimインストール"pip install gensim"することができます。しかし、それはnumpyののgensimバージョンのための需要があるので、密かにインストールプロセスのあなたのnumpyのバージョンにアップグレードがあるかもしれないことを指摘しています。直接インストールまたはアップグレードnumpyののWindows版には問題があります。この時点で、我々はnumpyのをアンインストールする必要があり、再ダウンロードMKLは、numpyのの要件gensimバージョンに準拠しています。
 
パッケージgensim.models.word2vecで、word2vec関連APIでgensimで。そして、アルゴリズムパラメータは、読むことをお勧めしますクラスgensim.models.word2vec.Word2Vecに関連する公式ドキュメントを
注アルゴリズムのパラメータは次のとおりです。

  • 文:我々はコーパスを分析しなければならないことのリスト、またはファイルトラバーサルから読み取ることができます。私たちの次の例は、ファイルから読み込まれます。

  • サイズ:寸法語ベクトルは、デフォルト値は100です。コーパスは、テキストコーパス未満の100Mとして、小さい場合、この寸法値は、一般的に、私たちのコーパスのサイズに関連した、デフォルト値は、通常は大丈夫です。コーパスが大きい場合には、寸法が増加することをお勧めします。

  • ウィンドウ:最大距離ベクトル文脈で単語、Cのための私達のアルゴリズムの原則の章では、このパラメーター・マーカー
    、大きな窓、単語遠く及びいくつかはまた、単語のコンテキストを持っています。デフォルトは5です。実際の使用では、サイズは、動的に実際のニーズウィンドウに応じて調整することができます。それは小さなコーパスである場合、この値は小さく設定することができます。間の一般的なコーパス推奨値は[5,10]。

  • SG:すなわち、二つのモデルたちのword2vecを選択します。0の場合、それは、モデルがスキップ-グラムですCBOWモデルである、すなわち0がデフォルトCBOWモデルです。

  • HS:それが0である場合、すなわち2はword2vecソリューションの私たちの選択は、それが負のサンプリングで、かつ負である場合、サンプルの負の数が0より大きい場合、それは階層的なソフトマックスです。デフォルトは0、つまり負のサンプリングです。

  • 陰性:すなわち負のサンプリング数、デフォルト5を用いて、陰性サンプル。[3,10]の間にお薦め。このパラメータは、当社のアルゴリズムでは、原則章のNEGとしてマークされています。

  • cbow_mean:投影を行う場合にのみCBOW、次にアルゴリズムXWは、0である
    用語ベクトルコンテキストの平均と比較して、ベクトル和ワードとコンテキストです。原則的に私たちの記事では、平均的な用語に基づいてベクトルを説明します。個人的に平均XWを表すために使用したい、1のデフォルト値は、デフォルト値を変更することは推奨されません。

  • min_count:最小単語単語ベクトルを計算する必要があります。この値は、珍しい言葉の非常に低い周波数の一部を削除することができ、デフォルトは5です。コーパスが小さい場合は、この値を下げることができます。

  • ITER:確率的勾配降下法の反復の最大数、デフォルト5。大規模コーパスでは、この値を増やすことができます。

  • アルファ:最初のステップで反復確率的勾配降下法。ηとしてマークされたアルゴリズムの原則の記事、デフォルトは0.025です。

  • min_alpha:反復アルゴリズムは漸減段階をサポートしているため、min_alphaはステップサイズの最小値を与えます。一緒にITER min_alpha由来する反復ステップが、アルファの各ラウンドにおける確率的勾配降下法、。これは、コアコンテンツに一部起因word2vecアルゴリズムされていないので、我々は、原則章では言及しなかったです。大規模コーパス、アルファの必要性、min_alpha、パラメータ調整とITERのために、適切な三つの値を選択します。
      
    良いコーパスによる前処理、トレーニングモデル:

 sentences = word2vec.LineSentence(sentence_path)
 model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3,size=100)

モデルを保存します。

# 保存模型,以便重用
model.save("test_01.model")
 #不能利用文本编辑器查看,但是保存了训练的全部信息,可以在读取后追加训练可以再次读取训练
model.wv.save_word2vec_format('test_01.model.txt',binary=False) 
# 将模型保存成文本格式,但是保存时丢失了词汇树等部分信息,不能追加训练

追加のトレーニング:

model = gensim.models.Word2Vec.load('/tmp/mymodel')
model.train(more_sentences)

負荷モデル:

model = gensim.models.Word2Vec.load('/tmp/mymodel')

モデルの使用 - 文字ベクトル解析との長期的な関係

  • ほとんどの単語の単語に関連付けられている場合:
    model.most_similar()

例:
私たちは、「三国志」に従って試験の良好なモデル訓練コーパスである我々は、ベクトル(単語ベクトルを)学習されているものの中にどのようなヒーローとの間の潜在的な相関関係を研究しています。

の最初のテスト白髪早期(好きな)周瑜
print('Nearest 周瑜:',model.most_similar('周瑜'))

私は結果に非常に満足して学びました:

Nearest 周瑜:
 [('孙策', 0.6876850128173828), ('孔明', 0.6875529289245605), ('司马懿', 0.6733481287956238), ('孟获', 0.6705329418182373), ('先主', 0.6662196516990662), ('鲁肃', 0.6605409383773804), ('孙权', 0.6458742022514343), ('孙夫人', 0.643887996673584), ('姜维', 0.6326993703842163), ('有人', 0.6321758031845093)]

相関が良い全角周瑜、二重壁江東いじめと同じで最初にランクされています孙策彼の歴史周瑜だけ小さな仲良く、交感神経は、琴は、トラブルの回数、称賛に値する行為で一緒に育っ置きます。同時に、有名な1組アロマの花に結婚し3人の姉妹は大乔,小乔、物語のために合格します!

第二は、即生瑜,何生亮諸葛孔明のサイズ:明。諸葛孔明を強調するために、「三国志」は偏狭な悪役に彼の狡猾な計画、狂った黒の周瑜を保ちました。一方ちび戦争、日と劉キャンプカウンセラーの代わりに二人の男は、ほとんどの将軍に貢献します。だから、二人の男の非常に密接な接触は避けられません。

第三に司马懿、ポスト知的、政治的顧問最高魏、最高司令官!

バック鲁肃、、 孙权吴老太と周瑜も文字間の最も親密な関係です。

他の結果も学びました:

Nearest 刘备:, [('东吴', 0.7638486623764038), ('袁绍', 0.6992679238319397), ('刘表', 0.6835019588470459), ('吴侯', 0.6756551265716553), ('司马懿', 0.6602287888526917), ('曹', 0.6518967747688293), ('曹操', 0.6457493305206299), ('刘玄德', 0.6447073817253113), ('蜀', 0.6380304098129272), ('诸葛亮', 0.6250388026237488)]
Nearest 曹操: [('袁绍', 0.6900763511657715), ('刘备', 0.6457493901252747), ('孙策', 0.6446478962898254), ('司马懿', 0.6381756067276001), ('吴侯', 0.6193397641181946), ('孙权', 0.6192417144775391), ('蜀', 0.6191484928131104), ('周瑜', 0.6183933019638062), ('东吴', 0.6114454865455627), ('马超', 0.5959264039993286)]
Nearest 孙策: [('姜维', 0.6926037073135376), ('周瑜', 0.687684953212738), ('邓艾', 0.687220573425293), ('孙坚', 0.6793218851089478), ('司马懿', 0.6556568741798401), ('钟会', 0.6528347730636597), ('郭淮', 0.6527595520019531), ('孔明自', 0.6470344066619873), ('曹操', 0.6446478962898254), ('王平', 0.6399298906326294)]
Nearest 貂蝉: [('卓', 0.7048295140266418), ('允', 0.6404716968536377), ('身', 0.6323765516281128), ('妾', 0.6265878677368164), ('瑜', 0.6257222890853882), ('吴', 0.6242125034332275), ('父', 0.6216113567352295), ('众官', 0.6189900636672974), ('后主', 0.6172502636909485), ('干', 0.6154900789260864)]
Nearest 诸葛亮: [('亮', 0.7160214185714722), ('贤弟', 0.7146532535552979), ('子敬', 0.6765022277832031), ('此人', 0.6603602766990662), ('表曰', 0.6592696905136108), ('既', 0.6532598733901978), ('奈何', 0.6503086090087891), ('大王', 0.6495622992515564), ('吾主', 0.6492528915405273), ('玄德问', 0.6449695825576782)]
  • 異なる種類の単語の選択セット
    :のような、print(model.wv.doesnt_match(u"周瑜 鲁肃 吕蒙 陆逊 诸葛亮".split()))

周瑜,鲁肃,吕蒙,陆逊賞は蘇州であり、最高司令官、のみを務め诸葛亮、大シュウ首相、結果が出力されます诸葛亮私たちはこの関係を学んだのベクトル。

同じこと:

print(model.wv.doesnt_match(u"曹操 刘备 孙权 关羽".split())) #关羽不是主公
print(model.wv.doesnt_match(u"关羽 张飞 赵云 黄忠 马超 典韦".split())) #典韦不是蜀国五虎将
print(model.wv.doesnt_match(u"诸葛亮 贾诩  张昭 马超".split()))#马超是唯一武将

もちろん、すべてではない関係が研究の結果はまた、量と質の私達のトレーニングコーパスの品質に依存し、学習することができます。「三国志」小説は1.8MBだった、詳細に関連する複数のエンティティ間の関係を学習することはできません。

完全なコード

#!/usr/bin/env python
# encoding: utf-8
'''
@author: MrYx
@github: https://github.com/MrYxJ
'''

import jieba
import jieba.analyse
from gensim.models import word2vec
import requests
from bs4 import BeautifulSoup
import re

def crawl(url = None):
    """
     从http://www.purepen.com/sgyy/爬下《三国演义》到本地txt文件
    :param url:
    :return:
    """
    print('Waitting for crawling sentence!')
    url  = 'http://www.purepen.com/sgyy/'
    contents = ''
    for num in range(1,121):
        num_str = str(num)
        if len(num_str) == 1 : num_str = '00'+ num_str
        if len(num_str) == 2 : num_str = '0'+ num_str
        urls = url + num_str + '.htm'
        html = requests.get(urls)
        html.encoding = html.apparent_encoding # 保证中文编码方式的正确
        soup =  BeautifulSoup(html.text,'lxml')
        title  = soup.find(align = 'center').text
        contents += title
        content = soup.find(face = '宋体').text
        contents += content

    with open('三国演义.txt','w') as f:
        f.write(contents)


def segment(document_path= '三国演义.txt'):
    """

    :param document_path:
    :return:
    """
    with open(document_path) as f:
        document = f.read()
        document = re.sub('[()::?“”《》,。!·、\d ]+', ' ', document)  # 去标点
        document_cut = jieba.cut(document) # 结巴分词
        result = ' '.join(document_cut)
        with open('segement.txt', 'w') as f2:
            f2.write(result)
        print('Segement Endding')


def train_model(sentence_path ,model_path):
    sentences = word2vec.LineSentence(sentence_path)
    model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3,size=100)
    print('Word2Vec Training Endding!')
    model.save(model_path)

def analyse_wordVector(model_path):
    model =  word2vec.Word2Vec.load(model_path)
    print('Nearest 周瑜:',model.most_similar('周瑜'))
    print('Nearest 刘备:,',model.most_similar(['刘备']))
    print('Nearest 曹操:',model.most_similar(['曹操']))
    print('Nearest 孙策:',model.most_similar(['孙策']))
    print('Nearest 貂蝉:',model.most_similar(['貂蝉']))
    print('Nearest 诸葛亮:', model.most_similar(['诸葛亮']))
    print(model.wv.doesnt_match(u"周瑜 鲁肃 吕蒙 陆逊 诸葛亮".split()))
    print(model.wv.doesnt_match(u"曹操 刘备 孙权 关羽".split()))
    print(model.wv.doesnt_match(u"关羽 张飞 赵云 黄忠 马超 典韦".split()))
    print(model.wv.doesnt_match(u"诸葛亮 贾诩  张昭 马超".split()))
    print(model.wv.similarity('周瑜','孙策'))
    print(model.wv.similarity('周瑜','小乔'))
    print(model.wv.similarity('吕布', '貂蝉'))


if __name__ == '__main__':
    crawl()
    segment()
    train_model('segement.txt','model1')
    analyse_wordVector('model1')

おすすめ

転載: blog.csdn.net/yexiaohhjk/article/details/85086503