用于ngram收集和频率平滑的Python库
项目描述
lpngram
用于ngram收集和频率平滑的Python库。
lpngram
是ngram收集和频率平滑方法的纯Python实现。按照设计,它没有依赖项,但如果它们可用,它将使用 numpy
和 scipy
来加速平滑计算。它旨在处理任何类型的序列,而不仅仅是单词,并且已经成功用于收集音素ngram。
变更日志
版本 0.2
- 重构项目
- 添加类型提示
- 从
unittest
移动到 `pytest`
版本 0.1
- 首次公开发布。
安装
在任何标准Python环境中,可以使用以下命令安装 lpngram
$ pip install lpngram
使用 pip
安装还会检索依赖项 numpy
和 scipy
。如果不需要这些依赖项,可以仅通过复制 lpngram
目录中的文件来使用库。
如何使用
库对任何类型的Python可迭代对象进行操作,例如字符串、列表和元组。有方法收集普通ngram、跳过ngram和位置ngram。可以指定不同的左右顺序,以及不同的填充符号(如果有的话)。
以下示例从一个包含三个国家名称的短列表中收集最多左序1和最多右序2的ngram。
>>> import lpngram
>>> words = ['Germany', 'Italy', 'Brazil']
>>> model = lpngram.NgramModel(1, 2, sequences=words)
即使没有平滑,该模型也允许您查询特定上下文计数器。这里我们调查哪些字符在 a
之前出现,哪些字符在 G
和 r
之间出现,以及字符及其计数的完整列表
>>> model._ngrams['###', 'a']
Counter({'m': 1, 't': 1, 'r': 1})
>>> model._ngrams['G', '###', 'r']
Counter({'e': 1})
>>> model._ngrams['###',]
Counter({'a': 3, 'r': 2, 'y': 2, 'l': 2, 'G': 1, 'e': 1, 'm': 1, 'n': 1,
'I': 1, 't': 1, 'B': 1, 'z': 1, 'i': 1})
对于大多数操作,平滑处理是必要的或推荐的。该库包含一系列平滑方法,其中包括为语言研究目的开发的一种基于确定性的平滑方法。
在此,我们使用Lidstone方法进行平滑处理,伽马值为0.1,不进行归一化。
>>> model.train(method='lidstone', gamma=0.1)
>>> model._p['###', 'a']
{'m': -1.363304842895192, 't': -1.363304842895192, 'r': -1.363304842895192}
>>> model._p['G', '###', 'r']
{'e': -0.737598943130779}
>>> model._p['###',]
{'G': -2.864794916106515, 'e': -2.864794916106515, 'r': -2.2181677511814626,
'm': -2.864794916106515, 'a': -1.8287029844197393, 'n': -2.864794916106515,
'y': -2.2181677511814626, 'I': -2.864794916106515, 't': -2.864794916106515,
'l': -2.2181677511814626, 'B': -2.864794916106515, 'z': -2.864794916106515,
'i': -2.864794916106515}
平滑后的分布使我们能够实现库的主要功能,即对序列进行评分。
>>> model.score("Italy")
-35.461238155043674
>>> [model.score(word) for word in ["Italy", "Itazily", "France"]]
[-35.461238155043674, -106.65033225683297, -240.5559013433157]
我们还可以计算熵和困惑度的内部度量。
>>> model.model_entropy()
62.59647855466861
>>> model.entropy('Itazil')
17.095797405180004
>>> model.perplexity('Itazil')
140070.86762308443
>>> [model.entropy(word) for word in ["Italy", "Itazily", "France"]]
[10.231950486012801, 21.980557922299024, 57.84146765409605]
>>> [model.perplexity(word) for word in ["Italy", "Itazily", "France"]]
[1202.6077837373584, 4138159.7865280183, 2.5823598282235027e+17]
使用平滑后的分布,我们可以使用其他方法,如生成随机字符串。
>>> model.random_seqs(k=4)
[('B', 'r', 'a', 'z', 'i', 'l'), ('I', 't', 'a', 'z', 'i', 'l'),
('G', 'e', 'r', 'm', 'a', 'n', 'y'), ('I', 't', 'a', 'z', 'i', 'l', 'y')]
详细用法在测试套件中演示。完整文档和示例将在未来的版本中提供。
社区指南
贡献指南可在CONTRIBUTING.md
文件中找到。
作者和引用
该库由Tiago Tresoldi开发(tiago.tresoldi@lingfil.uu.se)。首个版本由Johann-Mattis List审阅。
该库是在文本文化进化项目背景下开发的,由瑞典皇家银行纪念基金(grant agreement ID: MXM19-1087:1)提供资金。
在开发初期,作者获得了欧洲研究委员会(ERC)的资金支持,该项目属于欧盟Horizon 2020研究和创新计划(grant agreement No. ERC Grant #715618,计算机辅助语言比较)。
如果您使用lpngram
,请按以下方式引用:
Tresoldi, Tiago (2023). lpngram,一个用于ngram收集和频率平滑的Python库。版本0.2。乌普萨拉:乌普萨拉大学,语言学与哲学系。可在:https://github.com/tresoldi/lpngram
在BibTeX中
@misc{Tresoldi2023lpngram,
author = {Tresoldi, Tiago},
title = {lpngram, a Python library for ngram collection and frequency smoothing. Version 0.2},
howpublished = {\url{https://github.com/tresoldi/lpngram}},
address = {Uppsala},
publisher = {Uppsala University, Department of Linguistics and Philology}
year = {2023},
}
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
lpngram-0.2.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 3d135afa8420c0db74978afda9da23df6ae5bc3a26c603941060079c858a39f8 |
|
MD5 | cbfd185b9ccc8d6da418c159f5fc0291 |
|
BLAKE2b-256 | 64a3d70dc25551e0ffdd14e8768c8b736b66096eab58e357985c857c81a5c4d0 |
lpngram-0.2-py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 443c5db945596ed4969d3cb2f1cb817abae98ff8d4ed663d394ba29b0e43fadd |
|
MD5 | 6292848791dc1425698d19c923ecf618 |
|
BLAKE2b-256 | 0ae8bed257c85be0ef5562726a90c0ebe95d58d87a224f3bdb4a24c20bd8655b |