diff --git a/examples/ngram_lm/.gitignore b/examples/ngram_lm/.gitignore
new file mode 100644
index 000000000..fd7c578e1
--- /dev/null
+++ b/examples/ngram_lm/.gitignore
@@ -0,0 +1 @@
+exp/
diff --git a/examples/ngram_lm/data/README.md b/examples/ngram_lm/data/README.md
new file mode 100644
index 000000000..514f17b60
--- /dev/null
+++ b/examples/ngram_lm/data/README.md
@@ -0,0 +1,2 @@
+text_correct.txt: https://github.com/shibing624/pycorrector/raw/master/tests/test_file.txt
+custom_confusion.txt: https://github.com/shibing624/pycorrector/raw/master/tests/custom_confusion.txt
diff --git a/examples/ngram_lm/data/custom_confusion.txt b/examples/ngram_lm/data/custom_confusion.txt
new file mode 100644
index 000000000..aecabf6aa
--- /dev/null
+++ b/examples/ngram_lm/data/custom_confusion.txt
@@ -0,0 +1,1371 @@
+#变体 本体 本体词词频(可省略)
+兴高彩列 兴高采烈 100
+吹唐人 吹糖人 100
+百年家具 百年家居
+泄药 泻药
+称做 称作 100
+化学成份 化学成分 100
+天地无垠 天地无限 100
+欲妄 欲望
+满头大汉 满头大汗
+一阙 一阕 300
+斗音 抖音 100
+人材 人才 100
+微亅信 微信 100
+微·信 微信 1000
+一毛不陪 一毛不赔 200
+无线大 无限大 1
+正加 增加
+相对得 相对地
+越来越底 越来越低
+个纾 个数
+曾加 增加
+情怳 情况
+持续的 持续地
+不断的 不断地
+成现 呈现
+家重 加重
+中国子 中国字
+计录 记录
+一落千仗 一落千丈
+婴而 婴儿
+负贵 富贵
+旁遍 旁边
+续承 继承
+约来越晚 越来越晚
+提共 提供
+行成 形成
+读哩 独立
+忙绿 忙碌
+年经人 年轻人
+智识 知识
+一但 一旦
+指摘 指责
+懹人民自己选择 让人民自己选择
+紧裤 辛苦
+放心地生活 放心的生活
+但靠一份收入 单靠一份收入
+多付出地几十倍 多付出的几十倍
+化钱 花钱
+依些 一些
+耐心的教育 耐心地教育
+多某些人来说 对某些人来说
+列子 例子
+普便 普遍
+单纯的说 单纯地说
+相对得坏处 相对的坏处
+改很多幼稚园 盖很多幼稚园
+不断的增加 不断地增加
+谈讨 探讨
+小还 小孩
+未普边 未普遍
+考良 考量
+过的不错 过得不错
+手医学治疗 受医学治疗
+数为至少四个人 数位至少四个人
+小子化 少子化
+间直 简直
+每办法 没办法
+青跨 情况
+最总 最终
+僱佣 僱用
+渐渐的形成 渐渐地形成
+渐渐的增加 渐渐地增加
+不断的改变 不断地改变
+不断的提高 不断地提高
+莫些年 某些年
+成工 成功
+线然 显然
+一长争段 一长争短
+在加上 再加上
+一后 以后
+自起 自己
+年轻得夫妇 年轻的夫妇
+真的事对 真的是对
+养小还 养小孩
+不彷 不妨
+疏缓 舒缓
+上叙 上述
+或着市 或者是
+学习地意愿 学习的意愿
+按部就班 按步就班
+全面的规划 全面地规划
+纾缓 舒缓
+年少气胜 年少气盛
+新家坡 新加坡
+变的很轻松 变得很轻松
+我门 我们
+月来越好 越来越好
+发生国 发生过
+以开发国家 已开发国家
+以开发 已开发
+赛翁失马 塞翁失马
+非常的宝贵 非常地宝贵
+列如 例如
+非常的珍贵 非常地珍贵
+二零五龄年 二零五零年
+証明 证明
+一间一间的关必 一间一间地关闭
+缠能收割 才能收割
+朗朗称道 琅琅称道
+缠能拯救 才能拯救
+付其责 负其责
+还而 孩儿
+自然而然的 自然而然地
+现再 现在
+一间一间的在建造 一间一间地在建造
+惰胎 堕胎
+给与 给予
+少字化 少子化
+狂大 广大
+至到 直到
+作些政策 做些政策
+想望 向往
+低免 抵免
+展生 产生
+源料 原料
+好好的准备 好好地准备
+庄况 状况
+因发 引发
+自记 自己
+桃论 讨论
+负单 负担
+而以 而已
+政符 政府
+邀情 邀请
+郑加 增加
+全心全力的 全心全力地
+进一份力 尽一份力
+不断的努力 不断地努力
+厉害关系 利害关系
+相像 现象
+题及 提及
+剥歇 剥削
+下起 下去
+了所学校 各所学校
+很好得一份工作 很好的一份工作
+来的这么快 来得这么快
+言前 眼前
+所担任的是有限 所担任的事有限
+放面 方面
+办发 办法
+有趣的说到 有趣地说到
+坚帧不移 坚贞不移
+心力绞碎 心力交瘁
+开发看经济 开发和经济
+有效的规划 有效地规划
+流守 留守
+生济 生计
+带欠缺 但欠缺
+堆动 推动
+表达的是 表达的事
+所以问题 所有问题
+由其固定的速度 有其固定的速度
+乐与减少 乐于减少
+变的困难 变得困难
+多馀 多于
+长远的看 长远地看
+血浓与水 血浓于水
+表面的看 表面地看
+推称出新 推陈出新
+脱离萍 脱离贫
+时间一天一天的过去 时间一天一天地过去
+提昌 提倡
+续多 许多
+现进 先进
+销费率 消费率
+直接的被感受 直接地被感受
+陪养 培养
+主在乡下 住在乡下
+弄多的很快 弄多得很快
+他门 他们
+持续的下降 持续地下降
+相对的减少 相对地减少
+相对的提高 相对地提高
+适当的生育 适当地生育
+成功的制定 成功地制定
+青少年门 青少年们
+慎重的希望 慎重地希望
+娇傲 骄傲
+亲爱的少年门 亲爱的少年们
+少子华 少子化
+生上 身上
+不断的鼓励 不断地鼓励
+具造 制造
+单初 当初
+发掌 发展
+大幅度的提升 大幅度地提升
+负担地因素 负担的因素
+亘多医疗费用 更多医疗费用
+餵了 为了
+照成 造成
+教育基精 教育基金
+装造性 创造性
+观察关 观察官
+怎么形成地 怎么形成的
+比年长者来的多 比年长者来得多
+不单 不但
+变的更良好 变得更良好
+变的更大 变得更大
+壤大众理解 让大众理解
+上免得分析 上面的分析
+已经再发生了 已经在发生了
+带来得危机 带来的危机
+恶讯循环 恶性循环
+他得生活费 他的生活费
+以开发地区 已开发地区
+长其 长期
+经额 金额
+在过几十年 再过几十年
+作为探讨 做为探讨
+系根据 是根据
+位于 为于
+份公司 分公司
+要作塑胶袋 要做塑胶袋
+还不过 还不够
+逃战 挑战
+再服务业 在服务业
+招莫 招募
+坐者 坐着
+仔细的观察 仔细地观察
+三个凑皮匠 三个臭皮匠
+个中各样 各种各样
+不啻 不是
+即史 即使
+岂有此里 岂有此理
+组宠物的人 租宠物的人
+浅溥 浅薄
+处里 处理
+他们得不负责任的态度 他们的不负责任的态度
+出租得事 出租的事
+这样以来 这样一来
+题高 提高
+厌力 压力
+事情阿 事情啊
+又意思 有意思
+建慷 健康
+真恭喜妳阿 真恭喜妳啊
+抱见阿 抱歉啊
+幸苦 辛苦
+参家 参加
+回来台湾 会来台湾
+生体 身体
+总视 总是
+一把很大的化 一把很大的花
+出你 祝你
+高心 高兴
+应为 因为
+洗碗 希望
+那理 那里
+根她坐公共汽车 跟她坐公共汽车
+公克 功课
+根林美美去 跟林美美去
+一前 以前
+傍边 旁边
+总明 聪明
+最难得课 最难的课
+在马上去 再马上去
+建在 现在
+事等我女朋友的 是等我女朋友的
+客爱 可爱
+象片 相片
+也雪 也许
+录的 绿的
+纲来 刚来
+让后 然后
+真得是坏人 真的是坏人
+提以 提议
+大的家 他的家
+从是 总是
+有处 有趣
+课目 科目
+看得是美国电影 看的是美国电影
+兴奋得 兴奋地
+控的时间 空的时间
+内容懂不清楚 内容都不清楚
+谊起 一起
+打公车 搭公车
+近去 进去
+林美妹 林美美
+唷意思 有意思
+蔘加 参加
+再开一个好把 再开一个好吧
+兴起不好 心情不好
+庆祝地会 庆祝的会
+漂漂亮亮地风景 漂漂亮亮的风景
+再庆祝一次把 再庆祝一次吧
+找的时间 找个时间
+间妈妈 见妈妈
+无会 舞会
+解我的朋友 请我的朋友
+日字 日子
+但然 当然
+障爱文 张爱文
+已定 一定
+澳是 要是
+长爱文 张爱文
+理物 礼物
+延后 然后
+合问她 和问她
+恨高兴 很高兴
+一让 一样
+帮别的学生的芒 帮别的学生的忙
+沾着 站着
+怒朋友 女朋友
+下明 小明
+老师文学生 老师问学生
+他清她吃饭 他请她吃饭
+还没作 还没做
+座公车 坐公车
+打篹 打算
+沾起来 站起来
+再起床呢 在起床呢
+再黑板写的东西 在黑板写的东西
+不输服 不舒服
+很哩 很累
+警张 紧张
+劳天 聊天
+很来 很累
+多要 都要
+奴朋友 女朋友
+高兴的不得了 高兴得不得了
+里学校很近 离学校很近
+音龠 音乐
+合唱父系语法 和常复习语法
+税觉 睡觉
+觉得贰 觉得饿
+对不气 对不起
+情你去吃饭 请你去吃饭
+不局道 不知道
+你好马 你好吗
+岑么样 怎么样
+可以马 可以吗
+我想情你 我想请你
+火者站 火车站
+聊体 聊天
+最前的子 最前的字
+座捷运 坐捷运
+哪哩 哪里
+十只路口 十字路口
+不智道 不知道
+怎门办 怎么办
+点视机 电视机
+已后 以后
+妳会时后 妳回时候
+漂凉 漂亮
+票凉 漂亮
+又漂亮的衣服 有漂亮的衣服
+清卖给我 请买给我
+红虹 红红
+待你的国家 到你的国家
+太样兵 太阳饼
+不拘导 不知道
+不咀导 不知道
+这哩 这里
+成市 城市
+发山 爬山
+风镜 风景
+他杏林 他姓林
+痕累 很累
+方假 放假
+风京 风景
+座火车 坐火车
+他的华 他的话
+户然 忽然
+理面 里面
+做回去 坐回去
+出们 出门
+愿赖 原来
+吧手 把手
+厅路上 听路上
+定车 停车
+高现 高兴
+排照 拍照
+他的婉 他的腕
+原意 愿意
+没人琣他 没人陪他
+歹去 带去
+自即 自己
+开是 开始
+和一点饮料 喝一点饮料
+录行 旅行
+谈着谈者 谈着谈着
+漂亮的术 漂亮的树
+戴我 载我
+作天 昨天
+很日 很热
+照篇 照片
+我借你们 我接你们
+握着我的朋友 我找我的朋友
+台配种战 台北总站
+来我的家完 来我的家玩
+营为 因为
+她门 她们
+些日会 生日会
+右遍 右边
+开时 开始
+做八八的公车 坐八八的公车
+对们 对门
+学玩了 学完了
+票漂亮亮 漂漂亮亮
+喜暗 喜欢
+括大风 刮大风
+批具 啤酒
+骠了 漂亮
+瞅天 秋天
+难德 南德
+不太施 不太湿
+冬天件 冬天间
+愁天 秋天
+塞太阳 晒太阳
+跟美 很美
+单让 当然
+感在 改在
+有孔 有空
+吃葚么 吃什么
+西欢 喜欢
+泰泰 太太
+词反 吃饭
+其末考 期末考
+台湾采 台湾菜
+他们的采 他们的菜
+设么 什么
+共喜 恭喜
+日本蔡 日本菜
+餐订 餐厅
+公课 功课
+大们口 大门口
+有没有控 有没有空
+刘信 留信
+六根礼拜日 六跟礼拜日
+永敢 勇敢
+辛亏 幸亏
+估停站 古亭站
+异子 椅子
+胡涂 糊涂
+真巧呕 真巧喔
+奴生 女生
+好朋有 好朋友
+莫斯汉堡 摩斯汉堡
+不可望 不可忘
+中文壳 中文课
+棒他 帮他
+怎嚜走 怎么走
+吃凉 吃惊
+冈来 刚来
+勇敢得 勇敢地
+风友 朋友
+走天 昨天
+湖涂 糊涂
+怎嚜 怎么
+真得 值得
+哪理 哪里
+票亮 漂亮
+又高又受 又高又瘦
+化了半个小时 花了半个小时
+杆快 赶快
+学习的很愉快 学习得很愉快
+怎吗 怎么
+十子路口 十字路口
+开方 开放
+息缓 喜欢
+交相机 照相机
+请办我 请帮我
+爬上 爬山
+录色 绿色
+各我妈妈 给我妈妈
+交马上停车 叫马上停车
+米了 迷了
+交到了 就到了
+号吗 号码
+很葬 很脏
+换给 还给
+清流 请留
+名子 名字
+把输给弄丢 把书给弄丢
+播爱 博爱
+大搂 大楼
+逃论室 讨论室
+坻里 地理
+奇给我 寄给我
+座飞机 坐飞机
+再机场 在机场
+便很帅 变很帅
+腾她 等她
+路行 旅行
+梅天 每天
+她九打电话 她就打电话
+美邦法 没办法
+不好以时 不好意思
+有疑点藤 有一点疼
+里拜四 礼拜四
+李佬时 李老师
+工课 功课
+身提 身体
+可使 可是
+靠事 考试
+重要得东西 重要的东西
+寮解 了解
+情你 请你
+而截 而且
+昭显机 照相机
+够猫 狗猫
+最有名的采 最有名的菜
+波澜 波兰
+西办加话 西班牙话
+东四 东西
+台弯 台湾
+学子 学字
+银董 运动
+而接 而且
+有控 有空
+陆行 旅行
+忍识 认识
+式式看 试试看
+拨兰 波兰
+一支狗 一只狗
+管哩 管理
+将学金 奖学金
+再波兰 在波兰
+下了可 下了课
+回越南得时候 回越南的时候
+台湾得风景 台湾的风景
+朋有 朋友
+气个月 七个月
+从德国莱 从德国来
+文花 文化
+吃部下 吃不下
+清假 请假
+烤试 考试
+血绿 血缘
+我票告诉您 我要告诉您
+候天 后天
+惜来看 借来看
+上果 上课
+吗吗 妈妈
+师什么公车 是什么公车
+岗来 刚来
+挑了 跳了
+座716号的公车 坐716号的公车
+三十分锺 三十分钟
+七点锺 七点钟
+公车佔 公车站
+邓的时候 等的时候
+依服 衣服
+睡过偷 睡过头
+佑对 有对
+乎很大的吸 呼很大的吸
+一整天水乐 一整天睡了
+等以等 等一等
+只有妳 只有你
+可况 何况
+学姣 学校
+跳无 跳舞
+恨情张 很紧张
+恨票亮 很漂亮
+俩个 两个
+悾怕 恐怕
+北老师骂他 怕老师骂他
+十五分种 十五分钟
+必较多 比较多
+睡过头把 睡过头吧
+我要座得巴士 我要坐的巴士
+来不起 来不及
+才陪吵醒 才被吵醒
+撘公车 搭公车
+眼靓 眼睛
+台我无聊 太过无聊
+大明哏他朋友 大明跟他朋友
+跳五 跳舞
+30份钟 30分钟
+座呢个公车 坐那个公车
+热恼 热闹
+手摽 手表
+苏嘉 暑假
+不好亿思 不好意思
+怎么杨 怎么样
+妳怎么了 你怎么了
+没有控 没有空
+根冒 感冒
+卧是李 我是李
+即然 既然
+台杯 台北
+里拜 礼拜
+希冠 希望
+开兴 开心
+烤师 考试
+热心的不得了 热心得不得了
+结昏 结婚
+边请卡 邀请卡
+注在 住在
+密鲁 秘鲁
+过的很开心 过得很开心
+寰麟 婚礼
+我回想妳们 我会想你们
+绍待卡 招待卡
+妳们 你们
+幸福快乐的过 幸福快乐地过
+公司排我 公司派我
+常不一样 穿不一样
+做二九七的公车 坐二九七的公车
+几希 继续
+今天得计画 今天的计画
+开心得 开心地
+钟就 终究
+共车 公车
+兔然 突然
+林雨 淋雨
+做公车 坐公车
+好好地经验 好好的经验
+涂然 突然
+讨润以下 讨论一下
+去万 去玩
+高兴得 高兴地
+考食物 烤食物
+在考 在烤
+美里 美丽
+交他的朋友 教他的朋友
+休葸 休息
+拟越来越漂亮 妳越来越漂亮
+对阿 对啊
+一扁吃 一边吃
+高高兴兴的 高高兴兴地
+修系 休息
+搜已 所以
+早藏 早上
+玩的横高兴 玩得很高兴
+做神马 做什么
+努生 女生
+高行 高兴
+一点鹅 一点饿
+点蔡 点菜
+交弮 交卷
+贵定 规定
+公作 工作
+炽爱 挚爱
+系望 希望
+你道德地旁 你到的地方
+除去完 出去玩
+里拜天 礼拜天
+暱友打算 你有打算
+新家波 新加坡
+考利以下 考虑一下
+一起去把 一起去吧
+寄怪 奇怪
+休息一点 休息一天
+我要会我的国家 我要回我的国家
+四班牙 西班牙
+完五月 玩五月
+踏青我们 他请我们
+是天两夜 四天两夜
+忆起去 一起去
+好久没间 好久没见
+放便 方便
+玩着玩者 玩着玩着
+裁板 裁判
+清等我 请等我
+座一下 坐一下
+请座 请坐
+板球 棒球
+测天 这天
+馔衣服 穿衣服
+情坐 请坐
+经张 紧张
+辕动比赛 运动比赛
+埤酒 啤酒
+看般球 看棒球
+餲得不得了 渴得不得了
+絣干 饼干
+形像代言人 形象代言人
+化夏子孙 华夏子孙
+华为泡影 化为泡影
+秘密歪斜 秘密外泄
+计画 计划
+忠于等到了 终于等到了
+未日来临 末日来临
+眼晴 眼睛
+游刀有余 游刃有余
+唐僧帅徒 唐僧师徒
+太概 大概
+一揽子货币 一篮子货币
+举足无措 手足无措
+凭藉 凭借
+令人發指 令人髮指
+绅仕 绅士
+粘豆包 黏豆包
+磬竹难书 罄竹难书
+严惩不怠 严惩不贷
+戮力同心 勠力同心
+罚角球 发角球
+综合症 综合征
+单独二胎 单独二孩
+蛰人 蜇人
+泄秘 泄密
+伏法 服法
+羊羯子 羊蝎子
+泻湖 潟湖
+家俱 家具
+精萃 精粹
+兴亡周期率 兴亡周期律
+震憾 震撼
+中华人名共和国 中华人民共和国
+大人常委会 人大常委会
+中国共产常 中国共产党
+科学发展现 科学发展观
+扶贪 扶贫
+严谨公款吃喝 严禁公款吃喝
+按纳 按捺
+案语 按语
+百废具兴 百废俱兴
+百页窗 百叶窗
+班白 斑白
+颁白 斑白
+班驳 斑驳
+胞子 孢子
+保镳 保镖
+保母 保姆
+褓姆 保姆
+辈份 辈分
+本份 本分
+笔划 笔画
+必恭必敬 毕恭毕敬
+编者案 编者按
+萹豆 扁豆
+稨豆 扁豆
+藊豆 扁豆
+标识 标志
+鬓脚 鬓角
+禀承 秉承
+补靪 补丁
+补钉 补丁
+参预 参与
+惨澹 惨淡
+差迟 差池
+搀和 掺和
+搀假 掺假
+搀杂 掺杂
+刬除 铲除
+倘佯 徜徉
+车箱 车厢
+澈底 彻底
+沈思 沉思
+趁心 称心
+成份 成分
+澄彻 澄澈
+侈糜 侈靡
+筹画 筹划
+筹马 筹码
+踌蹰 踌躇
+出谋画策 出谋划策
+喘嘘嘘 喘吁吁
+磁器 瓷器
+赐与 赐予
+粗卤 粗鲁
+搭当 搭档
+搭挡 搭档
+搭赸 搭讪
+答讪 搭讪
+答覆 答复
+带孝 戴孝
+耽心 担心
+耽忧 担忧
+担搁 耽搁
+澹泊 淡泊
+澹然 淡然
+倒楣 倒霉
+低徊 低回
+雕敝 凋敝
+雕弊 凋敝
+雕零 凋零
+雕落 凋落
+雕谢 凋谢
+跌荡 跌宕
+跌交 跌跤
+蹀血 喋血
+丁宁 叮咛
+定单 订单
+定户 订户
+定婚 订婚
+定货 订货
+定阅 订阅
+枓拱 斗拱
+枓栱 斗拱
+逗遛 逗留
+斗趣儿 逗趣儿
+独脚戏 独角戏
+端五 端午
+二簧 二黄
+贰心 二心
+发人深醒 发人深省
+蕃衍 繁衍
+分付 吩咐
+份量 分量
+份内 分内
+份外 分外
+忿忿 愤愤
+丰富多采 丰富多彩
+疯瘫 风瘫
+疯颠 疯癫
+疯疯颠颠 疯疯癫癫
+锋铓 锋芒
+伏侍 服侍
+服事 服侍
+伏输 服输
+伏罪 服罪
+负嵎顽抗 负隅顽抗
+傅会 附会
+覆信 复信
+复辙 覆辙
+干与 干预
+告戒 告诫
+梗直 耿直
+鲠直 耿直
+恭惟 恭维
+勾划 勾画
+勾联 勾连
+孤苦零丁 孤苦伶仃
+孤负 辜负
+骨董 古董
+股分 股份
+骨瘦如豺 骨瘦如柴
+关连 关联
+光采 光彩
+归根结柢 归根结底
+规戒 规诫
+鬼哭狼嗥 鬼哭狼嚎
+过份 过分
+虾蟆 蛤蟆
+含胡 含糊
+涵蓄 含蓄
+寒伧 寒碜
+喝采 喝彩
+喝倒采 喝倒彩
+哄动 轰动
+宏扬 弘扬
+红通通 红彤彤
+弘论 宏论
+弘图 宏图
+鸿图 宏图
+弘愿 宏愿
+弘旨 宏旨
+鸿福 洪福
+胡臭 狐臭
+胡蝶 蝴蝶
+胡涂 糊涂
+虎魄 琥珀
+花着 花招
+豁拳 划拳
+搳拳 划拳
+恍忽 恍惚
+晖映 辉映
+混水摸鱼 浑水摸鱼
+火伴 伙伴
+机伶 机灵
+激忿 激愤
+计画 计划
+记念 纪念
+寄与 寄予
+茄克 夹克
+佳宾 嘉宾
+驾御 驾驭
+架式 架势
+嫁装 嫁妆
+简炼 简练
+骄奢淫佚 骄奢淫逸
+脚门 角门
+狡滑 狡猾
+脚根 脚跟
+叫化子 叫花子
+精采 精彩
+鸠合 纠合
+鸠集 纠集
+脚色 角色
+刻期 克期
+刻日 克日
+刻划 刻画
+阔老 阔佬
+蓝缕 褴褛
+烂缦 烂漫
+烂熳 烂漫
+狼籍 狼藉
+狼头 榔头
+累坠 累赘
+黎黑 黧黑
+联贯 连贯
+联接 连接
+联绵 连绵
+联缀 连缀
+连袂 联袂
+连翩 联翩
+踉蹡 踉跄
+嘹喨 嘹亮
+撩乱 缭乱
+零丁 伶仃
+囹圉 囹圄
+蹓跶 溜达
+留连 流连
+喽罗 喽啰
+卤莽 鲁莽
+录象 录像
+录相 录像
+落腮胡子 络腮胡子
+落漠 落寞
+落莫 落寞
+痲痹 麻痹
+痲风 麻风
+痲疹 麻疹
+蚂蜂 马蜂
+马糊 马虎
+门坎 门槛
+糜费 靡费
+绵联 绵连
+摹仿 模仿
+模胡 模糊
+摹拟 模拟
+模写 摹写
+磨擦 摩擦
+磨拳擦掌 摩拳擦掌
+魔难 磨难
+眽眽 脉脉
+谋画 谋划
+那末 那么
+内哄 内讧
+凝炼 凝练
+牛崽裤 牛仔裤
+钮扣 纽扣
+掱手 扒手
+蟠根错节 盘根错节
+盘据 盘踞
+蟠踞 盘踞
+蟠据 盘踞
+蟠曲 盘曲
+盘陁 盘陀
+盘石 磐石
+蟠石 磐石
+盘跚 蹒跚
+旁皇 彷徨
+披星带月 披星戴月
+疲塌 疲沓
+飘泊 漂泊
+飘流 漂流
+漂零 飘零
+飘飖 飘摇
+平空 凭空
+牵联 牵连
+蕉萃 憔悴
+清彻 清澈
+情素 情愫
+惓惓 拳拳
+劝戒 劝诫
+热呼呼 热乎乎
+热呼 热乎
+热中 热衷
+人材 人才
+日蚀 日食
+入坐 入座
+色采 色彩
+杀一警百 杀一儆百
+沙鱼 鲨鱼
+山查 山楂
+舢舨 舢板
+梢公 艄公
+奢糜 奢靡
+伸雪 申雪
+神彩 神采
+湿渌渌 湿漉漉
+十锦 什锦
+收伏 收服
+首坐 首座
+书柬 书简
+思惟 思维
+死心踏地 死心塌地
+塌实 踏实
+菾菜 甜菜
+挺而走险 铤而走险
+透澈 透彻
+图象 图像
+推委 推诿
+玩艺儿 玩意儿
+委过 诿过
+污七八糟 乌七八糟
+无动于中 无动于衷
+无宁 毋宁
+无庸 毋庸
+五采缤纷 五彩缤纷
+五痨七伤 五劳七伤
+瘜肉 息肉
+希罕 稀罕
+希奇 稀奇
+希少 稀少
+希世 稀世
+希有 稀有
+噏动 翕动
+洗炼 洗练
+贤慧 贤惠
+香纯 香醇
+香菰 香菇
+像貌 相貌
+萧洒 潇洒
+小题大作 小题大做
+卸傤 卸载
+信口开合 信口开河
+惺松 惺忪
+秀外惠中 秀外慧中
+叙文 序文
+叙言 序言
+训戒 训诫
+压伏 压服
+压韵 押韵
+雅片 鸦片
+洋琴 扬琴
+要末 要么
+夜消 夜宵
+一槌定音 一锤定音
+一古脑儿 一股脑儿
+衣衿 衣襟
+衣著 衣着
+义无返顾 义无反顾
+霪雨 淫雨
+赢余 盈余
+影象 影像
+余辉 余晖
+鱼具 渔具
+鱼网 渔网
+预会 与会
+预闻 与闻
+御手 驭手
+豫备 预备
+元来 原来
+元煤 原煤
+源源本本 原原本本
+元元本本 原原本本
+原故 缘故
+原由 缘由
+月蚀 月食
+月芽 月牙
+云豆 芸豆
+杂遝 杂沓
+再接再砺 再接再厉
+斩新 崭新
+展转 辗转
+颤栗 战栗
+帐本 账本
+折衷 折中
+这末 这么
+正经八摆 正经八百
+脂麻 芝麻
+支解 肢解
+枝解 肢解
+直捷了当 直截了当
+直接了当 直截了当
+指手划脚 指手画脚
+赒济 周济
+转游 转悠
+装璜 装潢
+姿式 姿势
+子细 仔细
+自各儿 自个儿
+左证 佐证
+安份守己 安分守己
+暗度陈仓 暗渡陈仓
+把势 把式
+班配 般配
+棒锤 棒槌
+棒棰 棒槌
+暴光 曝光
+报导 报道
+悲忿 悲愤
+背理 悖理
+比画 比划
+笔心 笔芯
+荜路蓝缕 筚路蓝缕
+辨白 辩白
+辩辞 辩词
+波浪鼓 拨浪鼓
+泼浪鼓 拨浪鼓
+部份 部分
+菜子 菜籽
+仓惶 仓皇
+仓黄 仓皇
+仓遑 仓皇
+策画 策划
+常年累月 长年累月
+唱工 唱功
+潮呼呼 潮乎乎
+潮忽忽 潮乎乎
+撤消 撤销
+承上起下 承上启下
+吃里扒外 吃里爬外
+踟躇 踟蹰
+串连 串联
+辞汇 词汇
+词令 辞令
+搭拉 耷拉
+答理 搭理
+哒哒 嗒嗒
+搭裢 褡裢
+搭连 褡裢
+褡连 褡裢
+褡联 褡裢
+打冷颤 打冷战
+大放厥辞 大放厥词
+铛铛 当当
+当做 当作
+捣腾 倒腾
+悼辞 悼词
+得意扬扬 得意洋洋
+灯心 灯芯
+滴里嘟噜 嘀里嘟噜
+掉包 调包
+钉梢 盯梢
+丢三拉四 丢三落四
+掉换 调换
+东不拉 冬不拉
+遁辞 遁词
+哆唆 哆嗦
+峨嵋山 峨眉山
+发楞 发愣
+翻然醒悟 幡然醒悟
+反覆 反复
+忿恨 愤恨
+忿怒 愤怒
+夫倡妇随 夫唱妇随
+浮图 浮屠
+辐凑 辐辏
+福份 福分
+俯首贴耳 俯首帖耳
+赋与 赋予
+夹肢窝 胳肢窝
+格登 咯噔
+根柢 根底
+梗咽 哽咽
+宫庭 宫廷
+钩勒 勾勒
+勾针 钩针
+够戗 够呛
+孤另另 孤零零
+孤伶伶 孤零零
+轱轳 轱辘
+毂辘 轱辘
+固步自封 故步自封
+故技 故伎
+锢疾 痼疾
+固疾 痼疾
+刮刮叫 呱呱叫
+呵腰 哈腰
+寒颤 寒战
+嚎啕 号啕
+号咷 号啕
+嚎咷 号啕
+好高务远 好高骛远
+和事老 和事佬
+贺辞 贺词
+黑鼓隆咚 黑咕隆咚
+黑古龙冬 黑咕隆咚
+黑鸦鸦 黑压压
+轰堂大笑 哄堂大笑
+轰笑 哄笑
+宏亮 洪亮
+呼嗤 呼哧
+呼蚩 呼哧
+呼吃 呼哧
+花狸狐哨 花里胡哨
+花梢 花哨
+花稍 花哨
+花消 花销
+黄历 皇历
+混身 浑身
+浑沌 混沌
+辑逸 辑佚
+给与 给予
+记录片 纪录片
+记要 纪要
+趼子 茧子
+交待 交代
+脚鸭子 脚丫子
+脚指 脚趾
+叫真 较真
+菁华 精华
+警省 警醒
+酒钟 酒盅
+倔犟 倔强
+开消 开销
+砍大山 侃大山
+看做 看作
+夸大其辞 夸大其词
+宽洪大量 宽宏大量
+老趼 老茧
+乐和和 乐呵呵
+乐孜孜 乐滋滋
+利害 厉害
+伶牙利齿 伶牙俐齿
+流言飞语 流言蜚语
+蹓弯儿 遛弯儿
+乱烘烘 乱哄哄
+罗纹 螺纹
+慢道 漫道
+慢说 漫说
+毛骨耸然 毛骨悚然
+毛骨竦然 毛骨悚然
+冒然 贸然
+棉子 棉籽
+藐小 渺小
+渺视 藐视
+渺远 邈远
+溟溟 冥冥
+摸棱两可 模棱两可
+秣马利兵 秣马厉兵
+秣马砺兵 秣马厉兵
+木犀 木樨
+闹轰轰 闹哄哄
+闹烘烘 闹哄哄
+粘稠 黏稠
+粘糊 黏糊
+粘土 黏土
+粘性 黏性
+粘液 黏液
+念道 念叨
+暖呼呼 暖乎乎
+扒犁 爬犁
+判辞 判词
+皮簧 皮黄
+慓悍 剽悍
+飘渺 缥缈
+漂渺 缥缈
+飘眇 缥缈
+飘邈 缥缈
+凭白无故 平白无故
+匍伏 匍匐
+起程 启程
+启锚 起锚
+起迄 起讫
+气门心 气门芯
+牵就 迁就
+遣辞 遣词
+枪枝 枪支
+情份 情分
+屈伏 屈服
+取销 取消
+雀瘢 雀斑
+热剌剌 热辣辣
+如雷灌耳 如雷贯耳
+散逸 散佚
+沙锅 砂锅
+沙壶 砂壶
+沙浆 砂浆
+沙糖 砂糖
+杀风景 煞风景
+杀尾 煞尾
+刹时 霎时
+山颠 山巅
+扇风点火 煽风点火
+闪烁其辞 闪烁其词
+上方宝剑 尚方宝剑
+深醒 深省
+甚么 什么
+神甫 神父
+省分 省份
+拾遗补阙 拾遗补缺
+士女画 仕女画
+视阈 视域
+誓辞 誓词
+授与 授予
+摔交 摔跤
+水份 水分
+水长船高 水涨船高
+思辩 思辨
+死气白赖 死乞白赖
+宿愿 夙愿
+夙来 素来
+夙敌 宿敌
+夙儒 宿儒
+夙怨 宿怨
+梯己 体己
+题辞 题词
+俶傥 倜傥
+瞳人 瞳仁
+产玲 产龄
+退色 褪色
+托咐 托付
+顽耍 玩耍
+玩皮 顽皮
+惟独 唯独
+惟恐 唯恐
+惟利是图 唯利是图
+惟命是从 唯命是从
+惟其 唯其
+惟我独尊 唯我独尊
+惟一 唯一
+萎顿 委顿
+委宛 委婉
+委罪 诿罪
+委靡 萎靡
+委谢 萎谢
+文彩 文采
+无精打彩 无精打采
+无尚 无上
+欷歔 唏嘘
+喜孜孜 喜滋滋
+陷井 陷阱
+项练 项链
+销歇 消歇
+消魂 销魂
+兴高彩烈 兴高采烈
+雄纠纠 雄赳赳
+旋涡 漩涡
+薰陶 熏陶
+丫鬟 丫环
+压宝 押宝
+哑吧 哑巴
+哑叭 哑巴
+言不由中 言不由衷
+一倡百和 一唱百和
+一蹋糊涂 一塌糊涂
+一榻糊涂 一塌糊涂
+一相情愿 一厢情愿
+引伸 引申
+硬梆梆 硬邦邦
+硬帮帮 硬邦邦
+渔汛 鱼汛
+鱼鼓 渔鼓
+约莫 约摸
+殒落 陨落
+在坐 在座
+糟踏 糟蹋
+糟塌 糟蹋
+张惶 张皇
+照像 照相
+珍羞 珍馐
+真象 真相
+枝梧 支吾
+枝捂 支吾
+装聋做哑 装聋作哑
+妆束 装束
+装做 装作
+子畜 仔畜
+子猪 仔猪
+子粒 籽粒
+子棉 籽棉
+子实 籽实
+走露 走漏
+做弊 作弊
+做美 作美
+做弄 作弄
+做声 作声
+做秀 作秀
+座落 坐落
+坐次 座次
+坐位 座位
+旁证博引 旁征博引
+谈笑风声 谈笑风生
+美仑美幻 美轮美奂
+坐阵 坐镇
+不径而走 不胫而走
+飘亮 漂亮
+青纯 清纯
+体晾 体谅
+发杨广大 发扬光大
+浪废水 浪费水
+通货膨涨 通货膨胀
+迫不急待 迫不及待
+堵注 赌注
\ No newline at end of file
diff --git a/examples/ngram_lm/data/text_correct.txt b/examples/ngram_lm/data/text_correct.txt
new file mode 100644
index 000000000..ded8341bb
--- /dev/null
+++ b/examples/ngram_lm/data/text_correct.txt
@@ -0,0 +1,220 @@
+少先队员因该为老人让坐
+祛痘印可以吗?有效果吗?
+不知这款牛奶口感怎样? 小孩子喝行吗!
+是转基因油?
+我家宝宝13斤用多大码的
+会起坨吗?
+请问给送上楼吗?
+亲是送赁上门吗
+送货时候有外包装没有还是直接发货过来
+会不会有坏的?
+这个米煮粥好还煮饭好吃
+有送的马克杯吗?
+这纸尿裤分男孩女孩使用吗
+买的路由器老是断网,拔了跳过路由器就可以用了
+能泡开不?辣度几
+请问这个米蒸出来是一粒一粒的还是一坨一坨的?
+水和其他商品一样送货上门,还是自提呀?
+快两个月的孩子 要穿什么码的
+买回来会不会过期?
+洗的还干净把吧
+路由器怎么样啊,掉线严重吗?
+你好这米是五斤还是十斤
+收安费不
+给送开果器吗
+这纸好用吗?我看有不少的差评
+自用好用吗
+请问袜子穿久了会往下掉吗?
+每一卷是独立包装的吗?
+这个火龙果口味怎么样?甜不甜?
+买这个送红杯吗?
+一袋子多少斤
+这款拉拉裤有味道吗?超市买的没有味道,不知道这个怎么样
+我想问下拉拉裤上面那个贴的用来干嘛的,怎么用
+这里边有没有枣核
+玫瑰和薰衣草哪个好闻
+这个冰糖质量怎么样,有杂质吗
+倒水的时候漏吗
+请问大家,这个水壶烧出来的水有异味吗?因为给宝宝用所以很在意,谢谢大家
+这米煮出来糯吗?
+这在款子好用吗?有香味吗?
+到底是棉花的材质还是化纤的无纺布啊 求问?
+我用360手机能充电几次
+亲这纸好用吗?值得买吗?
+24瓶?还是12瓶
+是否是真的纸?
+适用机洗吗?
+好吃不好吃啊
+真的好用吗?我也想买
+你们拿到是什么版本的
+这水和超市一样吗?质量保证吗?
+可以丢进马桶冲吗?
+纸会不会粗?
+这个翠的还不是不催的呀。。没有吃的那种不脆
+这个好用吗
+这纸有香味的吗?
+是最近的生产日期吗
+赠品是什么呀
+这是两瓶还是一瓶的价格?
+请问这是硬壳还是软壳?
+亲,苹果收到后有坏的吗?
+适合两人用吗
+这个直接喝好不好喝 还是要热一下
+纸有木有刺鼻气味?
+酸不酸???
+这啤好渴吗?
+跟安慕希哪个比较好喝?
+好用么,主要是带宝宝出去玩的时候用的多?
+刚出生的宝宝用什么码?
+能当洗手液吗?
+是不是很小包的那一种?50块有24包便宜的有点不敢相信
+好用吗,会不会起会不会起坨?
+这个口可以直接放饮水机上用吗?
+这种纸掉粉末吗
+手机好用吗?会卡吗
+开盖里面是拉环的吗?
+这个电池真的需要一直换吗?
+好用吗?是不是正品?
+请问有尿显吗
+容易发烫吗
+苹果有腊吗
+这油有这么好吗?不是过期的吧
+这个夏天用会不会红屁股?透气性好吗
+你好。 我想问下这个是尿不湿吗 ?
+这奶为啥这么便宜?
+你们买的酱油会没有颜色吗,像水一样,看着都没胃口
+这个是机诜,还是手洗
+这个卫生巾带香味吗?
+这种洗发水好用吗
+有餡嗎?好不好吃
+纸质不会好差吗?
+亲们,此米是真空包装吗?
+是软毛的吗?!!
+请问大家德运牌子的好喝还是安佳的?
+这纸好用吗,薄嘛
+这壶保温吗
+这个威露士货到了就是跟图片上的一样吗?只要是图片上显示的都有吗?
+你们买的牛奶是最近日期吗
+这个除菌液,是单独放在滚筒洗衣机除菌液格,还是与洗衣液混合放在洗衣液格?
+请问你们的三只松鼠寄回来的时候是用袋子装着的吗
+1kg是不是两斤?
+洗衣皂怎么样啊,味道重吗,用之后好不好清洗啊。
+我要请问你这个是不是那个拉拉裤吗?这个花纹是不是拉拉裤?
+好多人都说小米运动升级后手环就连不上了,你们有没有这种情况?
+这部手机运行速度快不快?
+新生儿可以用吗 抽一张会带出来很多张吗
+洗后有香味吗
+体验装有多少片
+银装怎么样?会漏尿吗?你们都是多久换一次的??(我家大概2-3个小时左右,宝宝醒一回换一次)
+声音大吗?好用不?
+抽纸有味吗
+苹果好吃吗?打过蜡吗?是不是坏的很多?
+70g和80g得区别是啥?
+袋装的和瓶装的洗衣液是一样的么?
+噪音很大吗
+烧出来的水会不会很多一块一块的东西
+这个吹风真心好用吗?我今晚下单什么时候到
+请问各位宝妈 这个乳垫的背胶粘吗
+M号的你们给宝宝用到多大啊?几个月?我家宝宝3个月5㎏重,用花王的M号觉得小了。不知道这个怎么样?
+这个喝了能找到女朋友吗
+这袜子耐不耐穿
+请问好用么 是正品么
+怎么储藏 我买了两天在常温阴凉处放着下层有些化了 需要放冰箱冷冻吗
+这批苏打水是否有股消毒水的味道?
+质量怎么样,看到那么多差评,我不敢买了。
+会不会有烂的
+为什么我买的用完之后没香味
+甜吗????
+我看到评论里的差评说大米里有虫,是真的吗?
+要放冰箱冷藏吗
+好不好吃啊
+这油怎么样 炒菜香不香
+这纸擦手时有屑吗?
+是正品的吗?
+好用吗
+这个特浓的苦不苦
+这个好用吗?
+米里真的有虫吗
+是金装的吗?
+双内胆有什么区别,两个一样的吗?
+请问这款水可以降尿酸吗?
+好用吗这个
+购物袋结实吗,能放重东西吗
+你好,请问这款可以剃头发刮光头吗
+这个纸巾质量如何?好用吗?
+好用吗?小孩子喜欢吗?
+亲。煮面时会糊锅不
+包邮吗运费多少
+会一抽就两三张一起抽起来吗?
+一箱几桶油呀
+这个吹风机分冷风和热风吗
+发什么快递呢
+请问一下,有些枸杞说是不要洗,你们的是否建议洗呢?
+请问纸有异味吗?我以前买过一箱就是这个居然有异味。
+这是6个么 怎么觉得有好多
+我买的荣耀10横滑home键进入后台这个操作成功率特别低,你们也是这样吗?
+你们的有塑料味吗,机械的
+小米路由器真心说的有这么差吗
+请问大家这款刮的干净吗?谢谢
+会有塑料味吗
+质量真的很差吗?不敢买
+这纸有气味吗
+我买两箱怎么要运费
+这个标准果好吃吗,酸不酸
+稀吗?是不是有种兑了水的感觉?
+威露士和滴露的消毒液哪个更好用呢?
+曰期是几月份的
+手机容易折弯吗?
+我家宝宝25斤XL会紧吗?
+这款200克一箱的纸张和10卷手提的价格相差那么多 质量一样吗?
+豆浆可以打吗
+电量有百分比吗
+用快递送过来瓶子会不会打破
+是三相电吗,有空调摇控器吧
+拿它送人,有问题吗??
+安幕希好喝吗?
+这款纸尿裤好用吗?和尤妮佳比较哪个好用些?
+2层厚吗?是不是一到水就烂了
+为什么我宝宝拉粑粑后面总是漏出来我已经贴的很牢了,10斤的宝宝用S号也不小啊你们用了没这种情况吗?
+这个产品好用吗?
+刷毛柔软度咋样,这么便宜,会不会是很小个的
+会不会有过敏的情况呀
+请问是辣条吗
+这种米只能煮粥不能煮饭吗
+可以开袋即食吗?
+这米好吃吗?
+这个充电宝充满电需要多久
+这个奶开了可以保质喝两天吗
+这种薰衣草的洗衣液怎么样
+你们的小米六边框掉漆了吗???
+这个是机洗用还是手洗用的啊
+厚度怎么样、起球吗感谢大哥大姐们
+这个好喝还是康师傅红茶好喝
+这种洁面膏会不会过敏,我上次用的火山岩冰感洁面啫喱对那种过敏,但听别人说那种稀的本来就特别容易过敏,不知道这种洁面膏会不会过敏!
+这杯那么多差评,是真的吗,吓得我都不敢买了
+枣是免洗的吗?
+这个尿不湿尿过会起坨吗
+感觉和苏菲比哪个更好用呢?
+煮出来的饭香吗?
+你好!请问这个水壶烧水开了是自动切电吗?
+这个跟 原木纯品 那个啥区别?不是原木纸浆做的?
+能放冰箱吗
+纸有味道吗?
+2016全国高考卷答题模板
+2016全国大考卷答题模板
+2016全国低考卷答题模板
+床前明月光,疑是地上霜
+床前星星光,疑是地上霜
+床前白月光,疑是地上霜
+落霞与孤鹜齐飞,秋水共长天一色
+落霞与孤鹜齐跑,秋水共长天一色
+落霞与孤鹜双飞,秋水共长天一色
+众里寻他千百度,蓦然回首,那人却在,灯火阑珊处
+众里寻她千百度,蓦然回首,那人却在,灯火阑珊处
+众里寻ta千百度,蓦然回首,那人却在,灯火阑珊处
+吸烟的人容*得癌症
+就只听着我*妈所说的话,
+就接受环境污*用化肥和农药,
+是或者接受环境污染用化肥和农药,
+现在的香港比从前的*荣很多。
+现在的香港比*前的饭荣很多。
diff --git a/examples/ngram_lm/local/build_zh_lm.sh b/examples/ngram_lm/local/build_zh_lm.sh
new file mode 100644
index 000000000..a2708e194
--- /dev/null
+++ b/examples/ngram_lm/local/build_zh_lm.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+set -e
+
+stage=0
+stop_stage=100
+
+order=5
+mem=80%
+prune=0
+a=22
+q=8
+b=8
+
+source ${MAIN_ROOT}/utils/parse_options.sh || exit 1;
+
+if [ $# != 3 ]; then
+ echo "$0 token_type exp/text exp/text.arpa"
+ echo $@
+ exit 1
+fi
+
+# char or word
+type=$1
+text=$2
+arpa=$3
+
+if [ $stage -le 0 ] && [ $stop_stage -ge 0 ];then
+ # text tn & wordseg preprocess
+ echo "process text."
+ python3 local/zh_preprocess.py ${type} ${text} ${text}.${type}.tn
+fi
+
+if [ $stage -le 1 ] && [ $stop_stage -ge 1 ];then
+ # train ngram lm
+ echo "build lm."
+ bash local/ngram_train.sh --order ${order} --mem ${mem} --prune "${prune}" ${text}.${type}.tn ${arpa}
+fi
\ No newline at end of file
diff --git a/examples/ngram_lm/local/download_lm_zh.sh b/examples/ngram_lm/local/download_lm_zh.sh
new file mode 100755
index 000000000..f9e2261fd
--- /dev/null
+++ b/examples/ngram_lm/local/download_lm_zh.sh
@@ -0,0 +1,21 @@
+#! /usr/bin/env bash
+
+. ${MAIN_ROOT}/utils/utility.sh
+
+DIR=data/lm
+mkdir -p ${DIR}
+
+URL='https://deepspeech.bj.bcebos.com/zh_lm/zh_giga.no_cna_cmn.prune01244.klm'
+MD5="29e02312deb2e59b3c8686c7966d4fe3"
+TARGET=${DIR}/zh_giga.no_cna_cmn.prune01244.klm
+
+
+echo "Download language model ..."
+download $URL $MD5 $TARGET
+if [ $? -ne 0 ]; then
+ echo "Fail to download the language model!"
+ exit 1
+fi
+
+
+exit 0
diff --git a/examples/ngram_lm/local/kenlm_score_test.py b/examples/ngram_lm/local/kenlm_score_test.py
new file mode 100644
index 000000000..1c8f867bd
--- /dev/null
+++ b/examples/ngram_lm/local/kenlm_score_test.py
@@ -0,0 +1,167 @@
+import kenlm
+import jieba
+import time
+
+import os
+import sys
+
+language_model_path = sys.argv[1]
+assert os.path.exists(language_model_path)
+
+start = time.time()
+model = kenlm.Model(language_model_path)
+print(f"load kenLM cost: {time.time() - start}s")
+
+sentence = '盘点不怕被税的海淘网站❗️海淘向来便宜又保真!'
+sentence_char_split = ' '.join(list(sentence))
+sentence_word_split = ' '.join(jieba.lcut(sentence))
+
+
+def test_score():
+ print('Loaded language model: %s' % language_model_path)
+
+ print(sentence)
+ print(model.score(sentence))
+ print(list(model.full_scores(sentence)))
+ for i, v in enumerate(model.full_scores(sentence)):
+ print(i, v)
+
+ print(sentence_char_split)
+ print(model.score(sentence_char_split))
+ print(list(model.full_scores(sentence_char_split)))
+ split_size = 0
+ for i, v in enumerate(model.full_scores(sentence_char_split)):
+ print(i, v)
+ split_size += 1
+ assert split_size == len(sentence_char_split.split()) + 1, "error split size."
+
+ print(sentence_word_split)
+ print(model.score(sentence_word_split))
+ print(list(model.full_scores(sentence_word_split)))
+ for i, v in enumerate(model.full_scores(sentence_word_split)):
+ print(i, v)
+
+
+def test_full_scores_chars():
+ print('Loaded language model: %s' % language_model_path)
+ print(sentence_char_split)
+ # Show scores and n-gram matches
+ words = [''] + list(sentence) + ['']
+ for i, (prob, length, oov) in enumerate(model.full_scores(sentence_char_split)):
+ print('{0} {1}: {2}'.format(prob, length, ' '.join(words[i + 2 - length:i + 2])))
+ if oov:
+ print('\t"{0}" is an OOV'.format(words[i + 1]))
+
+ print("-" * 42)
+ # Find out-of-vocabulary words
+ oov = []
+ for w in words:
+ if w not in model:
+ print('"{0}" is an OOV'.format(w))
+ oov.append(w)
+ assert oov == ["❗", "️", "!"], 'error oov'
+
+
+def test_full_scores_words():
+ print('Loaded language model: %s' % language_model_path)
+ print(sentence_word_split)
+ # Show scores and n-gram matches
+ words = [''] + sentence_word_split.split() + ['']
+ for i, (prob, length, oov) in enumerate(model.full_scores(sentence_word_split)):
+ print('{0} {1}: {2}'.format(prob, length, ' '.join(words[i + 2 - length:i + 2])))
+ if oov:
+ print('\t"{0}" is an OOV'.format(words[i + 1]))
+
+ print("-" * 42)
+ # Find out-of-vocabulary words
+ oov = []
+ for w in words:
+ if w not in model:
+ print('"{0}" is an OOV'.format(w))
+ oov.append(w)
+ # zh_giga.no_cna_cmn.prune01244.klm is chinese charactor LM
+ assert oov == ["盘点", "不怕", "网站", "❗", "️", "海淘", "向来", "便宜", "保真", "!"], 'error oov'
+
+
+def test_full_scores_chars_length():
+ """test bos eos size"""
+ print('Loaded language model: %s' % language_model_path)
+ r = list(model.full_scores(sentence_char_split))
+ n = list(model.full_scores(sentence_char_split, bos=False, eos=False))
+ print(r)
+ print(n)
+ assert len(r) == len(n) + 1
+
+ # bos=False, eos=False, input len == output len
+ print(len(n), len(sentence_char_split.split()))
+ assert len(n) == len(sentence_char_split.split())
+
+ k = list(model.full_scores(sentence_char_split, bos=False, eos=True))
+ print(k, len(k))
+
+
+def test_ppl_sentence():
+ """测试句子粒度的ppl得分"""
+ sentence_char_split1 = ' '.join('先救挨饿的人,然后治疗病人。')
+ sentence_char_split2 = ' '.join('先就挨饿的人,然后治疗病人。')
+ n = model.perplexity(sentence_char_split1)
+ print('1', n)
+ n = model.perplexity(sentence_char_split2)
+ print(n)
+
+ part_char_split1 = ' '.join('先救挨饿的人')
+ part_char_split2 = ' '.join('先就挨饿的人')
+ n = model.perplexity(part_char_split1)
+ print('2', n)
+ n = model.perplexity(part_char_split2)
+ print(n)
+
+ part_char_split1 = '先救挨'
+ part_char_split2 = '先就挨'
+ n1 = model.perplexity(part_char_split1)
+ print('3', n1)
+ n2 = model.perplexity(part_char_split2)
+ print(n2)
+ assert n1 == n2
+
+ part_char_split1 = '先 救 挨'
+ part_char_split2 = '先 就 挨'
+ n1 = model.perplexity(part_char_split1)
+ print('4', n1)
+ n2 = model.perplexity(part_char_split2)
+ print(n2)
+
+ part_char_split1 = '先 救 挨 饿 的 人'
+ part_char_split2 = '先 就 挨 饿 的 人'
+ n1 = model.perplexity(part_char_split1)
+ print('5', n1)
+ n2 = model.perplexity(part_char_split2)
+ print(n2)
+
+ part_char_split1 = '先 救 挨 饿 的 人 ,'
+ part_char_split2 = '先 就 挨 饿 的 人 ,'
+ n1 = model.perplexity(part_char_split1)
+ print('6', n1)
+ n2 = model.perplexity(part_char_split2)
+ print(n2)
+
+ part_char_split1 = '先 救 挨 饿 的 人 , 然 后 治 疗 病 人'
+ part_char_split2 = '先 就 挨 饿 的 人 , 然 后 治 疗 病 人'
+ n1 = model.perplexity(part_char_split1)
+ print('7', n1)
+ n2 = model.perplexity(part_char_split2)
+ print(n2)
+
+ part_char_split1 = '先 救 挨 饿 的 人 , 然 后 治 疗 病 人 。'
+ part_char_split2 = '先 就 挨 饿 的 人 , 然 后 治 疗 病 人 。'
+ n1 = model.perplexity(part_char_split1)
+ print('8', n1)
+ n2 = model.perplexity(part_char_split2)
+ print(n2)
+
+if __name__ == '__main__':
+ test_score()
+ test_full_scores_chars()
+ test_full_scores_words()
+ test_full_scores_chars_length()
+ test_ppl_sentence()
\ No newline at end of file
diff --git a/examples/ngram_lm/local/ngram_train.sh b/examples/ngram_lm/local/ngram_train.sh
new file mode 100644
index 000000000..cba74880f
--- /dev/null
+++ b/examples/ngram_lm/local/ngram_train.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+set -e
+
+order=5
+mem=80%
+prune=0
+a=22
+q=8
+b=8
+
+source ${MAIN_ROOT}/utils/parse_options.sh || exit 1;
+
+if [ $# != 2 ]; then
+ echo "$0 exp/text exp/text.arpa"
+ exit 1
+fi
+
+text=${1}
+arpa=${2}
+lmbin=${2}.klm.bin
+
+# https://kheafield.com/code/kenlm/estimation/
+echo "build arpa lm."
+lmplz -o ${order} -S ${mem} --prune ${prune} < ${text} >${arpa} || { echo "train kenlm error!"; exit -1; }
+
+# https://kheafield.com/code/kenlm/
+echo "build binary lm."
+build_binary -a ${a} -q ${q} -b ${b} trie ${arpa} ${lmbin} || { echo "build kenlm binary error!"; exit -1; }
\ No newline at end of file
diff --git a/examples/ngram_lm/local/zh_preprocess.py b/examples/ngram_lm/local/zh_preprocess.py
new file mode 100644
index 000000000..9cdcfd495
--- /dev/null
+++ b/examples/ngram_lm/local/zh_preprocess.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+
+from typing import List, Text
+import sys
+import jieba
+import string
+import re
+from zhon import hanzi
+
+def char_token(s: Text) -> List[Text]:
+ return list(s)
+
+def word_token(s: Text) -> List[Text]:
+ return jieba.lcut(s)
+
+def tn(s: Text) -> Text:
+ s = s.strip()
+ s = s.replace('*', '')
+ # rm english punctuations
+ s = re.sub(f'[re.escape(string.punctuation)]' , "", s)
+ # rm chinese punctuations
+ s = re.sub(f'[{hanzi.punctuation}]', "", s)
+ # text normalization
+
+ # rm english
+ s = ''.join(re.findall(hanzi.sent, s))
+ return s
+
+def main(infile, outfile, tokenizer=None):
+ with open(infile, 'rt') as fin, open(outfile, 'wt') as fout:
+ lines = fin.readlines()
+ for l in lines:
+ l = tn(l)
+ if tokenizer:
+ l = ' '.join(tokenizer(l))
+ fout.write(l)
+ fout.write('\n')
+
+if __name__ == '__main__':
+ if len(sys.argv) != 4:
+ print(f"sys.arv[0] [char|word] text text_out ")
+ exit(-1)
+
+ token_type = sys.argv[1]
+ text = sys.argv[2]
+ text_out = sys.argv[3]
+
+ if token_type == 'char':
+ tokenizer = char_token
+ elif token_type == 'word':
+ tokenizer = word_token
+ else:
+ tokenizer = None
+
+ main(text, text_out, tokenizer)
\ No newline at end of file
diff --git a/examples/ngram_lm/path.sh b/examples/ngram_lm/path.sh
new file mode 100644
index 000000000..c07b11cf0
--- /dev/null
+++ b/examples/ngram_lm/path.sh
@@ -0,0 +1,13 @@
+export MAIN_ROOT=${PWD}/../../
+
+export PATH=${MAIN_ROOT}:${PWD}/tools:${PATH}
+export LC_ALL=C
+
+# Use UTF-8 in Python to avoid UnicodeDecodeError when LC_ALL=C
+export PYTHONIOENCODING=UTF-8
+export PYTHONPATH=${MAIN_ROOT}:${PYTHONPATH}
+
+export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib/
+
+MODEL=deepspeech2
+export BIN_DIR=${MAIN_ROOT}/deepspeech/exps/${MODEL}/bin
diff --git a/examples/ngram_lm/requirements.txt b/examples/ngram_lm/requirements.txt
new file mode 100644
index 000000000..523cd3e14
--- /dev/null
+++ b/examples/ngram_lm/requirements.txt
@@ -0,0 +1 @@
+jieba>=0.39
\ No newline at end of file
diff --git a/examples/ngram_lm/run.sh b/examples/ngram_lm/run.sh
new file mode 100755
index 000000000..4b507e95c
--- /dev/null
+++ b/examples/ngram_lm/run.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+set -e
+source path.sh
+
+stage=0
+stop_stage=100
+
+source ${MAIN_ROOT}/utils/parse_options.sh || exit -1
+
+python3 -c 'import kenlm;' || { echo "kenlm package not install!"; exit -1; }
+
+if [ $stage -le 0 ] && [ $stop_stage -ge 0 ];then
+ # case 1, test kenlm
+ # download language model
+ bash local/download_lm_zh.sh
+ if [ $? -ne 0 ]; then
+ exit 1
+ fi
+
+ # test kenlm `score` and `full_score`
+ python local/kenlm_score_test.py data/lm/zh_giga.no_cna_cmn.prune01244.klm
+fi
+
+mkdir -p exp
+cp data/text_correct.txt exp/text
+
+if [ $stage -le 1 ] && [ $stop_stage -ge 1 ];then
+ # case 2, chinese chararctor ngram lm build
+ # output: xxx.arpa xxx.kenlm.bin
+ input=exp/text
+ token_type=char
+ lang=zh
+ order=5
+ prune="0 1 2 4 4"
+ a=22
+ q=8
+ b=8
+ output=${input}_${lang}_${token_type}_o${order}_p${prune// /_}_a${a}_q${q}_b${b}.arpa
+ echo "build ${token_type} lm."
+ bash local/build_zh_lm.sh --order ${order} --prune "${prune}" --a ${a} --q ${a} --b ${b} ${token_type} ${input} ${output}
+fi
+
+if [ $stage -le 2 ] && [ $stop_stage -ge 2 ];then
+ # case 2, chinese chararctor ngram lm build
+ # output: xxx.arpa xxx.kenlm.bin
+ input=exp/text
+ token_type=word
+ lang=zh
+ order=3
+ prune="0 0 0"
+ a=22
+ q=8
+ b=8
+ output=${input}_${lang}_${token_type}_o${order}_p${prune// /_}_a${a}_q${q}_b${b}.arpa
+ echo "build ${token_type} lm."
+ bash local/build_zh_lm.sh --order ${order} --prune "${prune}" --a ${a} --q ${a} --b ${b} ${token_type} ${input} ${output}
+fi