集智数据集

【中越文本翻译数据集】经典小说中越文句子翻译对齐数据集

浏览 407下载 42数据大小: 15.71文件格式: XLSX2024/11/05

数据集简介

数据集概述
本数据集涵盖了多部经典中外小说的逐句翻译语料,内容被逐句对齐为中文与越南文,适用于深度学习翻译模型训练、多语言自然语言处理(NLP)、跨文化文本分析等任务。数据集包含《巴山夜雨》《悲惨世界》《百年孤独》《包法利夫人》等经典作品,提供了丰富的文学语料,为机器翻译和语言模型的研究开发奠定了基础。

数据格式
数据以 xlsx 文件格式提供,记录了每个句子的详细结构信息:

  • id:每条句子的唯一标识符,便于索引和管理。
  • 越南文翻译:逐句对应的越南文翻译,贴近原句风格,保留越南文语言特色。
  • 中文原句:经典小说的中文句子,传达原文的文学风格。
  • 小说名称:句子所在小说的名称,便于分组和筛选。
  • 小说作者:小说的作者名,支持按作者进行数据分析和筛选。
  • 分词:对中文句子进行的分词处理结果,为NLP任务中的特征提取和分析提供支持。
  • 章节id:句子所属的章节编号,便于追溯句子在原著中的位置。
  • 预置状态:表示当前句子的翻译和处理状态,如“已审核”“待翻译”等,便于数据集的质量控制。

应用场景

  1. 机器翻译研究:该数据集可用于中越翻译模型的训练与评估,适用于各类基于深度学习的翻译模型(如Transformer、RNN)。
  2. 多语言NLP任务:数据集中的逐句对齐文本为多语言任务(如情感分析、对话生成)提供了理想的双语语料。
  3. 文化研究与文本对比:通过逐句对齐的中文与越南文,支持跨文化语境中的语义分析与语言风格研究。
  4. 语言特征分析:借助分词字段,可以进行中文文本的词频、词性等特征提取,为中文语言结构的研究提供支持。

数据特点
本数据集为经典文学作品的逐句中越文对齐提供了优质的基础数据,适合用于多语言翻译、文本分析和自然语言处理模型开发。对于研究中越语言特征、语法结构以及文学风格的差异,本数据集具有重要的参考价值。

数据预览

