mirror of
https://github.com/Zippland/Bubbles.git
synced 2026-01-19 01:21:15 +08:00
90 lines
2.6 KiB
Python
90 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
|
import random
|
|
import logging
|
|
|
|
import pandas as pd
|
|
|
|
# 获取模块级 logger
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class Chengyu(object):
|
|
def __init__(self) -> None:
|
|
root = os.path.dirname(os.path.abspath(__file__))
|
|
self.df = pd.read_csv(f"{root}/chengyu.csv", delimiter="\t")
|
|
self.cys, self.zis, self.yins = self._build_data()
|
|
|
|
def _build_data(self):
|
|
df = self.df.copy()
|
|
df["shouzi"] = df["chengyu"].apply(lambda x: x[0])
|
|
df["mozi"] = df["chengyu"].apply(lambda x: x[-1])
|
|
|
|
df["shouyin"] = df["pingyin"].apply(lambda x: x.split(" ")[0])
|
|
df["moyin"] = df["pingyin"].apply(lambda x: x.split(" ")[-1])
|
|
|
|
cys = dict(zip(df["chengyu"], df["moyin"]))
|
|
zis = df.groupby("shouzi").agg({"chengyu": set})["chengyu"].to_dict()
|
|
yins = df.groupby("shouyin").agg({"chengyu": set})["chengyu"].to_dict()
|
|
|
|
return cys, zis, yins
|
|
|
|
def isChengyu(self, cy: str) -> bool:
|
|
return self.cys.get(cy, None) is not None
|
|
|
|
def getNext(self, cy: str, tongyin: bool = True) -> str:
|
|
"""获取下一个成语
|
|
cy: 当前成语
|
|
tongyin: 是否允许同音字
|
|
"""
|
|
zi = cy[-1]
|
|
ansers = list(self.zis.get(zi, {}))
|
|
try:
|
|
ansers.remove(cy) # 移除当前成语
|
|
except Exception as e:
|
|
pass # Just ignore...
|
|
|
|
if ansers:
|
|
return random.choice(ansers)
|
|
|
|
# 如果找不到同字,允许同音
|
|
if tongyin:
|
|
yin = self.cys.get(cy)
|
|
ansers = list(self.yins.get(yin, {}))
|
|
|
|
try:
|
|
ansers.remove(cy) # 移除当前成语
|
|
except Exception as e:
|
|
pass # Just ignore...
|
|
|
|
if ansers:
|
|
return random.choice(ansers)
|
|
|
|
return None
|
|
|
|
def getMeaning(self, cy: str) -> str:
|
|
ress = self.df[self.df["chengyu"] == cy].to_dict(orient="records")
|
|
if ress:
|
|
res = ress[0]
|
|
rsp = res["chengyu"] + "\n" + res["pingyin"] + "\n" + res["jieshi"]
|
|
if res["chuchu"] and res["chuchu"] != "无":
|
|
rsp += "\n出处:" + res["chuchu"]
|
|
if res["lizi"] and res["lizi"] != "无":
|
|
rsp += "\n例子:" + res["lizi"]
|
|
return rsp
|
|
return None
|
|
|
|
|
|
cy = Chengyu()
|
|
|
|
if __name__ == "__main__":
|
|
# 设置测试用的日志配置
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(levelname)s - %(name)s - %(message)s'
|
|
)
|
|
|
|
answer = cy.getNext("便宜行事")
|
|
logger.info(answer)
|