跳转到主要内容

用于ngram收集和频率平滑的Python库

项目描述

lpngram

PyPI

用于ngram收集和频率平滑的Python库。

lpngram 是ngram收集和频率平滑方法的纯Python实现。按照设计,它没有依赖项,但如果它们可用,它将使用 numpyscipy 来加速平滑计算。它旨在处理任何类型的序列,而不仅仅是单词,并且已经成功用于收集音素ngram。

变更日志

版本 0.2

  • 重构项目
  • 添加类型提示
  • unittest 移动到 `pytest`

版本 0.1

  • 首次公开发布。

安装

在任何标准Python环境中,可以使用以下命令安装 lpngram

$ pip install lpngram

使用 pip 安装还会检索依赖项 numpyscipy。如果不需要这些依赖项,可以仅通过复制 lpngram 目录中的文件来使用库。

如何使用

库对任何类型的Python可迭代对象进行操作,例如字符串、列表和元组。有方法收集普通ngram、跳过ngram和位置ngram。可以指定不同的左右顺序,以及不同的填充符号(如果有的话)。

以下示例从一个包含三个国家名称的短列表中收集最多左序1和最多右序2的ngram。

>>> import lpngram
>>> words = ['Germany', 'Italy', 'Brazil']
>>> model = lpngram.NgramModel(1, 2, sequences=words)

即使没有平滑,该模型也允许您查询特定上下文计数器。这里我们调查哪些字符在 a 之前出现,哪些字符在 Gr 之间出现,以及字符及其计数的完整列表

>>> 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 (45.2 kB 查看散列

上传时间:

构建分布

lpngram-0.2-py3-none-any.whl (39.1 kB 查看散列

上传时间: Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面