id越南文翻译中文原句小说名称小说作者分词章节id预置状态
1Chân Tử Minh cười nói: "Chị Chu, chị có chút không hiểu đúng không?" 甄子明笑道:周嫂,你有点不明白吧巴山夜雨张恨水甄子|明笑|道|:|周嫂|,|你|有点|不|明白|吧380
2Đánh người, đó luôn làm cho người ta tức giận, nếu là cầm tiền đập người, người ta còn có thể tức giận sao? 打人,那总是让人家生气的,若是拿钱砸人,人家还会生气吗巴山夜雨张恨水打人|,|那|总是|让|人家|生气|的|,|若|是|拿|钱|砸|人|,|人家|还会|生气|吗380
3Có thể đánh một hồi vô ích 可以白打一阵巴山夜雨张恨水可以|白打|一阵380
4Chu tẩu nói: Hiện tại còn đi đâu tìm ngoại tiền đồng nguyên, ngươi cầm tờ tiền đập ta, cũng phải được 周嫂道:现在还哪里去找洋钱铜元,你拿票子砸我,也要得巴山夜雨张恨水周嫂|道|:|现在|还|哪里|去|找|洋钱|铜元|,|你|拿|票子|砸|我|,|也|要|得380
5Lý Nam Tuyền nói bằng tiếng Tứ Xuyên: Ngươi thật là quằn quại 李南泉操着川语道:你好歪哟巴山夜雨张恨水李|南泉|操着|川语|道|:|你好|歪|哟380
6Vé mỗi đồng một tờ, mười đồng một tờ, đánh người không đau, lại có giá trị, Lang không thể không 票子每元一张,十元一张,打了人不痛,又值钱,朗个要不得巴山夜雨张恨水票子|每元|一张|,|十元|一张|,|打|了|人|不痛|,|又|值钱|,|朗个|不得|要不得380
7Nói như vậy, mọi người đều cười, bà Tập cũng vác vai không cười nổi 这样说着,大家都笑了,奚太太也是扛了肩膀格格地笑个不了巴山夜雨张恨水这样|说|着|,|大家|都|笑|了|,|奚|太太|也|是|扛|了|肩膀|格格|地笑|个|不了380
8Ba người đàn ông thấy lửa đã tắt, tự đi 三位先生看到火已熄了,自行走去巴山夜雨张恨水三位|先生|看到|火已|熄|了|,|自行|走|去380
9Bà Tịch cũng đi về phía nhà mình 奚太太也就向自己屋子里走着巴山夜雨张恨水奚|太太|也|就|向|自己|屋子|屋子里|走|着380
10Bà Chu nhắc đến con gà chết, đi theo vào trong phòng hỏi bà: "Bà ơi, bà nói một câu, có bồi thường hay không bồi thường cái khác mà?" 周嫂提了那只死鸡,跟到屋子里向她问道:太太,你倒是说一句话,赔不赔别个嘛巴山夜雨张恨水周嫂|提|了|那|只|死鸡|,|跟|到|屋子|屋子里|向|她|问道|:|太太|,|你|倒|是|说|一句|话|,|赔|不|赔别|个|嘛380
11Bà Tập đối mặt với con gà hoa kia, xuất thần, nhìn phòng bên ngoài không có ai, liền thấp giọng cười với cô: "Cô nói, tôi đồng ý vô duyên vô cớ, chịu tổn thất này, giết một con gà ăn." 奚太太对着那只花鸡,出了一个神,看看外面屋子无人,这就低声向她笑道:你说,我肯无缘无故,受这番损失,杀一只鸡吃巴山夜雨张恨水奚|太太|对|着|那|只|花鸡|,|出|了|一个|神|,|看看|外面|屋子|无人|,|这|就|低声|向|她|笑|道|:|你|说|,|我肯|无缘|无故|无缘无故|,|受|这番|损失|,|杀|一只|鸡|吃380
12Tôi nên mượn cơ hội này để mời khách một lần 我应当借了这机会,请一次客巴山夜雨张恨水我|应当|借|了|这|机会|,|请|一次|客380
13Từ khi con gà đực này chết đi, Chu Sao liền mím môi hai cái, tóc xõa ra hai cái, xõa đến khuôn mặt đầy nếp nhăn 周嫂自从这雄鸡死后,她就撅着两片嘴唇,头发散了两仔,披到布满了皱纹的脸腮上巴山夜雨张恨水周嫂|自从|这|雄鸡|死后|,|她|就|撅|着|两片|嘴唇|,|头发|散|了|两仔|,|披到|布满|了|皱纹|的|脸|腮|上380
14Nghe bà Tập nói xong, đột nhiên vui vẻ lên, liền đưa tay sờ sờ phát ra trên mặt hướng về phía lỗ tai, tiến gần hai bước, cười nói: 听了奚太太这话,突然高兴起来,就伸手把脸上的散发摸着向耳朵上放着,近前两步,笑道:要得巴山夜雨张恨水听|了|奚|太太|这话|,|突然|高兴|起来|,|就|伸手|把|脸上|的|散发|摸|着|向|耳朵|上放|着|,|近前|两步|,|笑|道|:|要|得380
15Mấy bà vợ đó, ngày nào cũng đánh bài, mỗi lần rút tiền là được mấy chục đồng 那些太太们,天天打牌,一抽头钱,就好几十块巴山夜雨张恨水那些|太太|们|,|天天|打牌|,|一|抽头|钱|,|就|好几|几十|十块|好几十|几十块|好几十块380
16Nhà chúng ta mời bọn họ đến đánh một ván bài, nói là giết gà cho bọn họ ăn, bọn họ nhất định sẽ đánh thêm mấy đồng tiền 我们家里请她们来打一场牌,说是杀鸡给她们吃,她们一定会多打几个头钱巴山夜雨张恨水我们|家里|请|她们|来|打|一场|牌|,|说|是|杀鸡|给|她们|吃|,|她们|一定|会|多|打|几个|头钱380
17Vợ tôi mời khách, tôi cũng để lại vài đồng lẻ 太太请了客,我也落几个零钱用巴山夜雨张恨水太太|请|了|客|,|我|也|落|几个|零钱|用380
18Cần phải có 硬是要得巴山夜雨张恨水硬是|要|得380
19Bà Tịch nhìn cô như vậy, không nhịn được cười 奚太太看了她这样子,就禁不住要笑巴山夜雨张恨水奚|太太|看|了|她|这|样子|,|就|不住|禁不住|要|笑380
20Quot; Chuyện như vậy, ngươi so với ta thông minh hơn nhiều. quot; 因道:这样的事,你比我聪明得多巴山夜雨张恨水因道|:|这样|的|事|,|你|比|我|聪明|得|多380
21Tôi chỉ nói một nửa, bạn sẽ biết toàn cảnh 我只提到一半,你就晓得全局巴山夜雨张恨水我|只|提到|一半|,|你|就|晓得|全局380
22Đánh bài thì đừng nói trước 打牌的话,你先别提巴山夜雨张恨水打牌|的话|,|你|先|别提380
23Có thể đến chỗ bà Thạch xem 可以到石太太那里去看看巴山夜雨张恨水可以|到|石|太太|那里|去|看看380
24Nghe nói hôm nay là sinh nhật cô ấy 据说,今天是她的生日巴山夜雨张恨水据说|,|今天|是|她|的|生日380
25Nếu nàng nói mời ta đi ăn cơm, ngươi liền nói ta ngày mai mời nàng đi ăn sáng 她若说请我去吃饭,你就说我明天请她吃早饭巴山夜雨张恨水她|若|说|请|我|去|吃饭|,|你|就|说|我|明天|请|她|吃|早饭380
26Chúc mừng sinh nhật cô ấy 为她补祝生日巴山夜雨张恨水为|她|补祝|生日380
27Chu tẩu nói: Ăn điểm tâm, lang có thời gian 周嫂道:吃早饭,朗个来得及巴山夜雨张恨水周嫂|道|:|吃|早饭|,|朗个|来得|来得及380
28Bà Tập nói: "Con gà này của chúng ta, chiều nay phải hầm chín rồi." 奚太太道:我们这鸡,今天下午就得炖熟了巴山夜雨张恨水奚|太太|道|:|我们|这鸡|,|今天|天下|下午|今天下午|就|得|炖|熟|了380
29Thời tiết mát mẻ vào ban đêm 晚上天气凉快巴山夜雨张恨水晚上|天气|凉快380
30Chúng tôi sẽ đóng đá gà hầm trong nước lạnh, hoặc có thể để đến sáng mai 我们把炖鸡的瓦钵,用凉水冰着,或者还可以留到明天早上巴山夜雨张恨水我们|把|炖鸡|的|瓦|钵|,|用|凉水|冰着|,|或者|还|可以|留|到|明天|早上380
31Nếu mời các nàng ăn cơm trưa, nhất định phải đợi đến ngày mai hai ba giờ, thời tiết nóng bức, đội lên một con gà lớn, vậy thì hỏng rồi 若请她们吃午饭,一定要等到明日两三点钟,天气一热,顶好一只大鸡,那就馊了巴山夜雨张恨水若|请|她们|吃|午饭|,|一定|要|等到|明日|两|三点|点钟|三点钟|,|天气|一热|,|顶好|一只|大鸡|,|那|就|馊|了380
32Chu tẩu nói: Chính là mời người ta ăn một con gà chết công tử xúi giục 周嫂道:就是请人家吃一只死鸡公唆巴山夜雨张恨水周嫂|道|:|就是|请|人家|吃|一只|死|鸡公|唆380
33Bà Hà nói: tào lao 奚太太道:废话巴山夜雨张恨水奚|太太|道|:|废话380
34Cái gì có thể ăn sống 什么东西可以活的吃巴山夜雨张恨水什么|东西|可以|活|的|吃380
35Không phải đều là giết ăn sao? 不都是杀了吃吗巴山夜雨张恨水不|都|是|杀|了|吃|吗380
36Gà chết là gì? 什么叫死鸡呢巴山夜雨张恨水什么|叫|死鸡|呢380
37Trong nhà còn có thịt xông khói cá xông khói, lại chiên lên ba cái trứng gà, ngươi xem món ăn này còn không thể mời khách sao? 家里还有腊肉腊鱼,再煎上三个鸡蛋,你看这菜还不能请客吗巴山夜雨张恨水家里|还有|腊肉|腊鱼|,|再煎|上|三个|鸡蛋|,|你|看|这|菜|还|不能|请客|吗380
38Chu tẩu nói: Nói đến thịt khói, ta ngược lại nhớ tới một chuyện 周嫂道:说起了烟肉,我倒想起了一件事巴山夜雨张恨水周嫂|道|:|说起|了|烟肉|,|我|倒|想起|了|一件|事380
39Khi vợ tôi đem thịt khói và cá muối cúng Bồ Tát thì rơi xuống mương, tôi nhặt lên, đặt lên bàn bếp, chuẩn bị lấy nước rửa 太太把烟肉和咸鱼祭菩萨的时候,落到沟里去了,我捡起来,放到灶房里桌子上,预备拿水洗洗巴山夜雨张恨水太太|把|烟肉|和|咸鱼|祭|菩萨|的|时候|,|落到|沟里|去|了|,|我|捡起|起来|捡起来|,|放到|灶房|里|桌子|上|,|预备|拿水|洗洗380
40Mọi người cứu hỏa, ta liền.. Bà Tập hai tay vỗ một cái, nói: Khốn nạn 大家抢着救火,我就……奚太太两手一拍道:糟了巴山夜雨张恨水大家|抢|着|救火|,|我|就|…|…|奚|太太|两手|一拍|道|:|糟|了380
41Cửa nhà bếp mở rộng, chó và mèo đều có thể vào được 厨房门敞开的,野狗和猫都可以进去巴山夜雨张恨水厨房|房门|厨房门|敞开|的|,|野狗|和|猫|都|可以|进去380
42Nhanh lên! 巴山夜雨张恨水380
43Cô nói rồi chạy vào bếp 她说着,就向厨房里跑了去巴山夜雨张恨水她|说|着|,|就|向|厨房|里|跑|了|去380
44Cuối cùng cô cũng có tầm nhìn xa trông rộng: một con mèo hoa to, hai chân đè lên con cá muối, vươn cổ kêu răng rắc đang gặm nhai 总算她有先见之明:一只大花猫,两爪按住了那咸鱼,伸着脖子吱咯吱咯在啃嚼着巴山夜雨张恨水总算|她|有|先见|先见之明|:|一只|大|花猫|,|两爪|按住|了|那|咸鱼|,|伸着|脖子|吱|咯吱|咯|在|啃|嚼|着380
45Cô ấy hét lên 她大叫一声巴山夜雨张恨水她|大叫|一声380
46Con mèo lớn mang theo cá chạy ra khỏi cửa 大花猫衔着鱼一溜烟地夺门而出巴山夜雨张恨水大|花猫|衔|着|鱼|一溜|一溜烟|地|夺门|夺门而出380
47Bà Tập la lên: Cứu mạng, cứu mạng 奚太太喊道:救命哕,救命哕巴山夜雨张恨水奚|太太|喊道|:|救命|哕|,|救命|哕380
48Mấy tiếng cứu người này, đương nhiên làm cho hàng xóm đều kinh động 这几声救人,当然把邻居们都惊动了巴山夜雨张恨水这|几声|救人|,|当然|把|邻居|邻居们|都|惊动|了380
49Mọi người đều cho rằng đó là cỏ mọc trong khe núi, sống lại 大家都以为是那山沟里的长草,死灰复燃巴山夜雨张恨水大家|都|以为|是|那|山沟|里|的|长草|,|死灰|灰复|复燃|死灰复燃380

