使用 TypeScript 进行类型化的日语学习 (Typed Japanese)

typedgrammar/ typed-japanese Public

学习日语语法,用 TypeScript。

typedgrammar.com

License

MIT license 757 stars 6 forks Branches Tags Activity

typedgrammar/typed-japanese

main

BranchesTags

文件夹和文件

| Name | Name | Last commit message | Last commit date | | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------ | :--------------- | | .github/workflows | .github/workflows | | | | images | images | | | | src | src | | | | .eslintignore | .eslintignore | | | | .gitignore | .gitignore | | | | LICENSE | LICENSE | | | | README.md | README.md | | | | blog.md | blog.md | | | | eslint.config.js | eslint.config.js | | | | package.json | package.json | | | | pnpm-lock.yaml | pnpm-lock.yaml | | | | tsconfig.json | tsconfig.json | | |

最新提交

历史

17 Commits

🌸 Typed Japanese

如果你会写 TypeScript,你就能理解日语!

Open in StackBlitz

demo

Typed Japanese 是一个 TypeScript 类型级别的库,它允许通过类型系统表达完整的日语句子。它创建了一个基于日语语法规则的领域特定语言 (DSL),允许使用 TypeScript 的编译器编写和验证语法上正确的自然语言子集。

该项目还探索了一种用于 AI 语言学习的中间格式。例如,LLM 可以使用这种格式返回日语句子的语法分析,而不是 JSON,从而可以通过 TypeScript 的类型检查器进行验证,以提高正确性。

📖 想了解更多? 查看我们的详细博客文章,其中解释了如何从头开始使用 TypeScript 类型系统来学习日语语法。本文从基本的编程概念开始,逐步构建到复杂的日语语法结构,如条件句和疑问短语。

// 定义专有名词 "ヒンメル" (辛美尔)
type ヒンメル = ProperNoun<"ヒンメル">;
// 定义 する 动词
type する = IrregularVerb & { dictionary: "する" };
// 创建 そうした 模式 (过去时的 そうする)
type そうした = DemonstrativeAction<Demonstrative & "そう", する, "た形">;
// 创建条件短语 "ヒンメルならそうした"
type ヒンメルならそうした = ConditionalPhrase<ヒンメル, "なら", そうした>;
// 类型检查示例
const properExample: ヒンメルならそうした = "ヒンメルならそうした"; // "如果是辛美尔的话,他也会这么做的"
// 如果是辛美尔的话,他也会这么做的

🤖 动词系统

动词分类

日语动词分为三个主要类别:

  1. Godan Verbs (五段动词) - 也称为 “Group 1” 或 “u-verbs”
    • 词尾:う, く, ぐ, す, つ, ぬ, ぶ, む, る
    • 例子: 話す (hanasu - 说话), 書く (kaku - 写字)
  2. Ichidan Verbs (一段动词) - 也称为 “Group 2” 或 “ru-verbs”
    • 总是以 る 结尾
    • 例子: 食べる (taberu - 吃), 見る (miru - 看)
  3. Irregular Verbs (不规则动词) - 只有两个主要动词
    • する (suru - 做)
    • 来る (kuru - 来)

动词活用形式

该系统支持以下活用形式:

type 買う = GodanVerb & { stem: "買"; ending: "う" };
type 買うて形 = ConjugateVerb<買う, "て形">; // 買って
type 買うた形 = ConjugateVerb<買う, "た形">; // 買った
type 食べる = IchidanVerb & { stem: "食べ"; ending: "る" };
type 食べるて形 = ConjugateVerb<食べる, "て形">; // 食べて
type 食べるた形 = ConjugateVerb<食べる, "た形">; // 食べた

🎨 形容词系统

日语形容词分为两个主要类别:

  1. I-Adjectives (い形容词) - 以 い 结尾
    • 例子: いい (good - 好), 楽しい (fun - 愉快), 高い (expensive - 贵)
  2. Na-Adjectives (な形容词) - 修饰名词时需要 な
    • 例子: 綺麗 (pretty - 美丽), 静か (quiet - 安静), 好き (liked - 喜欢)

形容词活用形式

该系统支持以下形容词活用形式:

type いい = IAdjective & { stem: "い"; ending: "い"; irregular: true };
type 綺麗 = NaAdjective & { stem: "綺麗" };

📚 短语和句子构成

该系统现在支持:

示例:连接简单的形容词和命令动词短语

// I-adjective "ii" (good) with irregular conjugation
// Then add particle "yo" to basic form of "ii" -> "ii yo"
type いい = IAdjective & { stem: "い"; ending: "い"; irregular: true };
type いいよ = PhraseWithParticle<ConjugateAdjective<いい, "基本形">, "よ">;
// Irregular verb "kuru" (to come)
// Then add particle "yo" to imperative form of "kuru" -> "koi yo"
type 来る = IrregularVerb & { dictionary: "来る" };
type 来いよ = PhraseWithParticle<ConjugateVerb<来る, "命令形">, "よ">;
// Connect both phrases -> "ii yo, koi yo"
type いいよ来いよ = ConnectedPhrases<いいよ, 来いよ>;
// Type checking examples
const correctPhrase1: いいよ = "いいよ"; // "It's good!" (114)
const correctPhrase2: 来いよ = "来いよ"; // "Come here!" (514)
const correctFullPhrase: いいよ来いよ = "いいよ、来いよ"; // "It's good, come here!"

示例:更灵活的基于组件的句子构建

type SentenceParts = [
 AdverbPart<"なんで">, // "Why" - question adverb
 IntensifierPart<"そんなに">, // "So much" - intensifier
 VerbPart<慣れる, "て形">, // "Get used to" in te-form
 ContractedPart<"ん">, // Contraction of "の" - colloquial nominalizer
 ParticlePart<"だ">, // Copula "is"
 ParticlePart<"よ"> // Emphatic sentence-ending particle
];
// Combines all parts into a single string
type JoinedSentence = JoinPhrasePartsValue<SentenceParts>;
const joinedSentence: JoinedSentence = "なんでそんなに慣れてんだよ"; // "Why are you so used to it?!"
// 你为什么这么熟练啊?

⚙️ 技术实现

该系统使用 TypeScript 的模板字面量类型、条件类型和映射类型来创建日语语法规则的纯类型级别表示。

关键组成部分:

💡 为什么选择 Typed Japanese?

⚠️ 局限性

该项目仍处于非常早期的阶段,并且严重依赖 LLM 生成的语法规则,这些规则有时可能包含幻觉或不准确之处。如果在实际使用过程中发现任何问题,请通过确认并提供反馈来提供帮助。

🛠️ 开发

如果您有兴趣贡献或试验 Typed Japanese:

  1. 确保已安装 Node.jspnpm
  2. 克隆存储库
  3. 安装依赖项:pnpm install
  4. 运行测试:pnpm test

测试验证类型系统是否正常运行,以及是否正确实施了所有语法规则。

欢迎大家做出贡献!请随意打开 issue 提出 bug 或功能请求,或提交 pull request 进行改进。

📬 联系方式

对于赞助机会、研究合作或商业咨询,请通过 contact@typedgrammar.com 联系。

⚖️ 许可证

MIT

Copyright (c) 2025-present, Yifeng Wang

关于

使用 TypeScript 学习日语语法

typedgrammar.com

话题

nlp typescript dsl japanese grammar language-learning computational-linguistics type-system type-level-programming language-verification typescript-types japanese-grammar

资源

Readme

许可证

MIT license

Stars

757 stars

Watchers

1 watching

Forks

6 forks

语言