【中日文本翻译数据集】经典小说中日文句子翻译对齐数据集
浏览 688下载 53数据大小: 14.74文件格式: XLSX2024/11/04
数据集简介
数据集概述
本数据集由多部经典小说的逐句中日文对齐句子构成,旨在为自然语言处理(NLP)中的机器翻译、双语句法分析、多语言模型训练等提供高质量的语料资源。数据集涵盖了大量知名作品,包括《安徒生童话》《癌症楼》《巴山夜雨》等,严格保证句子层面的中日文翻译对齐,适合多种NLP任务。
数据格式
数据集以 xlsx 文件格式提供,每行记录一个对齐句对及其相关的结构信息。字段说明如下:
id:句子的唯一标识符,用于数据的快速索引。日文翻译:每个句子的日文翻译,贴近原句风格,符合日语表达习惯。中文原句:经典小说中的原始中文句子,提供了丰富的中文语料资源。小说名称:句子所在小说的名称,便于按书名筛选或分割数据。小说作者:原著作者,用于按作者进行分析和筛选。分词:对中文句子进行的分词处理结果,为分词算法及中文特征提取提供支持。章节id:句子所在的章节编号,便于在上下文中定位句子的原始位置。预置状态:标识当前句子的处理状态,例如“已翻译”“待验证”等,以辅助数据管理。
应用场景
- 日语机器翻译:为中日双语翻译模型的训练提供高质量的数据支持,特别适用于神经网络翻译模型。
- 跨语言文本对齐:适合句法对齐和语义对齐研究,通过逐句对齐的方式,为多语言模型中的句法关系提供参考。
- 多语言文本生成:可用于多语言对话系统和文本生成任务的模型训练,提高生成内容的自然度和准确性。
- 文本特征分析:通过分词字段支持词频、词性等特征分析,适用于双语句子结构对比和翻译模型的特征提取。
数据特点
本数据集适用于多种NLP研究,包括但不限于翻译模型的训练和评价、双语句子特征研究等,为研究人员和开发者提供了多语种、跨文化的丰富语料资源,是探索多语言处理和跨文化理解的理想基础数据集。
数据预览
| id | 日文翻译 | 中文原句 | 小说名称 | 小说作者 | 分词 | 章节id | 预置状态 |
|---|---|---|---|---|---|---|---|
| 1 | 彼は何を話すことができますか? | 他能讲什么 | 安徒生童话 | 安徒生 | 他|能|讲|什么 | 16 | 0 |
| 2 | アンジェロは彼の言葉から何の手がかりも聞き出せず、問い詰めるのをやめた | 安吉罗无法从他的话中听出什么线索,他便不再问下去了 | 安徒生童话 | 安徒生 | 安吉|罗|无法|从|他|的话|中|听|出|什么|线索|,|他|便|不再|问|下去|了 | 16 | 0 |
| 3 | 君は一日じゅう夢を見ている,血がどろどろだ | 你终日在做梦,血都稠了 | 安徒生童话 | 安徒生 | 你|终日|在|做梦|,|血|都|稠|了 | 16 | 0 |
| 4 | 私たち人間のようになりましょう | 像我们这些人一样做人吧 | 安徒生童话 | 安徒生 | 像|我们|这些|人|一样|做人|吧 | 16 | 0 |
| 5 | 理想の中で生きてはいけない,そうすれば人は倒れてしまう | 别生活在理想之中,那样人要垮掉的 | 安徒生童话 | 安徒生 | 别|生活|在|理想|之中|,|那样|人要|垮掉|的 | 16 | 0 |
| 6 | 酒に少し酔ってそうすればぐっすり眠れるよ | 用酒稍微醉上那么一回,那样你可以好好睡上一觉 | 安徒生童话 | 安徒生 | 用酒|稍微|醉上|那么|一回|,|那样|你|可以|好好|睡上|一觉 | 16 | 0 |
| 7 | きれいな娘を捜して君のために医者になってやる | 找个漂亮的姑娘给你当大夫 | 安徒生童话 | 安徒生 | 找个|漂亮|的|姑娘|给|你|当|大夫 | 16 | 0 |
| 8 | 平野の娘はとても美しい。大理石の宮殿の王女と同じだ。みんなイブだ。天国では見分けがつかない。 | 平原姑娘很漂亮,和大理石宫殿里的公主一个样,他们都是夏娃,到天堂里你是分辨不出她们的 | 安徒生童话 | 安徒生 | 平原|姑娘|漂亮|很漂亮|,|和|大理|大理石|宫殿|里|的|公主|一个|一个样|,|他们|都|是|夏娃|,|到|天堂|里|你|是|分辨|不|出|她们|的 | 16 | 0 |
| 9 | あなたのアンジェロについていきましょう⑥ | 跟上你的安吉罗⑥吧 | 安徒生童话 | 安徒生 | 跟上|你|的|安吉|罗|⑥|吧 | 16 | 0 |
| 10 | あなたの天使は私であり、人生の天使です | 你的天使便是我,生命的天使 | 安徒生童话 | 安徒生 | 你|的|天使|便是|我|,|生命|的|天使 | 16 | 0 |
| 11 | 将来、あなたが年をとって背中が曲がっている日が来るでしょう。そのような穏やかな日には、すべてのものが喜びを求めています。あなたはもう成長していない枯れ草のように横たわっています。 | 将来会有那么一天,你老了,腰弯背驼了,在那么一个风和日丽的日子里,万物都寻欢作乐,你会像一根不再生长的枯草一样躺倒 | 安徒生童话 | 安徒生 | 将来|会|有|那么|一天|,|你老|了|,|腰弯|背驼|了|,|在|那么|一个|日丽|风和日丽|的|日子|里|,|万物|都|寻欢|作乐|寻欢作乐|,|你|会|像|一根|不再|生长|的|枯草|一样|躺倒 | 16 | 0 |
| 12 | 私は牧師が墓の後ろに人生があると言うと信じていません。それは美しい想像力であり、子供のためのおとぎ話です | 我不相信牧师们说的坟墓背后还有一个生命,那是一种美丽的想象,是给孩子们讲的童话 | 安徒生童话 | 安徒生 | 我|不|相信|牧师|们|说|的|坟墓|背后|还有|一个|生命|,|那|是|一种|美丽|的|想象|,|是|给|孩子|们|讲|的|童话 | 16 | 0 |
| 13 | もし君が空想してみたら,それは確かに美しい | 如果你幻想一下的话,那的确是很美的 | 安徒生童话 | 安徒生 | 如果|你|幻想|一下|的话|,|那|的确|是|很|美的 | 16 | 0 |
| 14 | しかし、私は夢の中で生きていない、私は現実の中で生きている | 但是我不生活在梦幻中,我生活在现实中 | 安徒生童话 | 安徒生 | 但是|我|不|生活|在|梦幻|中|,|我|生活|在|现实|中 | 16 | 0 |
| 15 | フォローする | 跟我来 | 安徒生童话 | 安徒生 | 跟我来 | 16 | 0 |
| 16 | 誰かになりましょう | 做个人吧 | 安徒生童话 | 安徒生 | 做|个人|吧 | 16 | 0 |
| 17 | 彼は彼を引き離した,この瞬間彼は彼を引き離すことができる | 他拉他走了,此刻他能把他拉走 | 安徒生童话 | 安徒生 | 他|拉|他|走|了|,|此刻|他|能|把|他|拉走 | 16 | 0 |
| 18 | この若い芸術家の血は火のようであり,彼の心は変化し始めた | 这位年轻的艺术家的血液像火一样,他的心灵起了变化 | 安徒生童话 | 安徒生 | 这位|年轻|的|艺术|术家|艺术家|的|血液|像|火|一样|,|他|的|心灵|起|了|变化 | 16 | 0 |
| 19 | 彼は過去から、慣れ親しんだものから、古い自分から自由になりたいという願望を持っています。今日、彼はアンジェロに従っています。 | 他有一种摆脱过去,摆脱他习惯了的一切,从旧的自我中挣脱出来的渴望,今天他跟着安吉罗走了 | 安徒生童话 | 安徒生 | 他|有|一种|摆脱|过去|,|摆脱|他|习惯|了|的|一切|,|从|旧|的|自我|中|挣脱|出来|的|渴望|,|今天|他|跟着|安吉|罗走|了 | 16 | 0 |
| 20 | ローマの街のどこかに芸術家たちの酒場があり、古代の浴室の廃墟の上に建てられています | 罗马城外某个地方有一个艺术家们光顾的酒馆,建筑在一座古代浴室的废墟上 | 安徒生童话 | 安徒生 | 罗马|城外|某个|地方|有|一个|艺术|术家|艺术家|们|光顾|的|酒馆|,|建筑|在|一座|古代|浴室|的|废墟|上 | 16 | 0 |
| 21 | 黄金色のオレンジは、深緑色の光沢のある葉の真ん中にぶら下がっています,その古代の深澄み色の壁の一部をブロック | 金黄色的桔柑挂在墨绿色光泽的叶子中间,挡住了那古老的深澄色的墙的一部分 | 安徒生童话 | 安徒生 | 金黄|黄色|金黄色|的|桔柑|挂|在|墨绿|绿色|墨绿色|光泽|的|叶子|中间|,|挡住|了|那|古老|的|深澄色|的|墙|的|一部|部分|一部分 | 16 | 0 |
| 22 | ホテルは廃墟の大きな穴のような非常に深いアーチです | 酒店是一个极深的拱室,很像是废墟上的一个大洞 | 安徒生童话 | 安徒生 | 酒店|是|一个|极深|的|拱室|,|很|像是|废墟|上|的|一个|大洞 | 16 | 0 |
| 23 | 中には聖母像の前にランプがあり、暖炉の中には燃え盛る火があり、ここでは肉が焼かれ、焼かれ、調理されています。外にはオレンジと月桂樹の木の下にテーブルが2つあり、テーブルクロスが置かれ、カップと皿が置かれています。 | 里面圣母像前燃着一盏灯;壁炉里燃着熊熊的火,这里在烤着、烧着、煮着肉食;外面,在桔柑和月桂树下有两张铺了台布摆了杯盘的桌子 | 安徒生童话 | 安徒生 | 里面|圣母|像|前|燃着|一盏|盏灯|一盏灯|;|壁炉|里|燃着|熊熊|的|火|,|这里|在|烤|着|、|烧着|、|煮|着|肉食|;|外面|,|在|桔柑|和|月桂|桂树|月桂树|下|有|两张|铺|了|台布|摆|了|杯盘|的|桌子 | 16 | 0 |
| 24 | 友人たちはうれしそうにこの二人を迎えた | 朋友们欢欣愉快地迎接了这两个人 | 安徒生童话 | 安徒生 | 朋友|们|欢欣|愉快|地|迎接|了|这|两个|人 | 16 | 0 |
| 25 | 彼らは食べたり飲んだりせず、陽気な雰囲気になりました。歌を歌い、ギターを演奏しました。サタライロ⑦が鳴り響き、楽しい踊りが始まりました。 | 他们吃的不多,喝的不少,气氛热烈欢快起来;唱着歌,奏着吉他;萨塔赖罗⑦舞曲响起来,欢乐的舞蹈开始了 | 安徒生童话 | 安徒生 | 他们|吃|的|不|多|,|喝|的|不少|,|气氛|热烈|欢快|起来|;|唱着歌|,|奏|着|吉他|;|萨塔赖罗|⑦|舞曲|响|起来|,|欢乐|的|舞蹈|开始|了 | 16 | 0 |
| 26 | 若い芸術家のモデルである2人のローマの少女は、踊り、彼らの喜びに参加しました。 | 两个罗马姑娘,年轻艺术家的模特儿,跳起舞来,参加进他们的欢乐中;巴克司⑧的两个可爱的信徒 | 安徒生童话 | 安徒生 | 两个|罗马|姑娘|,|年轻|艺术|术家|艺术家|的|模特|模特儿|,|跳|起舞|来|,|参加|进|他们|的|欢乐|中|;|巴克|司|⑧|的|两个|可爱|的|信徒 | 16 | 0 |
| 27 | はい、彼らはプシュケのような形をしていません。美しく繊細なバラではありませんが、柔らかくて丈夫で、赤く輝くナデシコの花です。 | 是的,她们没有普赛克的体形,不是美丽娇秀的玫瑰,但都是鲜嫩、健壮和泛出红色的石竹花 | 安徒生童话 | 安徒生 | 是|的|,|她们|没有|普|赛克|的|体形|,|不是|美丽|娇秀|的|玫瑰|,|但|都|是|鲜嫩|、|健壮|和|泛出|红色|的|石竹|竹花|石竹花 | 16 | 0 |
| 28 | この日はなんて地熱なんだろう,日没になってもまだ暑い | 这一天天气是多么地热啊,就连日落时分也还是热的 | 安徒生童话 | 安徒生 | 这|一天|天气|是|多么|地热|啊|,|就|连|日落|时分|日落时分|也|还是|热|的 | 16 | 0 |
| 29 | 血が燃えている、空気が燃えている、すべての視線が燃えている | 血在燃烧,空气在燃烧,每一瞥眼光也在燃烧 | 安徒生童话 | 安徒生 | 血|在|燃烧|,|空气|在|燃烧|,|每|一瞥|眼光|也|在|燃烧 | 16 | 0 |
| 30 | 空気は黄金色、バラ色の中に浮かんでいて、人生は金のようであり、バラのようです | 空气在金黄色、玫瑰色中浮动,生命就像是金子,就像是玫瑰 | 安徒生童话 | 安徒生 | 空气|在|金黄|黄色|金黄色|、|玫瑰|玫瑰色|中|浮动|,|生命|就|像是|金子|,|就|像是|玫瑰 | 16 | 0 |
| 31 | やっと一回参加してきたね | 你总算来参加一次了 | 安徒生童话 | 安徒生 | 你|总算|来|参加|一次|了 | 16 | 0 |
| 32 | あなたの周りに、あなたの中の水があなたを運ぶようにしましょう | 让你周围,让你体内的水流载起你吧 | 安徒生童话 | 安徒生 | 让|你|周围|,|让|你|体内|的|水流|载起|你|吧 | 16 | 0 |
| 33 | 私はこれほどまでに快活で楽しいことはなかった | 我从来没有这么畅快、这么高兴过 | 安徒生童话 | 安徒生 | 我|从来|没有|这么|畅快|、|这么|高兴|过 | 16 | 0 |
| 34 | この若い芸術家は言いました | 这位年轻的艺术家说道 | 安徒生童话 | 安徒生 | 这位|年轻|的|艺术|术家|艺术家|说道 | 16 | 0 |
| 35 | あなたは正しい、あなたはすべて正しい | 你是对的,你们都是对的 | 安徒生童话 | 安徒生 | 你|是|对|的|,|你们|都|是|对|的 | 16 | 0 |
| 36 | 私はばかだ、空想家だ | 我是个傻瓜,是个幻想家 | 安徒生童话 | 安徒生 | 我|是|个|傻瓜|,|是|个|幻想|家 | 16 | 0 |
| 37 | 人間は現実に属するものであって,想像に属するものではない | 人是属于现实的,而不是属于想象的 | 安徒生童话 | 安徒生 | 人|是|属于|现实|的|,|而|不是|属于|想象|的 | 16 | 0 |
| 38 | この若者たちは、歌に合わせてギターを弾き、晴れた星空の夜にホテルを出て、狭い通りを歩きました | 这伙年轻人随着歌声弹着吉他在晴朗、满天繁星的夜里走出酒店,走过窄街 | 安徒生童话 | 安徒生 | 这伙|年轻|年轻人|随着|歌声|弹着|吉他|在|晴朗|、|满天|繁星|的|夜里|走出|酒店|,|走过|窄|街 | 16 | 0 |
| 39 | あの二つの真っ赤なナデシコの花、平原の娘も列の中を歩いている | 那两朵鲜红的石竹花,平原女儿也走在行列中 | 安徒生童话 | 安徒生 | 那|两朵|鲜红|的|石竹|竹花|石竹花|,|平原|女儿|也|走|在|行列|中 | 16 | 0 |
| 40 | アンジェロの部屋では、スケッチ、ワイングラス、カラフルな絵の山の中で、声は少し低くなりましたが、燃えるような感情は衰えませんでした | 在安吉罗的屋子里,在乱堆着速写稿、酒杯和丰富多彩的图画之中,声音略为低了一些,但火热的情绪却丝毫未减弱 | 安徒生童话 | 安徒生 | 在|安吉|罗|的|屋子|屋子里|,|在|乱堆|着|速写|稿|、|酒杯|和|丰富|多彩|丰富多彩|的|图画|之中|,|声音|略为|低|了|一些|,|但|火热|的|情绪|却|丝毫|未|减弱 | 16 | 0 |
| 41 | 床には多くの絵が散らばっていて、元の娘と同じように感動的で頑丈ですが、彼女たち自身ははるかに美しいです | 地板上散落了许多页画,和平原女儿一样动人、一样健壮,但是她们本人却更加美丽得多 | 安徒生童话 | 安徒生 | 地板|上|散落|了|许多|页|画|,|和|平原|女儿|一样|动人|、|一样|健壮|,|但是|她们|本人|却|更加|美丽|得|多 | 16 | 0 |
| 42 | その六つの枝の灯台の一本一本が燃えて光っている | 那盏六个枝的灯台的每一枝都在燃烧和闪光 | 安徒生童话 | 安徒生 | 那盏|六个|枝|的|灯台|的|每|一枝|都|在|燃烧|和|闪光 | 16 | 0 |
| 43 | 灯火の中に,人の姿が神として現われた | 在灯光里,人的形体显现为神 | 安徒生童话 | 安徒生 | 在|灯光|里|,|人|的|形体|显现|为神 | 16 | 0 |
| 44 | アポロ | 阿波罗 | 安徒生童话 | 安徒生 | 波罗|阿波罗 | 16 | 0 |
| 45 | ジュピター | 朱庇特 | 安徒生童话 | 安徒生 | 朱庇特 | 16 | 0 |
| 46 | ⑨われはあなたがたの天に,あなたがたの栄華に昇った。 | ⑨我升到你们的天上、你们的盛景中了 | 安徒生童话 | 安徒生 | ⑨|我升|到|你们|的|天上|、|你们|的|盛景|中|了 | 16 | 0 |
| 47 | 今この時私の心の中に生命の花が咲いたようだ | 此刻就好像生命之花在我心中绽开了 | 安徒生童话 | 安徒生 | 此刻|就|好像|生命|之花|我心|心中|在我心中|绽开|了 | 16 | 0 |
| 48 | はい、ほころびました。―砕けて砕けて、紛らわしい醜悪なにおいが渦巻き、目がくらみ、気が遠くなり、理性の火花が消えて、目の前が真っ暗になりました。 | 是啊,绽开了――被摔碎了、破落了,旋飞出一阵迷惑人的、丑恶的气味,眼光缭乱,神智不清,理智火花熄灭了,眼前黑了下来 | 安徒生童话 | 安徒生 | 是|啊|,|绽开|了|―|―|被|摔碎|了|、|破落|了|,|飞出|旋飞出|一阵|迷惑|人|的|、|丑恶|的|气味|,|眼光|缭乱|眼光缭乱|,|神智|神智不清|,|理智|火花|熄灭|了|,|眼前|黑|了|下来 | 16 | 0 |
| 49 | 彼は自分の家に帰り,自分のベッドに横になって少しはげみを作った | 他回到自己的家,躺到自己的床上,振作了一下 | 安徒生童话 | 安徒生 | 他|回到|自己|的|家|,|躺|到|自己|的|床上|,|振作|了|一下 | 16 | 0 |
示例代码(Python 加载)
以下是一个基于RNN + 注意力机制的中日文翻译模型训练的代码博客。这个示例将逐步引导您使用TensorFlow和Keras构建一个基于双向LSTM的神经机器翻译模型,并加入了注意力机制来增强模型的翻译能力。
环境准备
首先,安装必要的库:
pip install tensorflow pandas sklearn数据加载与预处理
假设我们有一个 xlsx 文件(例如 translation_dataset.xlsx),包含如下字段:id、日文翻译、中文原句、小说名称、小说作者、分词、章节id、预置状态。我们将加载这个文件并提取中日文句子,进行数据的分词和处理。
import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split
# 加载数据集
data = pd.read_excel('translation_dataset.xlsx')
# 提取中文和日文文本
japanese_texts = data['日文翻译'].values
chinese_texts = data['中文原句'].values
# 分割数据集
train_japanese, val_japanese, train_chinese, val_chinese = train_test_split(japanese_texts, chinese_texts, test_size=0.2, random_state=42)
分词和编码
为了让模型能够理解文本,需要先将句子转化为序列格式。我们使用 Tokenizer 为中日文本构建分词器,并将文本转化为整数序列。
# 使用 tf.keras.preprocessing.text.Tokenizer 构建分词器
def build_tokenizer(texts, max_vocab_size=10000, oov_token='<OOV>'):
tokenizer = tf.keras.preprocessing.text.Tokenizer(num_words=max_vocab_size, oov_token=oov_token)
tokenizer.fit_on_texts(texts)
return tokenizer
# 构建中日文分词器
japanese_tokenizer = build_tokenizer(train_japanese)
chinese_tokenizer = build_tokenizer(train_chinese)
# 将文本转换为序列
def tokenize_texts(tokenizer, texts, max_len=50):
sequences = tokenizer.texts_to_sequences(texts)
sequences = tf.keras.preprocessing.sequence.pad_sequences(sequences, maxlen=max_len, padding='post')
return sequences
# 将训练集和验证集转换为序列
train_japanese_seq = tokenize_texts(japanese_tokenizer, train_japanese)
val_japanese_seq = tokenize_texts(japanese_tokenizer, val_japanese)
train_chinese_seq = tokenize_texts(chinese_tokenizer, train_chinese)
val_chinese_seq = tokenize_texts(chinese_tokenizer, val_chinese)
# 词汇表大小和最大序列长度
japanese_vocab_size = len(japanese_tokenizer.word_index) + 1
chinese_vocab_size = len(chinese_tokenizer.word_index) + 1
max_seq_len = 50
模型构建:基于双向LSTM和注意力机制
使用双向LSTM来构建编码器和解码器,并加入注意力机制来帮助模型更好地捕获句子的上下文信息。
from tensorflow.keras.layers import Embedding, LSTM, Dense, Input, Bidirectional, Concatenate
from tensorflow.keras.models import Model
# 定义注意力机制
class Attention(tf.keras.layers.Layer):
def __init__(self, units):
super(Attention, self).__init__()
self.W1 = Dense(units)
self.W2 = Dense(units)
self.V = Dense(1)
def call(self, encoder_output, decoder_hidden):
# 计算注意力权重
decoder_hidden_with_time_axis = tf.expand_dims(decoder_hidden, 1)
score = self.V(tf.nn.tanh(self.W1(encoder_output) + self.W2(decoder_hidden_with_time_axis)))
attention_weights = tf.nn.softmax(score, axis=1)
context_vector = attention_weights * encoder_output
context_vector = tf.reduce_sum(context_vector, axis=1)
return context_vector, attention_weights
# 定义编码器
class Encoder(tf.keras.layers.Layer):
def __init__(self, vocab_size, embedding_dim, enc_units, batch_sz):
super(Encoder, self).__init__()
self.batch_sz = batch_sz
self.enc_units = enc_units
self.embedding = Embedding(vocab_size, embedding_dim)
self.lstm = Bidirectional(LSTM(enc_units, return_sequences=True, return_state=True))
def call(self, x):
x = self.embedding(x)
output, forward_h, forward_c, backward_h, backward_c = self.lstm(x)
state_h = Concatenate()([forward_h, backward_h])
state_c = Concatenate()([forward_c, backward_c])
return output, state_h, state_c
# 定义解码器
class Decoder(tf.keras.layers.Layer):
def __init__(self, vocab_size, embedding_dim, dec_units, batch_sz):
super(Decoder, self).__init__()
self.batch_sz = batch_sz
self.dec_units = dec_units
self.embedding = Embedding(vocab_size, embedding_dim)
self.lstm = LSTM(dec_units * 2, return_sequences=True, return_state=True)
self.fc = Dense(vocab_size)
self.attention = Attention(dec_units)
def call(self, x, enc_output, hidden):
context_vector, attention_weights = self.attention(enc_output, hidden)
x = self.embedding(x)
x = tf.concat([tf.expand_dims(context_vector, 1), x], axis=-1)
output, state_h, state_c = self.lstm(x)
output = tf.reshape(output, (-1, output.shape[2]))
x = self.fc(output)
return x, state_h, state_c, attention_weights
# 构建模型
embedding_dim = 256
units = 512
batch_size = 64
encoder = Encoder(japanese_vocab_size, embedding_dim, units, batch_size)
decoder = Decoder(chinese_vocab_size, embedding_dim, units, batch_size)
optimizer = tf.keras.optimizers.Adam()
loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True, reduction='none')
定义损失函数和训练步骤
# 损失函数定义
def loss_function(real, pred):
mask = tf.math.logical_not(tf.math.equal(real, 0))
loss_ = loss_object(real, pred)
mask = tf.cast(mask, dtype=loss_.dtype)
loss_ *= mask
return tf.reduce_mean(loss_)
# 训练步骤
@tf.function
def train_step(inp, targ, enc_hidden):
loss = 0
with tf.GradientTape() as tape:
enc_output, enc_hidden_h, enc_hidden_c = encoder(inp)
dec_hidden = enc_hidden_h
dec_input = tf.expand_dims([chinese_tokenizer.word_index['<start>']] * batch_size, 1)
for t in range(1, targ.shape[1]):
predictions, dec_hidden, _, _ = decoder(dec_input, enc_output, dec_hidden)
loss += loss_function(targ[:, t], predictions)
dec_input = tf.expand_dims(targ[:, t], 1)
batch_loss = (loss / int(targ.shape[1]))
variables = encoder.trainable_variables + decoder.trainable_variables
gradients = tape.gradient(loss, variables)
optimizer.apply_gradients(zip(gradients, variables))
return batch_loss
模型训练
将数据集构建为批处理数据集,并开始训练模型。
BUFFER_SIZE = len(train_japanese_seq)
steps_per_epoch = BUFFER_SIZE // batch_size
# 将数据集转换为TensorFlow数据集
train_dataset = tf.data.Dataset.from_tensor_slices((train_japanese_seq, train_chinese_seq)).shuffle(BUFFER_SIZE)
train_dataset = train_dataset.batch(batch_size, drop_remainder=True)
# 开始训练
EPOCHS = 20
for epoch in range(EPOCHS):
total_loss = 0
for (batch, (inp, targ)) in enumerate(train_dataset.take(steps_per_epoch)):
batch_loss = train_step(inp, targ, encoder)
total_loss += batch_loss
print(f'Epoch {epoch+1} Loss {total_loss / steps_per_epoch:.4f}')
模型评估与翻译测试
在训练结束后,我们可以测试模型的翻译效果。
def translate(sentence):
sentence_seq = tokenize_texts(japanese_tokenizer, [sentence], max_len=max_seq_len)
enc_output, enc_hidden_h, _ = encoder(sentence_seq)
dec_hidden = enc_hidden_h
dec_input = tf.expand_dims([chinese_tokenizer.word_index['<start>']], 0)
result = []
for t in range(max_seq_len):
predictions, dec_hidden, _, _ = decoder(dec_input, enc_output, dec_hidden)
predicted_id = tf.argmax(predictions[0]).numpy()
result.append(chinese_tokenizer.index_word.get(predicted_id, '<unk>'))
if chinese_tokenizer.index_word.get(predicted_id) == '<end>':
break
dec_input = tf.expand_dims([predicted_id], 0)
return ' '.join(result)
# 测试翻译
test_sentence = "これはテストの文章です。" # 假设这是日文输入
print("翻译结果:", translate(test_sentence))
技术细节
- 编码器与解码器:采用双向LSTM作为编码器,通过编码序列的双向信息增强对输入句子的理解。解码器同样是LSTM网络,并配备了注意力机制以提高翻译质量。
- 注意力机制:在每次解码时,为输入序列的每个单词分配一个注意力权重,以确保解码器能重点关注当前翻译的上下文信息。
- 损失函数:使用
SparseCategoricalCrossentropy作为损失函数,通过掩码忽略填充标记对损失的影响。 - 翻译流程:逐步生成目标句子的每个单词,使用贪心搜索策略获取当前时刻概率最高的单词,并迭代生成整个句子。
通过上述步骤,您可以训练一个中日文本翻译模型。这个模型实现了实际应用中的中日文本翻译,可用于多语言NLP任务的开发与评估。