当前位置:   article > 正文

Helsinki-NLP/opus-mt-en-zh 带占位符翻译_opus-mt-zh-en

opus-mt-zh-en

背景是再翻译一些格式化的文本时出现了问题:
比如说这段游戏里的文本:

Completing the construction requires a minimum cost of {GOLD} gold

其中,{GOLD}是一个游戏文本系统定义的占位符,表示货币数量,翻译成中文的正确结果应该是:

完成建筑需要至少{GOLD}黄金

但翻译的时候会变成:

完成建筑需要至少{黄金}黄金

所以研究了一下怎么把这种不该翻译的词屏蔽掉。

打开opus-mt-en-zh根目录,找到config.json:

  1. //吐槽:代码块居然不能选json,这不合理,xml都能选啊
  2. {
  3. "_name_or_path": "/tmp/Helsinki-NLP/opus-mt-zh-en",
  4. "activation_dropout": 0.0,
  5. "activation_function": "swish",
  6. "add_bias_logits": false,
  7. "add_final_layer_norm": false,
  8. "architectures": [
  9. "MarianMTModel"
  10. ],
  11. "attention_dropout": 0.0,
  12. "bad_words_ids": [
  13. [
  14. 65000
  15. ]
  16. ],
  17. "bos_token_id": 0,
  18. "classif_dropout": 0.0,
  19. "classifier_dropout": 0.0,
  20. "d_model": 512,
  21. "decoder_attention_heads": 8,
  22. "decoder_ffn_dim": 2048,
  23. "decoder_layerdrop": 0.0,
  24. "decoder_layers": 6,
  25. "decoder_start_token_id": 65000,
  26. "decoder_vocab_size": 65001,
  27. "dropout": 0.1,
  28. "encoder_attention_heads": 8,
  29. "encoder_ffn_dim": 2048,
  30. "encoder_layerdrop": 0.0,
  31. "encoder_layers": 6,
  32. "eos_token_id": 0,
  33. "extra_pos_embeddings": 65001,
  34. "forced_eos_token_id": 0,
  35. "id2label": {
  36. "0": "LABEL_0",
  37. "1": "LABEL_1",
  38. "2": "LABEL_2"
  39. },
  40. "init_std": 0.02,
  41. "is_encoder_decoder": true,
  42. "label2id": {
  43. "LABEL_0": 0,
  44. "LABEL_1": 1,
  45. "LABEL_2": 2
  46. },
  47. "max_length": 512,
  48. "max_position_embeddings": 512,
  49. "model_type": "marian",
  50. "normalize_before": false,
  51. "normalize_embedding": false,
  52. "num_beams": 6,
  53. "num_hidden_layers": 6,
  54. "pad_token_id": 65000,
  55. "scale_embedding": true,
  56. "share_encoder_decoder_embeddings": true,
  57. "static_position_embeddings": true,
  58. "transformers_version": "4.22.0.dev0",
  59. "use_cache": true,
  60. "vocab_size": 65001
  61. }

可以看到三个关键点:

bad_words_ids

id2label

label2id

实验发现如果把一个次添加为label,这个词就大概率会原封不动地返回来了。(我把三个地方都添加了,没有试过只添加一个会怎么样)

所以解决方案就有了:

因为我要做的是一个随时翻译的本地服务,所以我的考虑是最好不要每次都重新加载模型配置(我不确定重新创建pipeline的消耗,如果不大的话可以考虑动态加载config),所以我针对大括号括起来的这种占位符格式封了个替换方法,翻译前翻译后一共做两次替换。

大概逻辑是:

原文本:Completing the construction requires a minimum cost of {GOLD} gold

替换占位符:Completing the construction requires a minimum cost of LABEL_0 gold

翻译完成:完成建筑需要至少LABEL_0黄金

替换标签:完成建筑需要至少{GOLD}黄金

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/954383
推荐阅读
相关标签
  

闽ICP备14008679号