示例代码(Python 加载)

以下是一个基于GRU + Transformer 解码器的中越文深度学习翻译模型的代码博客。该模型使用GRU作为编码器,将中文句子转换为隐藏表示,再使用Transformer解码器逐步生成越南文翻译。此方法结合了循环神经网络(RNN)和自注意力机制,兼具Transformer的高效性和GRU的上下文理解能力,适合中越翻译任务。

环境准备

首先,确保安装了 TensorFlowPandas,用于深度学习模型构建和数据处理。

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')

# 提取中文和越南文文本
vietnamese_texts = data['越南文翻译'].values
chinese_texts = data['中文原句'].values

# 划分训练集和验证集
train_vietnamese, val_vietnamese, train_chinese, val_chinese = train_test_split(vietnamese_texts, chinese_texts, test_size=0.2, random_state=42)
分词和编码

为了让模型理解文本内容,需要将句子转化为整数序列。我们使用 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

# 构建中越文分词器
vietnamese_tokenizer = build_tokenizer(train_vietnamese)
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_vietnamese_seq = tokenize_texts(vietnamese_tokenizer, train_vietnamese)
val_vietnamese_seq = tokenize_texts(vietnamese_tokenizer, val_vietnamese)
train_chinese_seq = tokenize_texts(chinese_tokenizer, train_chinese)
val_chinese_seq = tokenize_texts(chinese_tokenizer, val_chinese)

