よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

形態素解析 janome でテキストファイルから熟語の取り出し

日本語形態素解析用モジュールjanomeを使って、テキストから漢字のみの名詞を取り出します。

ふと「クロスワードパズルの自動生成が出来ないかな」と思い、とりあえずテキストデータから熟語を拾い出すものを作ってみた。

モジュールにjanomeregexを使用しているのでインストールが必要です。

ターミナルから2つ同時にインストール

$ pip install janome regex

モジュールの使い方
詳しくはこの辺を参考に

< janomeの使い方 >

Python, Janomeで日本語の形態素解析、分かち書き(単語分割) | note.nkmk.me


< reやregexの使い方 >

Pythonの正規表現で漢字・ひらがな・カタカナ・英数字を判定・抽出・カウント | note.nkmk.me


作業環境

  • Androidスマホ
  • Pydroid3(実行用)
    • JupyterNotebook
  • Qpython(エディタのみ)
    • QPyNotebook


Qpythonではregexのインストールが出来ませんでした。 ( janomeは動きます )


読み取るテキストファイルの準備

熟語を拾い出す材料源としてテキストファイルを準備します。
別に何のテキストファイルでも構いませんが、私は次のようにしました。

任意のWebページを全て選択でコピーし、エディタに貼るなどしてtextファイルを作成し、Pythonスクリプトと同じフォルダに保存しておきます。

ここではtext_for_janome.txtというファイル名で保存しています。

テキストファイルから名詞をリストで取り出す

from janome.tokenizer import Tokenizer
import regex

# テキストファイルの読み取り
f = open("text_for_janome.txt","r")
text = f.read()

t = Tokenizer()

# janomeの形態素解析から抜き出す名詞リスト
meishi_lst = []

for token in t.tokenize(text):

    # 品詞が名詞なら
    if "名詞" in token.part_of_speech:
        # 表層形(語句)を出力
        meishi = token.surface
        
        # 名詞リストに追加
        meishi_lst.append(meishi)

# テキストファイルを閉じる
f.close()



パターンにマッチする名詞をリストで重複なしに取り出す

# マッチしたデータのリスト
match_lst = []

# 名詞リストから一つずつ取り出し
for word in meishi_lst:
    
    # regexで漢字を吸出すパターン設定
    pattern = regex.compile(r'\p{Script=Han}+')
    
    # 語句が全てパターンにマッチするか
    match_word = pattern.fullmatch(word) 
    
    # 2文字以上の漢字熟語なら
    if match_word != None and match_word.end() > 1:
        
        # マッチのリストに追加
        match_lst.append(match_word.group())
    
# 重複を削除したマッチのリストを出力    
print(list(set(match_lst)))
    
['人類', '文化', '霊長', '機会', '副葬品', '器官', '野外', '溺死', '言葉', '観察', '三角', '連想', '成熟', '想像', '躍進', '複数', '世界', '論文', '場合', '上下', '左右', '発声', '習得', '成長', '必須', '手話', '以上', '関係', '理解', '無理', '対象', '心地', '機能', '主要', '区別', '外部', '進歩', '性差', '知覚', '議論', '直面', '最低限', '道具', '独自', '外側', '期間', '仲間', '時制', '不安', '建設', '発想', '動詞', '特異', '最初', '会話', '死亡', '栄養', '人間', '自然', '時代', '未熟', '洗練', '幼児', '現在', '再帰', '宗教', '支配', '英語', '本質', '実在', '歴史', '青色', '貢献', '増加', '部族', '狩猟', '開発', '双子', '比較', '飛躍', '出来事', '博士', '構造', '視点', '行動', '関数', '皮質', '考古学', '根拠', '人々', '時期', '目的', '以前', '勉強', '神経', '思考', '発表', '緑色', '特徴', '住居', '動物', '療法', '結果', '年代', '簡単', '専門', '予測', '年月', '素質', '獲得', '文章', '複雑', '特定', '相対', '場所', '空白', '困惑', '形成', '日本', '不運', '誕生', '少女', '聴覚', '創造', '前例', '取材', '意味', '発生', '損傷', '社会', '発明', '仮説', '障害', '遅延', '友達', '年少', '概念', '民族', '完全', '洞窟', '能力', '兄弟', '前野', '補聴器', '可能', '居住', '祖先', '並置', '加速', '指数', '準備', '記憶', '彷彿', '家庭', '要因', '時間', '埋葬', '産物', '統合', '脳神経', '溺愛', '徹底', '伝達', '全体', '研究', '年間', '障壁', '重要', '具体', '文法', '言語', '大学', '役割', '取得', '色彩', '開花', '採集', '生存', '後悔', '世代', '生涯', '科学', '歳児', '伝説', '主語', '基盤', '顔色', '未満', '母親', '対照', '架空', '技術', '同様', '空間', '永遠', '単語', '数理', '死因', '遺伝', '計画', '具合', '劇的', '発達', '長年', '有力', '物事', '移動', '途上', '試作', '現代', '未来', '全員', '一方', '前頭', '証明', '人口', '急激', '施設', '地球', '語彙', '壁画', '不可能', '危険', '実験', '進化', '合成', '大人', '過去', '大型', '要素', '知恵', '必要', '子孫', '拡散', '表現', '使用', '指示', '発見', '柔軟', '前置詞', '突然変異', '迅速', '利点', '学者', '冒険', '有害', '共通', '非常', '前後', '音声', '説明']


意外と簡単に拾い出せた。

クロスワードパズルなら解くために熟語の意味が要るので、辞典からdict形式で取り出すといった方法がいいかも。

パズルの問題作成は未だ何も手を着けていないが、自動でExcelのセルをマスにして一文字ずつ当てはめ、熟語を枠内に配置させようと考えています。

知恵がいりそうです。

以上。