使用Deepset Haystack生成西里尔语文本问答时遇词汇截断问题
俄语文本问答生成出现俄英混合、词汇截断问题的解决思路
问题背景
使用Deepset Haystack处理俄语文本时,生成的问答出现词汇截断、音节混乱,且问题部分呈现俄语音节与英文词汇混合的异常情况。基于俄语SberQUAD数据集训练cointegrated/rubert-tiny模型后,针对普希金《鲁斯兰与柳德米拉》生成的问答答案基本正常,但问题部分存在严重的语言混合和乱码问题。
复现代码
converter = TextConverter(remove_numeric_tables=False, valid_languages=["ru"]) doc = converter.convert(file_path='pushkins.txt', meta=None)[0] preprocessor = PreProcessor( clean_empty_lines=True, clean_whitespace=True, clean_header_footer=False, split_by="word", split_length=100, split_respect_sentence_boundary=True, ) docs_default = preprocessor.process([doc]) document_store.write_documents(docs_default) question_generator = QuestionGenerator() reader = FARMReader(model_name_or_path='cointegrated/rubert-tiny', use_gpu=True) reader.train(data_dir=data_dir, train_filename="train-v1.1.json", dev_filename="dev-v1.1.json", use_gpu=True, batch_size=16, n_epochs=1, save_dir=data_dir) qag_pipeline = QuestionAnswerGenerationPipeline(question_generator, reader) output_data = [] for idx, document in enumerate(tqdm(document_store)): print(f"\n * Generating questions and answers for document {idx}: {document.content[:100]}...\n") result = qag_pipeline.run(documents=[document]) output_data.append(result) print_questions(result) print("---")
错误输出示例
Generated pairs: - Q: What is какат а доер мое? A: свои A: дети A: согласен Скакать за дочерь - Q: What удет не нарасен? A: подвиг A: моих A: княжной - Q: What was орестн ени? A: княжной A: княжной A: полцарством - Q: What did оскликнули свои седлаем? A: Сейчас коней A: жены A: «Я!» — молвил горестный жених. «Я! я!» — воскликнули с Рогдаем Фарла - Q: рад вес иедит мир. A: «Сейчас коней своих седлаем; Мы рады A: ъ A: лцарством прадедов моих
解决方案
- 替换默认英文问题生成器:Haystack默认的
QuestionGenerator基于英文模型训练,会强制生成英文前缀(如What is/was/did),直接导致俄英混合。需使用适配俄语的模型初始化生成器:question_generator = QuestionGenerator(model_name_or_path="cointegrated/rubert-tiny", use_gpu=True) - 优化文本预处理逻辑:原
split_by="word"结合split_length=100可能拆分俄语词汇,导致音节混乱。建议改为按句子分割,降低词汇被截断的概率:preprocessor = PreProcessor( clean_empty_lines=True, clean_whitespace=True, clean_header_footer=False, split_by="sentence", split_length=10, split_respect_sentence_boundary=True, ) - 强化模型训练:仅训练1轮不足以让模型充分拟合俄语问答任务,将
n_epochs调整为3-5,同时确认SberQUAD数据集格式完全符合Haystack的训练要求,避免数据格式不兼容导致的输出异常。 - 确保文本编码正确:检查
pushkins.txt是否采用UTF-8编码,避免读取时出现字符乱码或截断,导致模型输入异常。
内容的提问来源于stack exchange,提问作者user164863
相关产品推荐
相关产品推荐

