lm挑战-评估预测语言模型的库和工具。

lmchallenge的Python项目详细描述


#语言模型挑战(lm挑战)
[![生成状态](https://travis-ci.com/microsoft/lmchallenge.svg?token=psuqkrdl8qs6yflsqptp&;branch=master)(https://travis ci.com/microsoft/lm challenge)

这是一个评估预测性语言模型的库和工具。这是lm challenge用户的指南;您可能还希望看到集成程序的

-[数据格式](doc/formats.md)-[开发注释](doc/dev.md)对于希望扩展lm challenge的开发人员来说,lm challenge是什么?

通常很难比较语言模型的性能。有的模型输出概率,有的模型输出分数;有的模型输出单词,有的模型输出语素、字符或字节。词汇覆盖范围各不相同。因此,公平地比较它们是困难的。因此,在lm challenge中,我们有一些非常简单的"挑战游戏",可以在测试语料库中评估(并帮助比较)语言模型。


注意:大多数lm挑战工具都是基于单词的(尽管所有工具都可以应用于子单词"character composi国家"单词模型)。另外,我们假设语言模型是"前向上下文"的,因此它只根据前面的单词/字符预测单词或字符。




\getting started

install lm challenge from the published python package:

pip3 install--user lmchallenge

(或来自此存储库"python3 setup.py install--user`.)

**安装:**lm challenge需要一个模型来评估。我们在"sample"中包含了一个示例ngram模型实现。下载数据和构建模型(这可能需要几分钟):

cd sample/
./prepare.sh

**model repl:*现在您可以使用示例脚本来评估非常基本的ngram模型(请参阅[ngram.py](sample/ngram.py),如果集成您自己的pre,您可能会发现它很有用发音模式)。_请注意,此命令不会终止,因为它启动了一个交互式程序:


python3 ngram.py words data/words.3gram


这将启动一个交互式程序,该程序可以接受一个单词后跟一个硬"tab"字符和任何参数的命令,例如:

>;预测<;tab>;
=0.0000在-2.0000中的-1.0000…

若要使用词上下文进行查询,请尝试以下操作(确保在查询末尾的"收藏夹"后面留一个尾随空格):

>;预测<;tab>;我最喜欢的0.0000首歌曲的
-1.0000 the-2.0000…

n文本。API还有更多内容(请参见[格式](doc/formats.m d)了解更多详细信息),但由于您通常不会直接使用API,因此让我们继续在此模型上运行lm challenge(因此使用"ctrl+d"退出预测程序,返回到shell)。

**求值:**为此m运行lm challengeodel,我们将一些文本导入"lmc run",并保存结果:

head-n 10 data/wiki.test.tokens lmc run"python3 ngram.py words data/words.3gram"wc>;out/w3.wc.log

`公用事业。注意:`jq`这里是可选的,但这是一个非常方便的程序,可以用来处理json。


现在让我们尝试与一个功能较弱的模型进行比较:

head-n 10 data/wiki.test.tokens lmc run"python3 ngram.py words data/words.2gram"wc>;out/w2.wc.log
lmcstats out/*.wc.log jq.

两个模型的聚合级别预测和完成状态应该略有不同。但是我们可以从详细检查日志中得到更好的图片:


我们还可以很好地打印两种模型之间的差异:



仅筛选大写单词的日志,并打印摘要统计信息:



在这个小的、统计上不重要的例子中,有意义的词比一般的词更难预测。

**其他挑战:*其他lm挑战可以用类似的方式运行和检查,请参见"lmc run--help"。



非常灵活-可用于多种方式:

1.命令行界面
2.python api
3.日志文件格式

1。命令行接口

这是使用lm challenge的最简单方法,如果您的模型是用支持管道stdout/stdin的任何语言实现的,则可以使用。请参阅上面的[入门](入门)指南和cli帮助:

lmc run--help

python api

如果您的模型在python 3中运行,并且您希望用python编写求值脚本,那么可以直接使用api:


import lmchallenge as lmc
help(lmc)

我们还没有发布HTML,但是已经用"pdoc"进行了测试:

$pdoc--http
日志文件格式

如果需要批处理或分发以获得足够的计算速度,则可以自己编写lm challenge日志文件。这意味着您可以使用lm challenge来处理和分析数据,而不必强制使用特定的执行模型。为此:

1.编写包含lmchallenge日志数据的jsonline文件:
-请参阅描述日志格式的[数据格式](doc/formats.md)说明。
-(可选)使用正式描述可接受日志数据的[json架构](lmchallenge/log.schema)。
-(可选)使用cli`lmc validate`(或python api`lmchallenge.validate.validate`)检查日志是否符合架构。
-请注意,如果日志文件是并行生成的,则通常可以将它们连接起来。
2。使用lm challenge工具分析日志(除了"lmc run"之外的所有内容)。




-`wc`-单词完成挑战-下一个单词预测/完成任务(生成hit@n&completion ratio)
-`we ce`-单词字符熵挑战-语言概率分布任务(生成给定定义词汇的交叉熵)
-`wr`-单词重新登录G挑战-修正任务(产生准确度)

**测试文本**是纯文本数据(如真实人类所输入和理解的那样!)lm challenge没有定义测试文本-我们希望提供它。为了评估语言模型,您还需要决定另一件事。

a**语言模型**是一个可执行的过程,它以特定的文本格式响应来自一个挑战游戏的命令,通常由一个与测试语言相同的预训练模型组成。ext_u.

\word completion`wc`


word completion任务扫描测试文本中的单词,在每一点查询语言模型以获取下一个单词预测和单词完成情况。

cat data lmc run"predict or"wc>;log

模型的目标应该是在其他单词之前预测正确的下一个单词(即尽可能低的排名),或者在前两个补全中预测失败,尽可能短的输入前缀。"wc"提供的统计数据包括:

-下一个单词预测
-`hit@n`-排名低于"n"的正确预测的比率
-`mrr`(平均倒数排名)-所有单词的"1/排名"总和
-完成
-`characters`-字符的比率re completed(例如,如果键入"hello",并在键入"he"后预测,则完成字符的比率将为"0.5")
-`tokens`-在完全键入之前完成的令牌的比率

请注意,标记"--仅限下一个单词"可用于加快计算速度。n,跳过所有前缀,只评估模型的下一个单词预测性能(这样就不会生成完成统计)。


用于评估语言模型的sure。这些求值器扫描文本,在每个点上查询语言模型以获取当前单词的规范化日志概率。

cat data lmc run"predictor"ce>;log

n只能在共享同一词汇表的模型之间进行比较。如果词汇量不同,熵任务也不同,不应该比较模型。因此,模型必须在其词汇表上生成一个"公平"的标准化日志概率(如果词汇表中没有单词,则从结果中省略分数)。它不应该合并单词的"等价类"(除非与正在评估的所有其他模型大体一致)。这方面的一个例子是规范化大写,使"fish"与"fish"得到相同的分数,或者给许多单词一个"词汇量外"的分数(这样,如果你要计算"p("fish")+p("fish")+p(其他所有东西)",它就不等于1)。简单地使用任何不能评分的单词(例如oov单词)是安全的,因为这有助于形成一个特殊的"熵指纹",它检查两个模型是否成功地对同一组单词进行了评分,因此在熵度量下是可比的。单词重新排序任务模拟草率的打字员输入文本,在输入文本后使用语言模型更正输入。这个挑战需要一个单词列表作为损坏单词(在目标语言中应该是一大组有效单词)的更正候选单词。数据源中的文本首先被损坏(好像是由一个草率的打字员造成的)。将被破坏的文本输入到邻近候选词的搜索中,根据所评估的语言模型对候选词进行评分。评估者测量校正、未校正和错误校正的结果。

cat data lmc run"predictor"wr vocab>;log

模型的目的是为正确的单词分配高分,为所有其他单词分配低分。我们通过将语言模型中的分数与每个单词的输入分数(使用Lanugage模型中未评分的单词的最小分数)混合,然后根据该分数进行排名来评估。如果排名靠前的预测是正确的话,那么这个例子就是成功的,否则就是失败。_input score_u是从该单词生成的特定损坏文本的日志概率,与用于损坏真单词的错误模型相同。为了对来自语言模型的不同分数范围具有鲁棒性,我们在统计数据之前优化了输入和语言模型的混合参数(这是自动完成的,但需要可选的依赖关系"scipy")。精度综合测量使用最佳混合比例,获得正确的最高预测值的最大比例。



大多数捐款要求您同意
捐款人许可协议(CLA),声明您有权并且实际上有权授予我们使用您的捐款的权利。有关详细信息,请访问https://cla.microsoft.com。

当您提交请求时,cla bot将自动确定是否需要提供cla并适当地装饰pr(例如标签、注释)。只需按照机器人提供的说明进行操作。您只需使用我们的CLA在所有回购协议中执行一次即可。

此项目采用了[Microsoft开源行为准则](https://open source.microsoft.com/code of conduct/)。
有关详细信息,请参阅[行为准则常见问题解答](https://opensource.microsoft.com/codeofconduct/faq/)或
如有任何其他问题或意见,请与[opencode@microsoft.com]联系(邮件地址:opencode@microsoft.com)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
关于JSP转发的java问题   强制Oracle驱动程序向java输出带有时区的时间戳。sql。使用getObject时的时间戳   Java中的配置单元UDF在创建表时失败   eclipse怀疑Java上下文加载器使用不再存在的文件   范围如何为我没有在JavaEE中编写的类定义单例对象?   java Eclipse未启动:JVM已终止。退出代码=14   仅存在于子类中的属性的java别名(Hibernate标准)   Java字符串插入错误   无法打开java@PropertySource,因为它不存在   java从多项目Maven配置生成WAR文件   java Hibernate@Lob注释不再有效:不能用几个字符串超过CLOB的总长度?   java jbutton的鼠标侦听器包含if/else循环阻塞的jvm?   java如何删除最近24小时安卓的通话记录   java Android服务+计数器不工作   java如何获取返回结果的服务器的数据,我希望将该结果更新到另一台服务器   java从javax获得“一切”是可能的。命名。初始上下文?   java Spring云门请求超时不适用于路径   java web应用程序会话缓存   java使用dialogflow的响应通过google助手打开我的应用程序   MongoDB添加createAt updatedAt字段java