jieba分詞の例

11106 ワード

jiebaコミュニティは活発で、分詞という機能だけでなく、オープンソースのフレームワークであり、キーワード抽出、語性表示など、多くの分詞上のアルゴリズムを提供しています.
jieba分詞は規則と統計に基づく混合分詞法である.未登録語については,jiebaは漢字成語に基づくHMMモデルを用い,viterbiアルゴリズムを用いて推定した.
一、jiebaが使用するアルゴリズム:
jiebaはdict.txtという辞書を持っていて、中には2万以上の語があり、語条の出現回数(この回数は作者自身が人民日報の語料などの資源に基づいて訓練したもの)と語性が含まれている.この第1条のtrieツリー構造の語図スキャンは、この2万余りの語を1つのtrieツリーに置くことを意味し、trieツリーは有名な接頭辞ツリーであり、つまり1つの語の前のいくつかの字と同じように、同じ接頭辞を持っていることを示し、trieツリーを使用して記憶することができ、検索速度が速いという利点がある.
1、Trieツリー構造に基づいて効率的な語図スキャンを実現し、文中の漢字のすべての成語可能な状況からなる有向無環図(DAG)を生成する
1.1 dict.txtに基づいてtrieツリーを生成します.辞書はtrieツリーを生成すると同時に、各語の出現回数を周波数に変換する.
1.2分詞文に対し、dict.txtによって生成されたtrieツリーに基づいてDAGを生成する.
2、動的計画を採用して最大確率の経路を探して、語周波数に基づく最大の切り分けの組み合わせを探し出す
3、未登録語については漢字成語能力に基づくHMMモデルを採用し、Viterbiアルゴリズムを使用した
3.1未登録語:辞書dict.txtに記録されていない語(注:dict.txtのすべての語彙をすべて削除しても、jiebaは依然として分詞することができ、出すぎない語は、大部分の長さが2.これがHMMに基づいて分詞を予測している)
二、分詞の全体思想:
入力は、ドキュメント全体または複数のオリジナルドキュメントです.アルゴリズム:jiebaインタフェースにより、正確なモード(デフォルト)、全モード、検索エンジンモードを用いて分詞することができ、そのjieba分詞の原理は規則と統計に基づく混合分詞であり、インタフェースであるため、しばらくその原理をあまり追究する必要はない.出力:対応するドキュメントの分詞の良い形式.この場合も高周波語の抽出を行うことができ,抽出方法をカスタマイズすることができる.カスタムの非アクティブワード辞書を使用してjiebaのインタフェースに基づいて高周波ワードの抽出を行うこともできます.
三、jiebaの三つの分詞方法:
  • 精確モード:文を最も精確に切開しようとし、テキスト分析
  • に適している.
  • 全モード:文の中のすべての成語可能な語をスキャンし、速度は非常に速いが、曖昧さを解決することはできない.
  • 検索エンジンモード:正確なモードに基づいて、長語を再び切り分け、リコール率を高め、検索エンジンの分詞に適している.
  • import jieba
    sent='                !'
    seg_list=jieba.cut(sent,cut_all=False)
    print('    :','/'.join(seg_list))
    seg_list=jieba.cut(sent)
    print('    :','/'.join(seg_list))
    seg_list=jieba.cut_for_search(sent)
    print('      :','/'.join(seg_list))
    seg_list=jieba.cut(sent,cut_all=True)
    print('   :','/'.join(seg_list))

    実行結果:
        :   /  / /    /    / /  /!
        :   /  / /    /    / /  /!
          :   /  / /  /  /  /    /  /  /    / /  /!
       :   /  / /  /    /  /  /  /    /  / /  //

    一般に正確なモードを使用すればよいが、一部のあいまいなマッチングシーンでは、フルモードまたは検索エンジンモードを使用するとより良い.
    四、jieba高周波語抽出
    単純に高周波語抽出は自然言語処理におけるTF戦略であるが,句読点や無効語の干渉がある.
    ここのデータは検索犬実験室のニュースデータで,高周波語の抽出を行う.
    #jieba    
    def get_content(path):
        with open(path, 'r', encoding='gbk', errors='ignore') as f:
            content = ''
            for l in f:
                l = l.strip() # strip():             ,           
                content += l
            return content
    
    def get_TF(words, topK=10):
    
        tf_dic = {}
        for w in words:
            tf_dic[w] = tf_dic.get(w, 0) + 1
        return sorted(tf_dic.items(), key = lambda x: x[1], reverse=True)[:topK]
    
    def stop_words(path):
        with open(path,encoding='utf-8', errors='ignore') as f:
            return [l.strip() for l in f]
    
    
    #  
    def main():
        import glob
        import random
        import jieba
        # glob                   
        files = glob.glob(r'C:/Users/LiLong/Desktop/learning-nlp-master/chapter-3/data/news/C000013/*.txt')
        print('files:',files[:2])
        #                   
        corpus = [get_content(x) for x in files[:5]]
        print(len(corpus))
        sample_inx = random.randint(0, len(corpus))
    
        split_words = [x for x in jieba.cut(corpus[sample_inx])]
        split_words2 = [x for x in jieba.cut(corpus[sample_inx]) \
                            if x not in stop_words('./stop_words.utf8')]
        print('      :'+'/ '.join(split_words))
        print('   topK(10) :'+str(get_TF(split_words)))
        print('        top(10) :'+str(get_TF(split_words2)))
    main()
    

    実行結果:
          :   /    / “/   /  /   / ,/    /  /   / ,/    /    / ”/ ,/   /   /    /   /   /    /   /  /   /   /   /    /   /   /   / ,/  /   /     /   /     /  /    /    /   / 。/  /   / ,/   /   /   /  /   /   / ,/    /   / “/   /   / ”/    /  /   /        /  /   /    /   /    /    /   /   / 。/   /    /  /   /   /    / ,/   /  /  /    /    /  /    / 。/   /  /   /   /   /   /   /   / ,/   /   /   /   /   /   /  /   /  /   /   / ,/   /   /  /   /   / “/   / —/   / —/   /   / —/   /   / —/   /   / ”/  /     /  / 。/    /   / ,/   /   /   /   /  /  /   /  /   /   /  /   /    / ,/   /   /  /   /   /  /  /   /   /    / 。/  /   /   /   /   / ,/   /   / 、/   /  /   /   /  /   /   /  /   /  /   /   /   /   /   / 。/  /   / ,/   /   /  /   / 、/   /  /   /  /   / ,/  /   /   /  /   /  / 。/   / ,/    /  /  / 00/  /   /  /     /    /    /   /  / “/    /   /   / ”/ ,/   /   /   /   /    /   /  /   / ,/   /   /   /    /   /   /     /   /   /   / ,/  /     /     /   /   /   /   / ,/  /  /   /    /   /   /   /   / 。/  / (/    / )/   /   / :/    / 、/  / 、/ 1946/  / 7/  /   /   /   / ,/     / 、/   / 、/    /   / ,/   /     /   / 、/   /   /   /   / 。/   /     /    /   / 、/       /     /    / 、/         /   /  /   / 、/    /   / ,/       /    /   /    /   / ,/       /       /    /   /   /   /   / 。/  /      /     /   /  /     / 、/      /   /     /   /     / 、/   /     /   /   /   /   /  /  /   /   /     / 、/   /   /   /   /     /    /     / 、/    /   /   /    / 、/   /   /   /    /  /   /    /   /   / 。/ (/   / :/       /   / )
       topK(10) :[(',', 23), ('、', 15), (' ', 11), ('。', 11), ('   ', 6), ('   ', 6), ('  ', 5), ('  ', 5), ('   ', 4), ('“', 4)]
            top(10) :[('   ', 6), ('   ', 6), ('  ', 5), ('  ', 5), ('   ', 4), ('  ', 4), ('    ', 4), ('   ', 3), ('    ', 3), ('  ', 3)]

    辞書を廃止した後に得られた高周波語の方が意味があることがわかる.
    実際、中国語の分詞器は分詞効果の差はそれほど大きくないが、特定の場面で表現の違いが大きいため、自分の分野辞書を定義することが重要であり、絶えず更新・維持・停止辞書を更新している.
    このうちjieba分詞はカスタム辞書をサポートしている:jieba.load_userdict('./data/user_dict.utf8')形式は以下の通りである:大波10 n分詞5 v金融辞書7 nの各行の3つの部分はそれぞれ:語、語周波数、語性である.この辞書ファイルはutf-8符号化が必要です.高周波語を抽出する際,適切なカスタム辞書のロードにより,良好な分詞効果を得ることができる.
    その中の頻度や品詞は省略できますが、品詞を省略するとjiebaで品詞表記をすると最終的な切り分け語の品詞が「x」になるので、辞書をカスタマイズする際には品詞や品詞が必要になります.
    参考:「pytho自然言語処理実戦コア技術とアルゴリズム」https://www.cnblogs.com/echo-cheng/p/7967221.html