|
--- |
|
language: |
|
- zh |
|
license: apache-2.0 |
|
tags: |
|
- chinese poem |
|
- 中文 |
|
- 对联 |
|
widget: |
|
- text: "对联:北国风光,千里冰封,万里雪飘" |
|
--- |
|
|
|
# 一个好玩的中文AI对联模型 |
|
- 输入格式 |
|
- `对联:您的上联`,比如 `对联:北国风光,千里冰封,万里雪飘` |
|
- 如果你想尝试 |
|
- 如果自己有GPU环境,可以参考我放在huggingface的[示例代码](https://huggingface.co/hululuzhu/chinese-couplet-t5-mengzi-finetune#%E8%BF%90%E8%A1%8C%E4%BB%A3%E7%A0%81%E7%A4%BA%E4%BE%8B) |
|
- 或者使用Google colab可以用这个[简单的colab notebook](https://colab.research.google.com/github/hululuzhu/chinese-ai-writing-share/blob/main/inference/2022_simple_couplet_inference_huggingface.ipynb) |
|
- 训练代码请参考[我的github链接](https://github.com/hululuzhu/chinese-ai-writing-share) |
|
- 如果想了解一些背景和讨论,可以看我的[slides](https://github.com/hululuzhu/chinese-ai-writing-share/tree/main/slides) |
|
|
|
## 架构 |
|
- 预训练使用 [澜舟科技的孟子 T5](https://huggingface.co/Langboat/mengzi-t5-base) |
|
|
|
## 数据来源 |
|
- 对联数据集 https://github.com/wb14123/couplet-dataset |
|
- 标准输入输出seq2seq,T5使用`对联:`前缀,长度限制32字符 |
|
|
|
## 语言支持 |
|
- 默认简体中文 |
|
- 支持繁体中文,参考下面代码标记 `is_input_traditional_chinese=True` |
|
|
|
## 训练 |
|
- 我是用 Google Colab Pro(推荐,16G的GPU一个月才9.99!) |
|
|
|
## 运行代码示例 |
|
```python |
|
# 安装以下2个包方便文字处理和模型生成 |
|
# !pip install -q simplet5 |
|
# !pip install -q chinese-converter |
|
|
|
# 具体代码 |
|
import torch |
|
from simplet5 import SimpleT5 |
|
from transformers import T5Tokenizer, T5ForConditionalGeneration |
|
import chinese_converter |
|
|
|
MODEL_PATH = "hululuzhu/chinese-couplet-t5-mengzi-finetune" |
|
class PoemModel(SimpleT5): |
|
def __init__(self) -> None: |
|
super().__init__() |
|
self.device = torch.device("cuda") |
|
|
|
def load_my_model(self): |
|
self.tokenizer = T5Tokenizer.from_pretrained(MODEL_PATH) |
|
self.model = T5ForConditionalGeneration.from_pretrained(MODEL_PATH) |
|
|
|
COUPLET_PROMPOT = '对联:' |
|
MAX_SEQ_LEN = 32 |
|
MAX_OUT_TOKENS = MAX_SEQ_LEN |
|
|
|
def couplet(in_str, model=couplet_model, |
|
is_input_traditional_chinese=False, |
|
num_beams=2): |
|
model.model = model.model.to('cuda') |
|
in_request = f"{COUPLET_PROMPOT}{in_str[:MAX_SEQ_LEN]}" |
|
if is_input_traditional_chinese: |
|
# model only knows s chinese |
|
in_request = chinese_converter.to_simplified(in_request) |
|
# Note default sampling is turned off for consistent result |
|
out = model.predict(in_request, |
|
max_length=MAX_OUT_TOKENS, |
|
num_beams=num_beams)[0].replace(",", ",") |
|
if is_input_traditional_chinese: |
|
out = chinese_converter.to_traditional(out) |
|
print(f"上: {in_str}\n下: {out}") |
|
``` |
|
|
|
|
|
## 简体中文示例 |
|
```python |
|
for pre in ['欢天喜地度佳节', |
|
'不待鸣钟已汗颜,重来试手竟何艰', |
|
'当年欲跃龙门去,今日真披马革还', |
|
'北国风光,千里冰封,万里雪飘', |
|
'寂寞寒窗空守寡', |
|
'烟锁池塘柳', |
|
'五科五状元,金木水火土', |
|
'望江楼,望江流,望江楼上望江流,江楼千古,江流千古']: |
|
couplet(pre) |
|
|
|
上: 欢天喜地度佳节 |
|
下: 笑语欢歌迎新春 |
|
上: 不待鸣钟已汗颜,重来试手竟何艰 |
|
下: 何堪击鼓频催泪?一别伤心更枉然 |
|
上: 当年欲跃龙门去,今日真披马革还 |
|
下: 此日当登虎榜来,他年又见龙图新 |
|
上: 北国风光,千里冰封,万里雪飘 |
|
下: 南疆气象,五湖浪涌,三江潮来 |
|
上: 寂寞寒窗空守寡 |
|
下: 逍遥野渡醉吟诗 |
|
上: 烟锁池塘柳 |
|
下: 云封岭上松 |
|
上: 五科五状元,金木水火土 |
|
下: 三才三进士,诗书礼乐诗 |
|
上: 望江楼,望江流,望江楼上望江流,江楼千古,江流千古 |
|
下: 听雨阁,听雨落,听雨阁中听雨落,雨阁万重,雨落万重 |
|
``` |
|
|
|
# 繁体中文 |
|
```python |
|
for pre in ['飛龍在天', '臺北風光好']: |
|
couplet(pre, is_input_traditional_chinese=True, num_beams=10) |
|
|
|
上: 飛龍在天 |
|
下: 飛鳳於天 |
|
上: 臺北風光好 |
|
下: 神州氣象新 |
|
``` |