形態素解析 janome でテキストファイルから熟語の取り出し
日本語形態素解析用モジュールjanome
を使って、テキストから漢字のみの名詞を取り出します。
ふと「クロスワードパズルの自動生成が出来ないかな」と思い、とりあえずテキストデータから熟語を拾い出すものを作ってみた。
モジュールにjanome
とregex
を使用しているのでインストールが必要です。
ターミナルから2つ同時にインストール
モジュールの使い方
詳しくはこの辺を参考に
< janomeの使い方 >
< reやregexの使い方 >
作業環境
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のセルをマスにして一文字ずつ当てはめ、熟語を枠内に配置させようと考えています。
知恵がいりそうです。
以上。