{"id":24912854,"url":"https://github.com/raynardj/yuan","last_synced_at":"2025-09-10T14:33:25.943Z","repository":{"id":37408786,"uuid":"425432915","full_name":"raynardj/yuan","owner":"raynardj","description":"渊 - A project for Classical Chinese","archived":false,"fork":false,"pushed_at":"2022-02-23T13:02:52.000Z","size":62,"stargazers_count":45,"open_issues_count":1,"forks_count":8,"subscribers_count":3,"default_branch":"main","last_synced_at":"2023-03-02T13:47:01.522Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/raynardj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-11-07T06:46:25.000Z","updated_at":"2023-02-26T04:06:12.000Z","dependencies_parsed_at":"2022-08-18T18:40:59.914Z","dependency_job_id":null,"html_url":"https://github.com/raynardj/yuan","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raynardj%2Fyuan","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raynardj%2Fyuan/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raynardj%2Fyuan/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raynardj%2Fyuan/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/raynardj","download_url":"https://codeload.github.com/raynardj/yuan/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":236756749,"owners_count":19199894,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-02T05:28:45.002Z","updated_at":"2025-02-02T05:28:46.342Z","avatar_url":"https://github.com/raynardj.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 渊\n\u003e 渊 - AI+文言文一站式附庸风雅, 欢迎贡献新的思路 笔记 模型 数据\n\n一个文言诗词的NLP项目们。🌼\n\n* [附帶翻譯引擎的所有古文在這裡開始閱讀](https://huggingface.co/spaces/raynardj/duguwen-classical-chinese-to-morden-translate)\n* [搜索: 博古搜今](#搜索)\n* [翻译](#翻译)\n    * [现代文到文言文翻译器](#现代文到文言文翻译器)\n    * [文言文到现代文翻译器](#文言文到现代文翻译器)\n* [断句](#断句)\n* [资源清单](#资源清单)\n\n## 搜索\n### 博古搜今\n* 用现代文语句模糊搜索文言文语句，可以去[🤗 模型主页](https://huggingface.co/raynardj/xlsearch-cross-lang-search-zh-vs-classicical-cn)下载模型\n\n您是不是经常遇到这样的问题：\n* 我不记得是谁， 哪个朝代，我只记得大概这么一个事儿，我就能模糊找到原文\n* 我不记得原文， 但是我只记得原文想表达的现代汉语意思， 希望能找出来引用一下。\n* 我在写文章， 有个观点， 我想碰运气看看古人有没有提过同样类似的说法。\n* 我只是想更有效率地阅读古文\n\n推荐的使用通道如下，当然， cosine距离搜索相关的框架和引擎很多， 大家自己看着适用的选\n\n装包\n```shell\npip install -Uqq unpackai\npip install -Uqq SentenceTransformer\n```\n\n搜索语句的函数\n```python\nfrom unpackai.interp import CosineSearch\nfrom sentence_transformers import SentenceTransformer\nimport pandas as pd\nimport numpy as np\n\nTAG = \"raynardj/xlsearch-cross-lang-search-zh-vs-classicical-cn\"\nencoder = SentenceTransformer(TAG)\n\n# all_lines is a list of all your sentences\n# all_lines 是一个你所有句子的列表， 可以是一本书， 按照句子分割， 也可以是很多很多书\nall_lines = [\"句子1\",\"句子2\",...]\nvec = encoder.encode(all_lines, batch_size=32, show_progress_bar=True)\n\n# consine距离搜索器\ncosine = CosineSearch(vec)\n\ndef search(text):\n    enc = encoder.encode(text) # encode the search key\n    order = cosine(enc) # distance array\n    sentence_df = pd.DataFrame({\"sentence\":np.array(all_lines)[order[:5]]})\n    return sentence_df\n```\n\n将史记打成句子以后， 搜索效果是这样的：\n\n```python\n\u003e\u003e\u003e search(\"他是一个很慷慨的人\")\n```\n```\nsentence\n0\t季布者，楚人也。为气任侠，有名於楚。\n1\t董仲舒为人廉直。\n2\t大将军为人仁善退让，以和柔自媚於上，然天下未有称也。\n3\t勃为人木彊敦厚，高帝以为可属大事。\n4\t石奢者，楚昭王相也。坚直廉正，无所阿避。\n```\n\n```python\n\u003e\u003e\u003e search(\"进入军营，必须缓缓牵着马骑\")\n```\n```\nsentence\n0\t壁门士吏谓从属车骑曰：将军约，军中不得驱驰。\n1\t起之为将，与士卒最下者同衣食。卧不设席，行不骑乘，亲裹赢粮，与士卒分劳苦。\n2\t既出，沛公留车骑，独骑一马，与樊哙等四人步从，从间道山下归走霸上军，而使张良谢项羽。\n3\t顷之，上行出中渭桥，有一人从穚下走出，乘舆马惊。\n4\t元狩四年春，上令大将军青、骠骑将军去病将各五万骑，步兵转者踵军数十万，而敢力战深入之士皆属骠骑。\n```\n\n## 翻译\n### 现代文到文言文翻译器\n* 可以去[🤗 模型主页](https://huggingface.co/raynardj/wenyanwen-chinese-translate-to-ancient)体验或下载这个模型。\n* 使用了这个[翻译句对的数据集](https://github.com/BangBOOM/Classical-Chinese)\n* 感兴趣的可以参考[训练的笔记](nbs/zh2cc_translate.ipynb)\n\n在python中推荐使用以下的代码进行inference：\n```python\nfrom transformers import (\n  EncoderDecoderModel,\n  AutoTokenizer\n)\nPRETRAINED = \"raynardj/wenyanwen-chinese-translate-to-ancient\"\ntokenizer = AutoTokenizer.from_pretrained(PRETRAINED)\nmodel = EncoderDecoderModel.from_pretrained(PRETRAINED)\n\ndef inference(text):\n    tk_kwargs = dict(\n      truncation=True,\n      max_length=128,\n      padding=\"max_length\",\n      return_tensors='pt')\n   \n    inputs = tokenizer([text,],**tk_kwargs)\n    with torch.no_grad():\n        return tokenizer.batch_decode(\n            model.generate(\n            inputs.input_ids,\n            attention_mask=inputs.attention_mask,\n            num_beams=3,\n            max_length=128,\n            bos_token_id=101,\n            eos_token_id=tokenizer.sep_token_id,\n            pad_token_id=tokenizer.pad_token_id,\n        ), skip_special_tokens=True)\n```\n#### 目前版本的案例\n目前版本， 按照上述通道的翻译案例：\n```python\n\u003e\u003e\u003e inference('你连一百块都不肯给我')\n['不 肯 与 我 百 钱 。']\n\u003e\u003e\u003e inference(\"他不能做长远的谋划\")\n['不 能 为 远 谋 。']\n\u003e\u003e\u003e inference(\"我们要干一番大事业\")\n['吾 属 当 举 大 事 。']\n\u003e\u003e\u003e inference(\"这感觉，已经不对，我努力，在挽回\")\n['此 之 谓 也 ， 已 不 可 矣 ， 我 勉 之 ， 以 回 之 。']\n\u003e\u003e\u003e inference(\"轻轻地我走了， 正如我轻轻地来， 我挥一挥衣袖，不带走一片云彩\")\n['轻 我 行 ， 如 我 轻 来 ， 挥 袂 不 携 一 片 云 。']\n```\n\n其中可改进处颇多:\n\n* [ ] 目前，模型最长语句是128，可以通过修改tokenizer的max_length参数来调整。也就是会忽略一些现代文的语句。\n* [ ] 可以通过去除pad token 的标签设置为-100，这样就不需要传eos token id了。\n* [ ] 目前使用现代文预训练的bert-base-chinese作为encoder, 现代文预训练的 gpt2作为decoder。我们完全可以使用文言文+诗词预训练的gpt2作为decoder, 提升效果几乎是肯定的。\n* [ ] 算力有限，许多调参细节，基本都没有试过。\n\n### 文言文到现代文翻译器\n\u003e 输入文言文， 可以是**断句** 或者 **未断句**的文言文， 模型会预测现代文的表述。\n\n* 欢迎前往[🤗 文言文（古文）到现代文的翻译器模型主页](https://huggingface.co/raynardj/wenyanwen-ancient-translate-to-modern)\n* 训练语料是就是九十多万句句对， [数据集链接📚](https://github.com/BangBOOM/Classical-Chinese)。 训练时source序列（古文序列）， 按照50%的概率整句去除所有标点符号。\n* 感兴趣的可以参考[训练的笔记](nbs/cc2zh_translate.ipynb),其中可改进处颇多。\n\n#### 推荐的inference 通道\n**注意**\n* 你必须将```generate```函数的```eos_token_id```设置为102就可以翻译出完整的语句， 不然翻译完了会有残留的语句(因为做熵的时候用pad标签=-100导致)。\n目前huggingface 页面上compute按钮会有这个问题， 推荐使用以下代码来得到翻译结果\n* 请设置```generate```的参数```num_beams\u003e=3```, 以达到较好的翻译效果\n* 请设置```generate```的参数```max_length```256， 不然结果会吃掉句子\n```python\nfrom transformers import (\n  EncoderDecoderModel,\n  AutoTokenizer\n)\nPRETRAINED = \"raynardj/wenyanwen-ancient-translate-to-modern\"\ntokenizer = AutoTokenizer.from_pretrained(PRETRAINED)\nmodel = EncoderDecoderModel.from_pretrained(PRETRAINED)\ndef inference(text):\n    tk_kwargs = dict(\n      truncation=True,\n      max_length=128,\n      padding=\"max_length\",\n      return_tensors='pt')\n   \n    inputs = tokenizer([text,],**tk_kwargs)\n    with torch.no_grad():\n        return tokenizer.batch_decode(\n            model.generate(\n            inputs.input_ids,\n            attention_mask=inputs.attention_mask,\n            num_beams=3,\n            max_length=256,\n            bos_token_id=101,\n            eos_token_id=tokenizer.sep_token_id,\n            pad_token_id=tokenizer.pad_token_id,\n        ), skip_special_tokens=True)\n```\n#### 目前版本的案例\n\u003e 当然， 拿比较熟知的语句过来， 通常会有些贻笑大方的失误， 大家如果有好玩的调戏案例， 也欢迎反馈\n```python\n\u003e\u003e\u003e inference('非我族类其心必异')\n['不 是 我 们 的 族 类 ， 他 们 的 心 思 必 然 不 同 。']\n\u003e\u003e\u003e inference('肉食者鄙未能远谋')\n['吃 肉 的 人 鄙 陋 ， 不 能 长 远 谋 划 。']\n# 这里我好几批模型都翻不出这个**输**字（甚至有一个版本翻成了秦始皇和汉武帝）， 可能并不是很古朴的用法， \n\u003e\u003e\u003e inference('江山如此多娇引无数英雄竞折腰惜秦皇汉武略输文采唐宗宋祖稍逊风骚')\n['江 山 如 此 多 ， 招 引 无 数 的 英 雄 ， 竞 相 折 腰 ， 可 惜 秦 皇 、 汉 武 ， 略 微 有 文 采 ， 唐 宗 、 宋 祖 稍 稍 逊 出 风 雅 。']\n\u003e\u003e\u003e inference(\"清风徐来水波不兴\")\n['清 风 慢 慢 吹 来 ， 水 波 不 兴 。']\n\u003e\u003e\u003e inference(\"无他唯手熟尔\")\n['没 有 别 的 事 ， 只 是 手 熟 罢 了 。']\n\u003e\u003e\u003e inference(\"此诚危急存亡之秋也\")\n['这 实 在 是 危 急 存 亡 的 时 候 。']\n```\n\n## 断句\n\u003e 输入一串未断句文言文， 可以断句， 目前支持二十多种标点符号\n\n* 训练好的模型[这里可以下](https://huggingface.co/raynardj/classical-chinese-punctuation-guwen-biaodian)\n* 使用了[【殆知阁v2.0数据集】](https://github.com/garychowcmu/daizhigev20)\n\n这里推荐的Inference函数如下\n\n```python\nfrom transformers import AutoTokenizer, BertForTokenClassification\nfrom transformers import pipeline\n\nTAG = \"raynardj/classical-chinese-punctuation-guwen-biaodian\"\nner = pipeline(\"ner\",module.model,tokenizer=tokenizer)\n\nmodel = BertForTokenClassification.from_pretrained(TAG)\ntokenizer = AutoTokenizer.from_pretrained(TAG)\n\ndef mark_sentence(x: str):\n    outputs = ner(x)\n    x_list = list(x)\n    for i, output in enumerate(outputs):\n        x_list.insert(output['end']+i, output['entity'])\n    return \"\".join(x_list)\n```\n\n案例\n```python\n\u003e\u003e\u003e mark_sentence(\"\"\"郡邑置夫子庙于学以嵗时释奠盖自唐贞观以来未之或改我宋有天下因其制而损益之姑苏当浙右要区规模尤大更建炎戎马荡然无遗虽修学宫于荆榛瓦砾之余独殿宇未遑议也每春秋展礼于斋庐已则置不问殆为阙典今寳文阁直学士括苍梁公来牧之明年实绍兴十有一禩也二月上丁修祀既毕乃愓然自咎揖诸生而告之曰天子不以汝嘉为不肖俾再守兹土顾治民事神皆守之职惟是夫子之祀教化所基尤宜严且谨而拜跪荐祭之地卑陋乃尔其何以掲防妥灵汝嘉不敢避其责曩常去此弥年若有所负尚安得以罢輭自恕复累后人乎他日或克就绪愿与诸君落之于是谋之僚吏搜故府得遗材千枚取赢资以给其费鸠工庀役各举其任嵗月讫工民不与知像设礼器百用具修至于堂室廊序门牖垣墙皆一新之\"\"\")\n\n'郡邑，置夫子庙于学，以嵗时释奠。盖自唐贞观以来，未之或改。我宋有天下因其制而损益之。姑苏当浙右要区，规模尤大，更建炎戎马，荡然无遗。虽修学宫于荆榛瓦砾之余，独殿宇未遑议也。每春秋展礼于斋庐，已则置不问，殆为阙典。今寳文阁直学士括苍梁公来牧之。明年，实绍兴十有一禩也。二月，上丁修祀既毕，乃愓然自咎，揖诸生而告之曰\"天子不以汝嘉为不肖，俾再守兹土，顾治民事，神皆守之职。惟是夫子之祀，教化所基，尤宜严且谨。而拜跪荐祭之地，卑陋乃尔。其何以掲防妥灵？汝嘉不敢避其责。曩常去此弥年，若有所负，尚安得以罢輭自恕，复累后人乎！他日或克就绪，愿与诸君落之。于是谋之，僚吏搜故府，得遗材千枚，取赢资以给其费。鸠工庀役，各举其任。嵗月讫，工民不与知像，设礼器，百用具修。至于堂室。廊序。门牖。垣墙，皆一新之。'\n```\n\n### 可能会有的瑕疵\n* 有时候两个标点符号连在一起， 会被吃掉一个， 比如```：【```会只有```【```\n* 有时候标记的字太强了， 很难学会例外， 比如也字就很霸道， \"吾生也有涯，而知也无涯。以有涯随无涯，殆已\" 怎么都断不正确\n\n## 资源清单\n* [项目源代码 🌟, 欢迎+star提pr](https://github.com/raynardj/yuan)\n* [跨语种搜索 🔎](https://huggingface.co/raynardj/xlsearch-cross-lang-search-zh-vs-classicical-cn)\n* [现代文翻译古汉语的模型 ⛰](https://huggingface.co/raynardj/wenyanwen-chinese-translate-to-ancient)\n* [古汉语到现代文的翻译模型, 输入可以是未断句的句子 🚀](https://huggingface.co/raynardj/wenyanwen-ancient-translate-to-modern)\n* [断句模型 🗡](https://huggingface.co/raynardj/classical-chinese-punctuation-guwen-biaodian)\n* [意境关键词 和 藏头写诗🤖](https://huggingface.co/raynardj/keywords-cangtou-chinese-poetry)\n\n欢迎联系我github的邮箱讨论，或者提交issue，我会尽力帮助你。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraynardj%2Fyuan","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fraynardj%2Fyuan","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraynardj%2Fyuan/lists"}