# 设置词汇表大小和最大序列长度
vietnamese_vocab_size = len(vietnamese_tokenizer.word_index) + 1
chinese_vocab_size = len(chinese_tokenizer.word_index) + 1
max_seq_len = 50
模型构建:基于GRU编码器和Transformer解码器

使用GRU作为编码器,以捕获输入句子的上下文信息,并使用Transformer解码器逐步生成目标语言的翻译。

from tensorflow.keras.layers import Embedding, GRU, Dense, Input, MultiHeadAttention, LayerNormalization, Dropout
from tensorflow.keras.models import Model

# 定义GRU编码器
class Encoder(tf.keras.layers.Layer):
    def __init__(self, vocab_size, embedding_dim, enc_units):
        super(Encoder, self).__init__()
        self.embedding = Embedding(vocab_size, embedding_dim)
        self.gru = GRU(enc_units, return_sequences=True, return_state=True)

    def call(self, x):
        x = self.embedding(x)
        enc_output, enc_state = self.gru(x)
        return enc_output, enc_state

# 定义Transformer解码器
class Decoder(tf.keras.layers.Layer):
    def __init__(self, vocab_size, embedding_dim, dec_units, num_heads=4, dropout_rate=0.1):
        super(Decoder, self).__init__()
        self.embedding = Embedding(vocab_size, embedding_dim)
        self.multi_head_attention = MultiHeadAttention(num_heads=num_heads, key_dim=embedding_dim)
        self.dropout = Dropout(dropout_rate)
        self.layer_norm1 = LayerNormalization(epsilon=1e-6)
        self.layer_norm2 = LayerNormalization(epsilon=1e-6)
        self.gru = GRU(dec_units, return_sequences=True, return_state=True)
        self.dense = Dense(vocab_size)

    def call(self, x, enc_output, dec_state):
        x = self.embedding(x)
        
        # 使用多头注意力层,关注编码器的输出
        attn_output = self.multi_head_attention(query=x, value=enc_output, key=enc_output)
        attn_output = self.dropout(attn_output)
        out1 = self.layer_norm1(x + attn_output)  # 残差连接 + 归一化
        
        # 使用GRU进一步处理注意力输出
        gru_output, dec_state = self.gru(out1, initial_state=dec_state)
        gru_output = self.layer_norm2(gru_output + out1)  # 残差连接 + 归一化
        
        # 生成最终输出
        output = self.dense(gru_output)
        return output, dec_state

