File size: 5,668 Bytes
09c17cd | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | """
設定ファイル - パス設定専用(Tauriアプリ用)
"""
import os
import sys
from typing import Dict, Any
from path_manager import get_path_manager
class Config:
"""設定管理クラス(Tauriアプリ用)"""
# 実行環境の判定
@classmethod
def _get_base_path(cls) -> str:
"""ベースパスを取得(pyinstaller対応)"""
if getattr(sys, 'frozen', False):
# pyinstallerでビルドされた場合
return os.path.dirname(sys.executable)
else:
# 開発環境の場合
return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# MeCab設定(従来。必要なら使用)
MECAB_CONFIG_PATH = "/opt/homebrew/etc/mecabrc"
MECAB_DICT_PATH = "/opt/homebrew/lib/mecab/dic/ipadic"
# AIモデル設定(Tauriアプリ用)
# 環境変数で指定されていない場合は、ユーザーのDocumentsフォルダをデフォルトに
DEFAULT_MODEL_PATH = os.path.expanduser("~/Documents/models/llama-3.2-3b-instruct-q4_k_m.gguf")
# fugashi設定(MeCab/IPA 用)。Sudachi は SudachiPy を直接使用する。
# sudachidict_core のパスは参照のみ(情報表示やデバッグ用途)。
try:
import importlib.util
spec = importlib.util.find_spec("sudachidict_core")
if spec and spec.origin:
# origin は __init__.py のパス。辞書ディレクトリはその親
import os as _os
_pkg_dir = _os.path.dirname(spec.origin)
SUDACHI_DICT_PATH = _pkg_dir
else:
SUDACHI_DICT_PATH = ""
except Exception:
SUDACHI_DICT_PATH = ""
# fugashi は常に MeCab 設定を使用(IPA)。
FUGASHI_ARGS = f"-r {MECAB_CONFIG_PATH}"
@classmethod
def get_mecab_config_path(cls) -> str:
"""MeCab設定ファイルのパスを取得"""
return cls.MECAB_CONFIG_PATH
@classmethod
def get_mecab_dict_path(cls) -> str:
"""MeCab辞書のパスを取得"""
return cls.MECAB_DICT_PATH
@classmethod
def get_fugashi_args(cls) -> str:
"""fugashi用の引数を取得"""
return cls.FUGASHI_ARGS
@classmethod
def get_default_model_path(cls) -> str:
"""デフォルトのモデルパスを取得"""
return get_path_manager().get_model_path()
@classmethod
def get_package_path(cls) -> str:
"""パッケージパスを取得"""
return get_path_manager().get_package_path()
@classmethod
def validate_paths(cls) -> Dict[str, bool]:
"""パスの存在確認"""
return {
"mecab_config": os.path.exists(cls.MECAB_CONFIG_PATH),
"mecab_dict": os.path.exists(cls.MECAB_DICT_PATH),
"default_model": os.path.exists(cls.DEFAULT_MODEL_PATH)
}
@classmethod
def print_status(cls):
"""設定状況を表示"""
print("=== 設定状況 ===")
print(f"MeCab設定ファイル: {cls.MECAB_CONFIG_PATH}")
print(f"MeCab辞書: {cls.MECAB_DICT_PATH}")
print(f"デフォルトモデル: {cls.DEFAULT_MODEL_PATH}")
print(f"fugashi引数: {cls.FUGASHI_ARGS}")
print(f"Sudachi辞書パス検出: {getattr(cls, 'SUDACHI_DICT_PATH', '')}")
print("\n=== パス存在確認 ===")
status = cls.validate_paths()
for name, exists in status.items():
status_text = "✓" if exists else "✗"
print(f"{name}: {status_text}")
# 環境変数での上書き対応
def load_config_from_env():
"""環境変数から設定を読み込み"""
Config.MECAB_CONFIG_PATH = os.getenv("MECAB_CONFIG_PATH", Config.MECAB_CONFIG_PATH)
Config.MECAB_DICT_PATH = os.getenv("MECAB_DICT_PATH", Config.MECAB_DICT_PATH)
Config.DEFAULT_MODEL_PATH = os.getenv("DEFAULT_MODEL_PATH", Config.DEFAULT_MODEL_PATH)
# 環境変数 SUDACHI_DICT_PATH があれば記録のみ(SudachiPy が使用)。
sudachi_env = os.getenv("SUDACHI_DICT_PATH", getattr(Config, "SUDACHI_DICT_PATH", ""))
if sudachi_env:
Config.SUDACHI_DICT_PATH = sudachi_env
# fugashiは常にMeCab設定
Config.FUGASHI_ARGS = f"-r {Config.MECAB_CONFIG_PATH}"
# 環境変数から設定を読み込み
load_config_from_env()
# テスト関数
def test_config():
"""設定のテスト"""
print("=== Configテスト ===")
# 設定状況を表示
Config.print_status()
# fugashiテスト
try:
import fugashi
print(f"\n=== fugashiテスト ===")
tagger = fugashi.GenericTagger(Config.get_fugashi_args())
test_text = "こんにちは世界"
tokens = tagger(test_text)
print(f"テストテキスト: '{test_text}'")
print(f"形態素: {[token.surface for token in tokens]}")
print("✓ fugashi動作確認完了")
except Exception as e:
print(f"✗ fugashiテスト失敗: {e}")
# AIクラステスト
try:
from ai import AI
print(f"\n=== AIクラステスト ===")
if os.path.exists(Config.get_default_model_path()):
ai = AI(Config.get_default_model_path())
tokens = ai.get_token_probabilities("こんにちは", k=3)
print(f"テスト結果: {tokens}")
print("✓ AIクラス動作確認完了")
else:
print("✗ デフォルトモデルが見つかりません")
except Exception as e:
print(f"✗ AIクラステスト失敗: {e}")
if __name__ == "__main__":
test_config()
|