# 2. データベースの自動解析(パース処理)
for line in database_text.strip().split("\n"):
if not line:
continue
# ID、単語名、定義文を正規表現で切り分ける
match = re.match(r"\d+@([mdk]\d+)([^:]+):(.*)", line)
if match:
word_id, word_name, definition = match.groups()
# 意味カテゴリ(属性)の自動判定
category = "その他"
if "ひと" in definition or "じぶん" in definition:
category = "ひと"
elif "どうぶつ" in definition or "いきもの" in definition:
category = "いきもの"
elif "もの" in definition or "たべもの" in definition or "のみもの" in definition:
category = "もの"
elif "ばしょ" in definition or "いえ" in definition or "へや" in definition:
category = "ばしょ"
# 位置・空間を表す名詞(なか、そと、うえ、した など)の場合
position_words = ["m58", "m59", "m132", "m133", "m27", "m28", "m29", "m30", "m71", "m72"]
if target_noun["id"] in position_words:
# 前には「ばしょ」属性の言葉をくっつける(例:いえ の なか)
places = [m for m in all_nouns_list if m["category"] == "ばしょ"]
prefix = random.choice(places) if places else random.choice(all_nouns_list)
return f"{prefix['name']}({prefix['id']}) の {target_noun['name']}({target_noun['id']})"
# 所有物になり得る名詞(ものカテゴリ、または体の一部など)の場合
body_and_objects = ["もの"] or target_noun["id"] in [f"m{i}" for i in range(126, 215)]
if target_noun["category"] == "もの" or body_and_objects:
# 前には「ひと」属性の言葉をくっつける(例:ぼく の おもちゃ、おねえさん の あし)
humans = [m for m in all_nouns_list if m["category"] == "ひと"]
prefix = random.choice(humans) if humans else random.choice(all_nouns_list)
return f"{prefix['name']}({prefix['id']}) の {target_noun['name']}({target_noun['id']})"
# カテゴリごとに名詞の抽選プールを作成
human_or_creature = [m for m in nouns.values() if m["category"] in ["ひと", "いきもの"]]
objects = [m for m in nouns.values() if m["category"] in ["もの", "その他"]]
places = [m for m in nouns.values() if m["category"] == "ばしょ"]
all_nouns_list = list(nouns.values())
# 2. データベースの自動解析(パース処理)
for line in database_text.strip().split("\n"):
if not line:
continue
match = re.match(r"\d+@([mdk]\d+)([^:]+):(.*)", line)
if match:
word_id, word_name, definition = match.groups()
# 意味カテゴリ(属性)の自動判定
category = "その他"
if "ひと" in definition or "じぶん" in definition:
category = "ひと"
elif "どうぶつ" in definition or "いきもの" in definition:
category = "いきもの"
elif "たべもの" in definition or "ごはん" in definition:
category = "たべもの"
elif "のみもの" in definition or "みず" in definition:
category = "のみもの"
elif "もの" in definition:
category = "もの"
elif "ばしょ" in definition or "いえ" in definition or "へや" in definition:
category = "ばしょ"
# 【改善点� 曄屬い帖Δ匹魁Δ覆法Δ世譟廚覆匹竜震篁譴砲蓮屬痢廚鬚�っつけない
if target_noun["id"] in ["m73", "m74", "m75", "m76", "m77", "m78", "m79", "m80"]:
return f"{target_noun['name']}({target_noun['id']})"
# 位置・空間を表す名詞の場合
position_words = ["m58", "m59", "m132", "m133", "m27", "m28", "m29", "m30", "m71", "m72"]
if target_noun["id"] in position_words:
places = [m for m in all_nouns_list if m["category"] == "ばしょ"]
prefix = random.choice(places) if places else random.choice(all_nouns_list)
return f"{prefix['name']}({prefix['id']}) の {target_noun['name']}({target_noun['id']})"
# 所有物になり得る名詞(もの、たべもの、のみもの、または体の一部など)の場合
body_and_objects = target_noun["category"] in ["もの", "たべもの", "のみもの"] or target_noun["id"] in [f"m{i}" for i in range(126, 215)]
if body_and_objects:
humans = [m for m in all_nouns_list if m["category"] == "ひと"]
prefix = random.choice(humans) if humans else random.choice(all_nouns_list)
return f"{prefix['name']}({prefix['id']}) の {target_noun['name']}({target_noun['id']})"
if v_id == "d2": # たべる -> 定義に「たべもの」が入っている名詞
compatible_list = [n for n in noun_pool if n["category"] == "たべもの" or "たべもの" in n["definition"]]
elif v_id == "d3": # のむ -> 定義に「のみもの」が入っている名詞
compatible_list = [n for n in noun_pool if n["category"] == "のみもの" or "のみもの" in n["definition"]]
elif v_id in ["d4", "d13", "d34", "d36", "d37", "d56", "d72"]: # みる, さわる, かく, かう, うる, つくる など
# 定義に「もの」または「かたち」が入っている名詞
compatible_list = [n for n in noun_pool if n["category"] == "もの" or "もの" in n["definition"] or "かたち" in n["definition"]]
elif v_id == "d35": # よむ -> 定義に「ことば」や「ほん」が入っている名詞
compatible_list = [n for n in noun_pool if "ことば" in n["definition"] or "ほん" in n["definition"] or n["id"] in ["m105", "m106"]]
# もし相性の良い名詞が見つかればそれを返し、なければ普通のプールから選ぶ
if compatible_list:
return random.choice(compatible_list)
else:
return random.choice(fallback_pool)
# 抽選プールの作成(【改善点� 曄屐舛髻廚筺屐舛�」のスロットから疑問詞をあらかじめ除外)
interrogatives = ["m73", "m74", "m75", "m76", "m77", "m78", "m79", "m80"]
clean_nouns = [v for v in nouns.values() if v["id"] not in interrogatives]
human_or_creature = [m for m in clean_nouns if m["category"] in ["ひと", "いきもの"]]
objects = [m for m in clean_nouns if m["category"] in ["もの", "たべもの", "のみもの", "その他"]]
places = [m for m in clean_nouns if m["category"] == "ばしょ"]
all_nouns_list = list(clean_nouns)
if pattern == "V1":
# 【第1文型】:M1 は K。
m1 = expand_noun_with_no(random.choice(all_nouns_list), all_nouns_list)
k = random.choice(list(adjectives.values()))
return f"【第1文型】 {m1} は {k['name']}({k['id']})。"
elif pattern == "V2":
# 【第2文型】:M1 が D。(自動詞)
v = random.choice([v for v in verbs.values() if v["tag"] == "V2"])
m1_raw = random.choice(human_or_creature) if random.random() > 0.2 else random.choice(all_nouns_list)
m1 = expand_noun_with_no(m1_raw, all_nouns_list)
return f"【第2文型】 {m1} が {v['name']}({v['id']})。"
elif pattern == "V3":
# 【第3文型】:M1 が M2 を D。(他動詞)
v = random.choice([v for v in verbs.values() if v["tag"] == "V3"])
m1 = expand_noun_with_no(random.choice(human_or_creature), all_nouns_list)