彼方の岸へ
状态
文章总数
70篇 总字数
11.7万 运营时长
2年10个月分类
标签
AI Arch BF CLI CSS Fuwari Giscus GTK HEO Hyprland jQuery JS KDE K签 Linux Lisp LLM Path Pypi Python RSS Textual TUI Vim VTB VUP Whl WP ジサツ 上海 专业 主题 云朵 享乐 优化 伦理 便利店 俄国 光标 内省 内耗 函数式 分析 创伤 创意 判断 前端 北京 参观 反思 可爱 和风 哲学 商业 回忆 国庆 壁纸 天津 女仆 姐妹 字典 学习 安装 实用 对话 工具 库 度假 开发环境 开源 归档 微风 心理 志怪 总结 意义 技校 抚远 拥抱 推荐 插件 摄影 政策 故事 故障排查 效果 散文 文件 文化 旅游 日本 日语 显卡 样式 模糊 治愈 浏览器 浦东 浦西 演讲 热力图 特效 猫猫 玩具 环境 甘城 生态 病毒 盘点 直播 社会 社团 视奸 秋游 科幻 移民 窗口 笔记 系统 红枫 终点 终端 经济 编译 美化 美缝 耳机 脑操 自动驾驶 苏州 茅山 萌系 补档 解释器 设计 评论 话术 谷子 走路 轮子 辍学 迁移 运维 重构 链 随机 静安 音频 项目 颜文字 颜色 首都 魔法 麦金塔 鼠标
3183 字
16 分钟
我做了一个日语的“编译器”:Nihongo
在我学习日语的时候,发现每次求助于AI的时候,都需要写一串固定的提示词。
「能不能省略提示词输入呢?」我想,然后我只用一天时间,做了一个AI驱动的“编译器”。
TIP名称“Nihongo”源自日语「にほんご」。
安装 | インストール
安装非常简单,只需要下载一个py源代码文件(在文末),然后配置Key和API就好了:
'''=== 在这里配置Nihongo ==='''
API_KEY = '' # 你的API key,千万不能泄露
API_BASE_URL = 'https://api.deepseek.com' # API的Base URL,默认是DeepSeek,详细请看API文档
AI_MODEL = 'deepseek-chat' # 使用的模型名称,默认是DeepSeek,详细请看API文档为了更好的效果,你可以在配置文件添加一行别名,这样随时随地都可以调用:
alias nihongo "<虚拟环境(选填)> <nihongo脚本位置>"NOTE下文均以此别名为示例。
IMPORTANT如果缺少所需依赖,请安装
typer和openai库。
使用 | 使用する
用起来很简单,和普通的编译器/解释器没太大的差别:
nihongo -h Usage: nihongo.py [OPTIONS] COMMAND [ARGS]...
Nihongo是日语的“编译器”。可以通过AI对日语文本文件进行“编译”和“静态分析”等操作。
╭─ Options ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --install-completion Install completion for the current shell. │
│ --show-completion Show completion for the current shell, to copy it or customize the installation. │
│ --help -h Show this message and exit. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ run 将日语编译成简体中文。 │
│ lint 逐句检查日语文本中的错误和问题。 │
│ expl 逐句分析日语文本中的语法要点。 │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯接下来,会以以下日语文件作示例,文件名为 temp.nhg :
(日语の练习)
私は山口と言います、浅草大学の学生です。
今、ここは地下鉄の電車です、私は浅草大学に行きます。
「すみません、この電車は浅草大学駅に行きますか?」
「つぎの駅は秋葉原駅で、終点は日本中山空港駅です、浅草大学駅には行きません。」
oh no!これは私の電車じゃないです!
「つぎの駅はどのぐらいかかりますか?」
「emm...八分ぐらいです。」
ああ、時間がとても長いですね。run
进入存在 temp.nhg 的文件夹,然后执行以下命令,便可以开始“编译”:
nihongo run temp.nhg(日语练习)
我叫山口,是浅草大学的学生。
现在,这里是在地铁电车上,我要去浅草大学。
“不好意思,这趟电车去浅草大学站吗?”
“下一站是秋叶原站,终点是日本中山机场站,不去浅草大学站。”
oh no!这不是我要坐的电车!
“到下一站大概要多久?”
“emm...大概八分钟。”
啊,时间好长啊。lint
与上面差不多的操作,执行以下命令就可以查找文件中有什么错误和问题,同时美观地呈现出来:
nihongo lint temp.nhg1. 私は山口と言います、浅草大学の学生です。
警告:「と言います」通常用于自我介绍姓名,但更自然的说法是「と申します」或直接说「です」。此外,日语中通常用句号(。)或连
接词(で)来连接句子,而不是逗号(、)。更地道的表达是「私は山口と申します。浅草大学の学生です。」或「山口です。浅草大学の
学生です。」
--------------------------------------------------
2. 今、ここは地下鉄の電車です、私は浅草大学に行きます。
错误:「ここは地下鉄の電車です」存在语义错误。「ここ」指代地点,不能是「電車」。应改为「今、私は地下鉄の電車の中です」或「
今、ここは地下鉄の電車の中です」。
警告:句子用逗号连接显得生硬。更自然的表达是「今、地下鉄の電車の中にいます。浅草大学に向かっています。」
--------------------------------------------------
3. 「すみません、この電車は浅草大学駅に行きますか?」
警告:询问电车是否前往某站时,更地道的说法是「この電車は浅草大学駅に止まりますか?」或「浅草大学駅に行きますか?」虽然语法
正确,但「行きますか」在此语境下略显生硬。
--------------------------------------------------
4. 「つぎの駅は秋葉原駅で、終点は日本中山空港駅です、浅草大学駅には行きません。」
警告:句子结构略显生硬。更自然的表达是「次の駅は秋葉原で、終点は日本中山空港です。浅草大学駅には行きません。」注意「つぎ」
应使用汉字「次」。
--------------------------------------------------
5. oh no!これは私の電車じゃないです!
警告:「oh
no」是英语,在日语对话中通常使用「あっ!」「しまった!」等感叹词。整句更自然的表达是「あっ!これは私の電車じゃない!」
--------------------------------------------------
6. 「つぎの駅はどのぐらいかかりますか?」
警告:询问到达下一站需要多少时间时,更地道的说法是「次の駅までどのくらい(時間が)かかりますか?」或「次の駅まであとどのく
らいですか?」
--------------------------------------------------
7. 「emm...八分ぐらいです。」
警告:「emm」是英语中的犹豫词,日语中常用「ええと…」或「あの…」。数字「八」在表示分钟时通常使用阿拉伯数字或平假名「はち」
,但用汉字也可以。更自然的表达是「ええと…8分ぐらいです。」
--------------------------------------------------
8. ああ、時間がとても長いですね。
错误:「時間が長い」通常用于描述时间段本身很长(如“漫长的岁月”),不用于等待时间。描述等待时间感觉长,应使用「時間がかかる
」或「待ち時間が長い」。
警告:结合上下文,更自然的感叹是「ああ、まだ8分もかかるんですね。」或「長いなあ。」
--------------------------------------------------expl
与上面类似,但是用于解析句子的语法成分:
nihongo expl temp.nhg1. 私は山口と言います、浅草大学の学生です。
解释:「私」是主语,意为“我”。「は」是提示助词,用于提示主题。「山口と言います」中,「と」是表示引用或称谓的格助词,「言い
ます」是动词「言う」的礼貌形,意为“叫做”。整句意为“我叫山口”。逗号后「浅草大学の学生です」中,「の」是表示所属的格助词,「
学生です」是名词谓语句的礼貌形,意为“是学生”。整句意为“我是浅草大学的学生”。
--------------------------------------------------
2. 今、ここは地下鉄の電車です、私は浅草大学に行きます。
解释:「今」是副词,意为“现在”。「ここ」是代词,意为“这里”。「は」提示主题。「地下鉄の電車です」中,「の」表示属性,意为“
地铁的电车/地铁列车”。「です」是判断助动词的礼貌形。前半句意为“现在,这里是地铁列车”。逗号后「私は」再次提示主题「我」。「
浅草大学に」中,「に」是表示方向的格助词。「行きます」是动词「行く」的礼貌形,意为“去”。后半句意为“我要去浅草大学”。
--------------------------------------------------
3. 「すみません、この電車は浅草大学駅に行きますか?」
解释:「すみません」是寒暄语,意为“不好意思/请问”。「この」是连体词,意为“这辆”。「電車は」提示主题“电车”。「浅草大学駅に
」中,「に」表示方向。「行きますか」是「行きます」加上疑问终助词「か」,构成礼貌疑问句。整句意为“请问,这辆电车去浅草大学
站吗?”。
--------------------------------------------------
4. 「つぎの駅は秋葉原駅で、終点は日本中山空港駅です、浅草大学駅には行きません。」
解释:「つぎの駅は」中,「つぎ」意为“下一个”,「は」提示主题“下一站”。「秋葉原駅で」中,「で」是判断助动词「だ」的中顿形,
用于连接句子,意为“是”。「終点は」提示主题“终点”。「日本中山空港駅です」是判断句,意为“是日本中山机场站”。逗号后「浅草大学
駅には」中,「に」表示方向,「は」在此加强提示,有对比含义。「行きません」是「行きます」的否定形。整句意为“下一站是秋叶原
站,终点是日本中山机场站,不去浅草大学站。”。
--------------------------------------------------
5. oh no!これは私の電車じゃないです!
解释:「oh
no!」是英语感叹词。「これは」提示主题“这个”。「私の」中「の」表示所属,意为“我的”。「電車」是名词。“じゃないです”是「では
ないです」的口语形式,表示否定判断,意为“不是”。整句意为“哦不!这不是我的电车!”。
--------------------------------------------------
6. 「つぎの駅はどのぐらいかかりますか?」
解释:「つぎの駅は」提示主题“到下一站”。「どのぐらい」是疑问词,询问程度或数量,意为“大约多少”。「かかります」是动词「かか
る」,意为“花费(时间)”。「か」是疑问终助词。整句意为“到下一站要花多长时间?”。
--------------------------------------------------
7. 「emm...八分ぐらいです。」
解释:「emm...」是犹豫的语气词。「八分」意为“八分钟”。「ぐらい」是副助词,表示大概的数量,意为“左右”。「です」是礼貌判断。
整句意为“嗯…大概八分钟左右。”。
--------------------------------------------------
8. ああ、時間がとても長いですね。
解释:「ああ」是感叹词,意为“啊”。「時間が」中,「が」是主格助词,提示主语“时间”。「とても」是副词,意为“非常”。「長い」是
形容词,意为“长”。「です」是礼貌体。「ね」是终助词,表示感叹或寻求认同。整句意为“啊,时间可真长啊。”。
--------------------------------------------------源代码:nihongo.py | ソースコード
'''=== 在这里配置Nihongo ==='''
API_KEY = '' # 你的API key,千万不能泄露
API_BASE_URL = 'https://api.deepseek.com' # API的Base URL,默认是DeepSeek,详细请看API文档
AI_MODEL = 'deepseek-chat' # 使用的模型名称,默认是DeepSeek,详细请看API文档
'''=== 初始化 ==='''
from rich.progress import Progress, SpinnerColumn, TextColumn
from typing_extensions import Annotated
from functools import wraps
from openai import OpenAI
from rich import print
import textwrap
import typer
nihongo = typer.Typer()
'''=== 内部函数 ==='''
def call_api(pormpt):
client = OpenAI(
api_key = API_KEY,
base_url = API_BASE_URL
)
response = client.chat.completions.create(
model = AI_MODEL,
messages = [{"role": "user", "content": pormpt},],
stream = False
)
return response.choices[0].message.content
def command_proceessed(loading_text):
def get_func(func):
@wraps(func)
def execute(*args, **kwargs):
with Progress(
SpinnerColumn(),
TextColumn("[progress.description]{task.description}"),
transient=True) as progress:
progress.add_task(description=loading_text, total=None)
func(*args, **kwargs)
return execute
return get_func
def get_line():
return f'[bright_black]{'-'*50}[/bright_black]'
'''=== 命令和子命令 ==='''
@nihongo.callback(
invoke_without_command = True,
context_settings = dict(help_option_names=['-h', '--help']))
def callback():
'''
Nihongo是日语的“编译器”。可以通过AI对日语文本文件进行“编译”和“静态分析”等操作。
'''
pass
@nihongo.command()
@command_proceessed(loading_text='编译中...')
def run(file_path: Annotated[str, typer.Argument(help="日语文本文件的路径")]):
'''
将日语编译成简体中文。
'''
print(call_api(textwrap.dedent(f'''
请按照日语原文一一对应地、严谨地翻译成简体中文,同样只需要译文,不要附带其他信息。
原文:
{open(file_path, mode='r', encoding='UTF-8').read()}
''')))
@nihongo.command()
@command_proceessed(loading_text='检查中,可能需要一些时间...')
def lint(file_path: Annotated[str, typer.Argument(help="日语文本文件的路径")]):
'''
逐句检查日语文本中的错误和问题。
'''
print(call_api(textwrap.dedent(f'''
请逐句检查日语文本有什么语法语义错误(使用错误表示)、表达不地道或生硬的地方(使用警告表示)
如果都没有问题,就可以跳过这个句子(不显示),以每个句子列举出来,用不带Markdown的简体中文输出。
此外,请按照以下格式输出:
1. [b]句子原文[/b]
[red b]错误:[/red b]语法语义的错误信息
{get_line()}
2. [b]句子原文[/b]
[yellow b]警告:[/yellow b]表达不地道的警告信息
{get_line()}
(省略更多...)
原文:
{open(file_path, mode='r', encoding='UTF-8').read()}
''')))
@nihongo.command()
@command_proceessed(loading_text='分析中,可能需要一些时间...')
def expl(file_path: Annotated[str, typer.Argument(help="日语文本文件的路径")]):
'''
逐句分析日语文本中的语法要点。
'''
print(call_api(textwrap.dedent(f'''
请逐句解释它的日语语法,用不带Markdown的简体中文输出。
此外,请按照以下格式输出:
1. [b]句子原文[/b]
解释:解释文本
{get_line()}
2. [b]句子原文[/b]
解释:解释文本
{get_line()}
(省略更多...)
原文:
{open(file_path, mode='r', encoding='UTF-8').read()}
''')))
'''=== 主函数 ==='''
if __name__ == '__main__':
nihongo()如果此时间过长,文中的信息可能会失去时效性,甚至不再准确。

