【学习周报】
总结自己的学习和遇到的好材料。
往期回顾:
docker容器倒腾
使用docker镜像创建容器,并在容器中使用root权限配置环境。以kenlm为例。
docker run --name ${user}_kenlm --workdir
/home/amy -user root -it -v ${docker_root}:/home/amy
mydocker /bin/bash
使用的是root权限登录。
查看docker目前容器状态。
docker ps -a
连接容器:
docker start <container id>
离开容器(但不关闭):ctrl+P+Q
kenlm环境配置
参考链接:https://blog.csdn.net/qq_29883591/article/details/80206940
apt-get更新:apt-get update
安装cmake:apt-get install cmake
安装wget:apt-get install wget
源码安装boost,官网直接下载
下载完以后,解压:
tar -zxvf boost_1_66_0.tar.gz
编译:
cd boost_1_66_0; ./boostrap.sh
安装:
./b2 install
源码安装kenlm,官网下载后开始预编译,常规的流程:
mkdir -p build
cd build
cmake ..
make -j 4
但是可能会有一些问题:
缺少Eigen3,会有提示你该怎么做:
export EIGEN3_ROOT=$HOME/eigen-eigen-07105f7124f; cd $HOME; wget -O - https://bitbucket.org/eigen/eigen/get/3.2.8.tar.bz2 |tar xj
缺少zma、bz2之类的,直接apt-get install即可。
apt-get install liblzma-dev
问题解决后重新cmake、make即可,完成后可以尝试执行看是否能出来,能出来基本就可以认为是没问题了:
bin/lmplz --help
python
python double buffer
有关python的双buffer机制:https://github.com/spcl/dace/issues/1
python-util
import json
json.dumps(data,ensure_ascii=False)
json.loads(data)
import re
def is_contain_english(str0):
return bool(re.search('[a-z]', str0))
python单例模式
python 单例模式----装饰器实现:https://blog.csdn.net/thn_sweety/article/details/52565688)
对话机器人
对话系统平台:https://github.com/EdisonChen0816/chatbot
纠错文章
中文(语音结果)的文本纠错综述 Chinese Spelling Check:https://blog.csdn.net/lipengcn/article/details/82556569
中文输入纠错任务整理:https://blog.csdn.net/hqc888688/article/details/74858126
混淆集决定纠错的上限。
下面是一堆论文
【1】Poly-encoders: Transformer Architectures and Pre-training Strategies for Fast and Accurate Multi-sentence Scoring
深度预训练双向变压器的使用已在许多应用中取得了显着进展(Devlin等人,2018)。对于在序列之间进行成对比较,将给定输入与相应标签进行匹配的任务,两种方法很常见:跨编码器对对执行完全自关注,而交叉编码器分别对对进行编码。前者通常表现更好,但对于实际使用而言却太慢了。在这项工作中,我们开发了一种新的变压器架构,即Poly-encoder,该架构可学习全局而不是令牌级别的自我关注功能。我们对这三种方法进行了详细的比较,包括哪种预训练和微调策略最有效。我们展示了我们的模型在三个现有任务上取得了最先进的结果;Poly编码器比Cross编码器更快,并且比Bi编码器更准确;并且通过对类似于下游任务的大型数据集进行预训练可以获得最佳结果。
【2】Distilling the Knowledge in a Neural Network
改善几乎所有机器学习算法性能的一种非常简单的方法是在同一数据上训练许多不同的模型,然后平均其预测。不幸的是,使用整个模型的整体进行预测很麻烦,并且可能在计算上过于昂贵,以致无法部署到大量用户,尤其是在单个模型是大型神经网络的情况下。Caruana和他的合作者表明,可以将集成中的知识压缩到一个更易于部署的单一模型中,我们将使用另一种压缩技术进一步开发此方法。我们在MNIST上取得了一些令人惊讶的结果,并且表明通过将模型集成中的知识提取为单个模型,可以显着改善频繁使用的商业系统的声学模型。我们还介绍了一种由一个或多个完整模型以及许多专业模型组成的新型合奏,这些模型学习了区分完整模型所混淆的细粒度类。与专家的混合不同,这些专家模型可以快速并行地进行训练。
【3】Introduction to CKIP Chinese Spelling Check System for SIGHAN Bakeoff 2013 Evaluation
摘要: 为了完成识别错误字符和纠错的任务,我们开发了两种使用不同词典的错误检测系统。第一个系统称为CKIP-WS,它采用基于CKIP词典的CKIP分词系统作为其核心检测程序。另一个称为G1-WS的系统使用Google 1T字元数据提取潜在的错误词对和更正候选词对作为字典。两种检测系统都使用烘烤组织者提供的混淆字符集来减少建议的校正候选者。设计了一个基于Google 1T Tri-gram的简单的最大化tri-gram频率模型,以验证并选择正确的答案。中国科学院的CKIP小组在2013年SIGHAN计划中参加了子任务1(错误检测)和子任务2(错误校正)。评估结果表明,我们的系统在这两个任务上的性能都非常好。
![](https://i-blog.csdnimg.cn/blog_migrate/cf969417b59a94c05dbc20b3e79ffdb1.png)
错误检测:未登录词。候选:Google1T构造的词典(呃呃呃,玩不起)。由于谷歌1T一元数据中包含了很多拼写错误,可以利用其构造修正词典,利用纠错词对直接进行拼写替换。具体步骤为:对1T一元数据中出现频率低的词用困惑集替换,如果新的词频率很高,则作为纠错词对候选;计算每一个纠错词对中两个词在另一个大语料上的频数,如果 原词频数 / 修改词频数 < 0.1,那么将纠错词对写入修正词典。
排序:语言模型。
【4】Chinese Spelling Errors Detection based on CSLM
摘要: 拼写错误在各种电子文档中非常常见,有时会造成严重影响。为了解决这个问题,最常用的是基于n-gram语言模型的方法。将单词表示为向量的CSLM(连续空间语言模型)与传统模型不同。在本文中,我们尝试了一种特定的CSLM,即CBOW(连续词袋)模型,以检测拼写错误。由于拼写错误通常被认为是错误的字符而不是中文单词,因此我们训练了带有大型中文语料库的字符向量,然后根据给定上下文中出现汉字的概率来判断汉字是否正确。实验结果表明,基于CSLM的方法优于n-gram语言模型。
说人话:用cbow代替传统的n-gram模型进行语言模型检测。
【5】 Chinese Spelling Error Detection and Correction Based on Language Model, Pronunciation, and Shape
摘要: 在处理用户生成的文本(例如推文和产品评论)时,拼写检查是一项重要的预处理任务。与英文等西方语言相比,中文拼写检查更为复杂,因为中文书面文本中没有单词定界符,而拼写错误的字符只能在单词级别上确定。我们的系统工作如下。首先,我们使用字符级n-gram语言模型来检测具有低于某些预定义阈值的低概率的潜在拼写错误的字符。其次,对于每个潜在的不正确字符,我们根据发音和形状相似度生成候选集。第三,如果候选人无法根据单词词典与邻居形成合法单词,我们会过滤一些候选人更正。最后,我们找到具有最高语言模型概率的最佳人选。如果概率高于预定义的阈值,则我们替换原始字符;否则我们认为原始字符正确无误。我们的初步实验表明,我们的简单方法可以实现较高的精度,但召回率较低。
![](https://i-blog.csdnimg.cn/blog_migrate/f3831f08d67420b1c89676a652fa92f3.png)
检测阶段:步骤1,我们通过前后5-gram语言模型计算句子中每个字符的分数。当分数小于阈值时,字符及其位置将发送到步骤2。为了找到更多的错误,我们将阈值设置为一个非常严格的值。
纠正阶段:首先为错误字符生成候选集。相似发音的字符是拼写错误的最常见来源(Wu等,2013)。但是相似形状仍然存在一些误差(Liu et al。,2011)。因此,候选代基于相似的发音或形状词典。有关字典的更多详细信息,请参见Yeh等人,(2013)。其次,将测试候选集中的每个字符是否可以与其邻居组成合法单词。在这里,可以与邻居一起构成合法单词的字符将留给语言模型来计算其分数。过滤后,候选者的数量减少了,这将带来两个好处:大部分被剪切的候选者都是不相关的字符,更少的候选者会使系统更高效。最后,最佳候选者意味着一个字符在前后5克语言模型下得分最高,并且得分高于阈值。如果存在,原始字符最终将被识别为错误字符,并将由最佳候选字符替换。
【6】 Sinica-IASL Chinese Spelling Check System at SIGHAN-7
摘要: 我们在2013 SIGHAN-7中文拼写检查中开发了用于错误检测和错误更正子任务的中文拼写检查系统。通过利用汉语语音和拼字法的资源,我们的系统包含四个部分:高可信度模式匹配器,检测模块,校正模块和合并。我们为这两个子任务提交了2次正式运行。评估结果表明,我们的系统在子任务1的错误检测F得分上达到0.6016,在子任务2的纠正精度上达到0.448。
统计语料构造高可信度模板,利用模版过滤一部分正确的序列,只对剩余的部分进行替换工作。主要维护三类数据,模板、长词词表、常用错误词表。
【7】 HANSpeller++: A Unifified Framework for Chinese Spelling Correction
摘要: 外国人对中国的兴趣日益增加,引起了对汉语研究的相应兴趣。但是,非母语人士学习汉语会遇到很多困难,非常需要汉语作为外语学习者的汉语拼写检查技术。本文介绍了我们在SIGHAN-2015汉语拼写检查任务上的工作。该任务的重点是对CFL学习者撰写的中国论文的十篇文章进行拼写检查。我们基于以前的HANSpeller提出了一个统一的框架HANSpeller ++,用于中文拼写校正。该框架包括候选人的产生,候选人的重新排名和最终的全球决策。实验表明,该任务的测试数据具有良好的性能。
对候选集做了粗排(个人感觉粗排的意义可能不是很大):
候选生成阶段,可以把最终正确的确认为正样本,其他的为负样本。
候选项多了以后,特征抽取和排序会花很多时间,所以可以过滤多个结果。第一层用逻辑回归分类器做粗排,特征如下:
语言模型特征。
词典特征。
编辑距离特征。
分词特征。
第二阶段,使用更加复杂的特征。感觉这几个特征不是那么可得,意义不大。
网络特征。如查百度。
回译特征。
Microsoft Web N-Gram Service probability。
【8】Correcting Chinese Spelling Errors with Word Lattice Decoding
摘要: 中文拼写检查器由于两个语言特性而更加难以开发:1)没有单词边界,并且字符可以充当单词或单词语素;2)汉字集包含超过一万个字符。前者使拼写检查器难以检测到拼写错误,而后者使拼写检查器难以构建错误模型。我们为中文拼写检查器开发了一种词格解码模型,以解决这些难题。该模型同时执行分词和纠错,从而解决了词边界问题。该模型可以纠正非单词错误和真实单词错误。为了更好地估计错误模型中大字符集的错误分布,我们还提出了一种从Google Web 1T语料库中自动提取拼写错误样本的方法。由于Google web 1T语料库中的数据量很大,因此可以提取许多拼写错误样本,从而更好地反映了现实世界中的拼写错误分布。最后,为了改进实际应用中的拼写检查器,我们针对拼写错误纠正提供了n条最佳建议。我们使用Bakeoff 2013 CSC数据集测试了我们提出的方法;结果表明,所提出的带有错误模型的方法明显优于不使用错误模型的中文拼写检查器的性能。
![](https://i-blog.csdnimg.cn/blog_migrate/e0dd289147d3df486a2d30399837ca8d.png)
根据上面那个例子可以看到,中文错误的出现可能会导致词汇会出现漂移,错误的定位可能就会出错。点出错误检测系统的初建在于:混淆集和错误检测方案。
Therefore the fifirst design issue for Chinese spelling check is how to assemble a good confusion set for each char acter which is not only small in size but also boasts a high inclusion rate for correct spelling candidates. The second design issue is how to develop a model for spelling check which best estimates the probability of the correct output character sequence for an input sentence; this however calls for a large training corpus of spelling errors.
主要流程:建图-最短路径。
建图:
动态规划求最短路径:
道理都懂,但是这个混淆集怎么来感觉他绕过去了,而这块,正好是现实场景中比较重要的部分。
这种建图然后动态规划的方式其实挺好的,但个人感觉其实应该用在候选排序前,做候选召回后的初筛更为适合,我的理解其实求得的是一个贪心解,或者说局部最优,不见得是最优解,尤其是当我们不用语言模型而用更加的排序模型的时候。