見出し画像

SQLiteに格納された日本語のノート本文(文章)を、PythonとJanomeで形態素解析し、有効な名詞のみを抽出して、単語の出現回数をカウント・集計する

Ubuntu上のNextcloud側のノートをSQLiteに入れて、ローカル軽量LLMに分析させる全段階として、頻出語を調べさせてみました。

こと: 421
社会: 291
構造: 204
よう: 196
問題: 164
歴史: 164
技術: 146
分析: 140
情報: 137
時代:136
人間: 129
現代: ……

出力例


# Janomeの形態素解析器をインポート
from janome.tokenizer import Tokenizer

# 単語の出現回数をカウントするためにCounterをインポート
from collections import Counter

# SQLiteデータベースに接続するためのモジュール
import sqlite3

# SQLiteのノートデータベースのパス(適宜変更)
db_path = "パス"

# データベースに接続
conn = sqlite3.connect(db_path)
cur = conn.cursor()

# テーブルからxx列をすべて取得
cur.execute("")

# 取得した行をリストとして格納
rows = cur.fetchall()

# データベース接続を閉じる
conn.close()

# Janomeのトークナイザを初期化
tokenizer = Tokenizer()

# 単語の頻度を記録するカウンターを初期化
counter = Counter()

# 単語が有効かどうかを判定する関数(ノイズ除去のため)
def is_valid_token(token):
    # 名詞以外は除外
    if not token.part_of_speech.startswith("名詞"):
        return False
    surface = token.surface
    # 1文字以下は除外
    if len(surface) <= 1:
        return False
    # 英数字(ASCII)は除外
    if surface.isascii():
        return False
    # 特殊記号や数字が含まれていたら除外
    if any(c in surface for c in ".。、・:;()()[]{}<><>@!\"'#%&=~^|\\`+$*?/_-0123456789"):
        return False
    return True

# 全てのノート本文について処理
for (text,) in rows:
    # トークン化(形態素解析)
    tokens = tokenizer.tokenize(text)
    # 有効な単語だけを抽出
    words = [token.surface for token in tokens if is_valid_token(token)]
    # 単語頻度を更新
    counter.update(words)

# 出現頻度の高い上位30語を表示
for word, count in counter.most_common(30):
    print(f"{word}: {count}")


もう少し探求してみます。


いいなと思ったら応援しよう!

三澤直己 | カラストラガラ / Trgr | フォロバ100% ここまでお読み下さり感謝。各種SNSでのシェアも励みになります。非営利の取り組みが多いため、チップのご検討、助かります。