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()如果此时间过长,文中的信息可能会失去时效性,甚至不再准确。