# 构建翻译模型
embedding_dim = 256
units = 512

encoder = Encoder(chinese_vocab_size, embedding_dim, units)
decoder = Decoder(vietnamese_vocab_size, embedding_dim, units)

# 定义优化器和损失函数
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 = encoder(inp)
        
        # 解码器初始输入
        dec_input = tf.expand_dims([vietnamese_tokenizer.word_index['<start>']] * inp.shape[0], 1)
        dec_hidden = enc_hidden

        # 逐步生成每个输出单词
        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_chinese_seq)
batch_size = 64
steps_per_epoch = BUFFER_SIZE // batch_size

train_dataset = tf.data.Dataset.from_tensor_slices((train_chinese_seq, train_vietnamese_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(chinese_tokenizer, [sentence], max_len=max_seq_len)
    enc_output, enc_hidden = encoder(sentence_seq)
    dec_input = tf.expand_dims([vietnamese_tokenizer.word_index['<start>']], 0)
    dec_hidden = enc_hidden

    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(vietnamese_tokenizer.index_word.get(predicted_id, '<unk>'))
        if vietnamese_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))
技术细节与实际应用
  1. 模型架构:编码器采用了GRU,通过其循环神经网络结构理解输入文本的序列信息,解码器结合Transformer注意力机制和GRU生成目标句子。
  2. 多头注意力:解码器利用多头注意力机制,从编码器的输出中提取关键信息,确保在翻译生成时捕获准确的上下文。
  3. 损失函数与掩码:损失函数使用了掩码操作,忽略填充标记的损失,确保训练过程中模型专注于真实句子内容。
  4. 训练与评估:逐词生成翻译输出,通过贪心搜索获得每一步最优预测,支持快速生成句子翻译。

通过以上步骤,你可以实现一个基于GRU和Transformer解码器的中越翻译模型,在实际应用中适用于多语言翻译任务和NLP研究。