基于多种数据源查找多种语言中单词的频率。
项目描述
wordfreq是一个Python库,用于查找多种语言中单词的频率,基于多种数据源。
作者:Robyn Speer
安装
wordfreq需要Python 3,并依赖于一些其他Python模块(msgpack、langcodes和regex)。您可以通过以下方式安装它及其依赖项:
pip3 install wordfreq
通过从pip获取,或者通过获取仓库并使用poetry进行开发安装。
poetry install
有关获取中文、日语和韩语单词频率的额外步骤,请参阅附加CJK安装。
用法
wordfreq提供了对超过40种语言中单词使用频率的估计的访问权限(见下文“支持的语言”)。它使用许多不同的数据源,而不仅仅是语料库中的一个。
它提供“小型”和“大型”单词列表
- “小型”列表占用的内存非常少,并覆盖至少每百万词出现一次的单词。
- “大型”列表覆盖至少每亿词出现一次的单词。
默认列表是“最佳”,如果对语言可用,则使用“大型”,否则使用“小型”。
查找频率最直接的功能是
word_frequency(word, lang, wordlist='best', minimum=0.0)
该函数在给定语言中查找单词的频率,并以0到1之间的十进制数返回其频率。
>>> from wordfreq import word_frequency
>>> word_frequency('cafe', 'en')
1.23e-05
>>> word_frequency('café', 'en')
5.62e-06
>>> word_frequency('cafe', 'fr')
1.51e-06
>>> word_frequency('café', 'fr')
5.75e-05
zipf_frequency
是 word_frequency
的一个变体,旨在以人类友好的对数尺度返回单词频率。Zipf尺度由Marc Brysbaert提出,他创建了SUBTLEX列表。一个单词的Zipf频率是每十亿单词出现的次数的10对数。例如,具有6个Zipf值的单词每千个单词出现一次,而具有3个Zipf值的单词每百万个单词出现一次。
合理的Zipf值在0到8之间,但由于上述截止值,这些列表中出现的最小Zipf值为1.0(对于“大型”单词列表)和3.0(对于“小型”)。对于未出现在给定单词列表中的单词,我们使用0作为默认的Zipf值,尽管它应该表示每十亿单词出现一次。
>>> from wordfreq import zipf_frequency
>>> zipf_frequency('the', 'en')
7.73
>>> zipf_frequency('word', 'en')
5.26
>>> zipf_frequency('frequency', 'en')
4.36
>>> zipf_frequency('zipf', 'en')
1.49
>>> zipf_frequency('zipf', 'en', wordlist='small')
0.0
word_frequency
和 zipf_frequency
的参数是
-
word
:要查找的单词的Unicode字符串。理想情况下,单词是我们的标记器的一个标记,如果不是,仍有可能——请参阅下文的标记化。 -
lang
:要使用的语言BCP 47或ISO 639代码,例如'en'。 -
wordlist
:要使用的单词频率集合。当前选项是'小型'、'大型'和'最佳'。 -
minimum
:如果单词不在列表中或频率低于minimum
,则返回minimum
。您可能希望将其设置为单词列表中包含的最小值,以避免在单词列表结束时出现不连续性。
频率区间
wordfreq的单词列表旨在快速加载并占用存储库中很少的空间。我们通过避免无意义的精度并将单词打包到频率区间中来实现这一点。
在wordfreq中,所有四舍五入到最接近百分之一具有相同Zipf频率的单词具有相同的频率。我们不会存储更多的精度。因此,我们不必存储单词频率为.000011748975549395302,其中大多数数字都是无意义的,我们只需存储频率区间和它们包含的单词。
由于Zipf尺度是对数尺度,因此无论你在单词列表中多远,这都保留了相同的相对精度。任何单词的频率精确到1%。
(这不是关于准确性的声明,而是关于精度。我们相信,通过使用多个数据源并丢弃异常值,wordfreq成为这些单词在书面语言中实际使用方式的更准确测量,但如何衡量这种准确性尚不清楚。)
花样滑冰指标
我们以旨在最小化异常值影响的方式组合来自不同来源的单词频率。这种方法让我想起了奥运会的花样滑冰评分系统。
- 根据每个数据源查找每个单词的频率。
- 对于每个单词,删除赋予它最高和最低频率的来源。
- 平均剩余的频率。
- 将结果频率列表重新缩放,使其总和为1。
数字
如果为每个数字存储单独的频率,例如,如果我们将484977、484978和98.371以及任何其他可能被视为数字的6个字符序列分别存储,则这些单词列表将非常大。
相反,我们对具有相同“形状”的每个数字都有频率区间条目,例如##
或####
或#.#####
,其中#
代表数字。为了与wordfreq的早期版本兼容,我们的占位符字符实际上是0
。这与word2vec词汇表所做的聚合形式相同。
个位数不受此过程影响;“0”到“9”在每个语言的词表中都有各自的条目。
当请求包含多个数字的标记的频率时,我们将该聚合条目的频率乘以一个估计这些数字频率的分布。这个分布只关注两件事
- 第一位数字的值
- 它是否是一个可能代表年份的4位数序列
第一位数字按照Benford定律分配概率,年份则从一个在“现在”达到峰值的分布中分配概率。我在Twitter上的一篇文章中探讨了这个问题:https://twitter.com/r_speer/status/1493715982887571456。
代表“现在”的这一部分分布并不是一个严格意义上的峰值,并且不会像现在一样随着时间的推移而向前移动。相反,它是一个从2019年到2039年长达20年的平台期。(2019年是Google Books Ngrams最后更新的时间,2039年是我可能已经找到了新分布的时间。)
一些例子
>>> word_frequency("2022", "en")
5.15e-05
>>> word_frequency("1922", "en")
8.19e-06
>>> word_frequency("1022", "en")
1.28e-07
除了年份,这个分布不关心数字的意义
>>> word_frequency("90210", "en")
3.34e-10
>>> word_frequency("92222", "en")
3.34e-10
>>> word_frequency("802.11n", "en")
9.04e-13
>>> word_frequency("899.19n", "en")
9.04e-13
数字规则适用于其他数字系统,并且只关注数字的数值
>>> word_frequency("٥٤", "ar")
6.64e-05
>>> word_frequency("54", "ar")
6.64e-05
它不知道哪种语言使用哪种书写系统表示数字
>>> word_frequency("٥٤", "en")
5.4e-05
来源和支持的语言
这些数据来自一个名为《Exquisite Corpus》的Luminoso项目,该项目的目标是下载好的、多样化的多语言语料库数据,适当处理它,并将其组合成统一资源,如wordfreq。
Exquisite Corpus汇集了8个不同的文本领域,其中一些本身来自多个来源
- 维基百科,代表百科全书文本
- 字幕,来自OPUS OpenSubtitles 2018和SUBTLEX
- 新闻,来自NewsCrawl 2014和GlobalVoices
- 书籍,来自Google Books Ngrams 2012
- 网络文本,来自OSCAR
- 推特,代表短格式社交媒体
- Reddit,代表可能更长的互联网评论
- 杂项单词频率:在中文中,我们导入了一个与Jieba分词器一起提供的免费词表,我们不知道其来源
以下语言得到支持,具有合理的标记化,并且至少有3个不同来源的单词频率
Language Code # Large? WP Subs News Books Web Twit. Redd. Misc.
──────────────────────────────┼────────────────────────────────────────────────
Arabic ar 5 Yes │ Yes Yes Yes - Yes Yes - -
Bangla bn 5 Yes │ Yes Yes Yes - Yes Yes - -
Bosnian bs [1] 3 - │ Yes Yes - - - Yes - -
Bulgarian bg 4 - │ Yes Yes - - Yes Yes - -
Catalan ca 5 Yes │ Yes Yes Yes - Yes Yes - -
Chinese zh [3] 7 Yes │ Yes Yes Yes Yes Yes Yes - Jieba
Croatian hr [1] 3 │ Yes Yes - - - Yes - -
Czech cs 5 Yes │ Yes Yes Yes - Yes Yes - -
Danish da 4 - │ Yes Yes - - Yes Yes - -
Dutch nl 5 Yes │ Yes Yes Yes - Yes Yes - -
English en 7 Yes │ Yes Yes Yes Yes Yes Yes Yes -
Finnish fi 6 Yes │ Yes Yes Yes - Yes Yes Yes -
French fr 7 Yes │ Yes Yes Yes Yes Yes Yes Yes -
German de 7 Yes │ Yes Yes Yes Yes Yes Yes Yes -
Greek el 4 - │ Yes Yes - - Yes Yes - -
Hebrew he 5 Yes │ Yes Yes - Yes Yes Yes - -
Hindi hi 4 Yes │ Yes - - - Yes Yes Yes -
Hungarian hu 4 - │ Yes Yes - - Yes Yes - -
Icelandic is 3 - │ Yes Yes - - Yes - - -
Indonesian id 3 - │ Yes Yes - - - Yes - -
Italian it 7 Yes │ Yes Yes Yes Yes Yes Yes Yes -
Japanese ja 5 Yes │ Yes Yes - - Yes Yes Yes -
Korean ko 4 - │ Yes Yes - - - Yes Yes -
Latvian lv 4 - │ Yes Yes - - Yes Yes - -
Lithuanian lt 3 - │ Yes Yes - - Yes - - -
Macedonian mk 5 Yes │ Yes Yes Yes - Yes Yes - -
Malay ms 3 - │ Yes Yes - - - Yes - -
Norwegian nb [2] 5 Yes │ Yes Yes - - Yes Yes Yes -
Persian fa 4 - │ Yes Yes - - Yes Yes - -
Polish pl 6 Yes │ Yes Yes Yes - Yes Yes Yes -
Portuguese pt 5 Yes │ Yes Yes Yes - Yes Yes - -
Romanian ro 3 - │ Yes Yes - - Yes - - -
Russian ru 5 Yes │ Yes Yes Yes Yes - Yes - -
Slovak sk 3 - │ Yes Yes - - Yes - - -
Slovenian sl 3 - │ Yes Yes - - Yes - - -
Serbian sr [1] 3 - │ Yes Yes - - - Yes - -
Spanish es 7 Yes │ Yes Yes Yes Yes Yes Yes Yes -
Swedish sv 5 Yes │ Yes Yes - - Yes Yes Yes -
Tagalog fil 3 - │ Yes Yes - - Yes - - -
Tamil ta 3 - │ Yes - - - Yes Yes - -
Turkish tr 4 - │ Yes Yes - - Yes Yes - -
Ukrainian uk 5 Yes │ Yes Yes - - Yes Yes Yes -
Urdu ur 3 - │ Yes - - - Yes Yes - -
Vietnamese vi 3 - │ Yes Yes - - Yes - - -
[1] 波斯尼亚语、克罗地亚语和塞尔维亚语使用相同的底层词表,因为它们共享大部分词汇和语法,曾经被认为是同一种语言,语言检测无法区分它们。这个词表也可以通过语言代码sh
访问。
[2] 我们拥有的挪威文本是专门用挪威语Bokmål写的,所以我们给它分配语言代码'nb'而不是更模糊的代码'no'。如果我们用'nn'表示Nynorsk,但没有足够的数据将其包含在wordfreq中。
[3] 此数据代表简体和繁体中文书写,主要词汇为普通话。请参见下文“多脚本语言”。
一些语言提供“大”词表,包括具有1.0到3.0之间的Zipf频率的单词。这些在14种受足够数据源覆盖的语言中可用。
其他功能
tokenize(text, lang)
将给定语言中的文本分割成单词,就像wordfreq数据最初计数单词的方式一样。参见标记化。
top_n_list(lang, n, wordlist='best')
按降序频率顺序返回列表中最常见的n个单词。
>>> from wordfreq import top_n_list
>>> top_n_list('en', 10)
['the', 'to', 'and', 'of', 'a', 'in', 'i', 'is', 'for', 'that']
>>> top_n_list('es', 10)
['de', 'la', 'que', 'el', 'en', 'y', 'a', 'los', 'no', 'un']
iter_wordlist(lang, wordlist='best')
按降序频率顺序遍历词表中的所有单词。
get_frequency_dict(lang, wordlist='best')
将词表中的所有频率作为字典返回,适用于您需要查找很多单词且不需要word_frequency
提供的包装器的情况。
available_languages(wordlist='best')
返回一个字典,其键是语言代码,其值是在每种语言中提供所需词表的要加载的数据文件。
get_language_info(lang)
返回一个关于我们如何在该语言中预处理文本的字典信息,例如我们期望它使用哪种脚本,我们将哪些字符一起归一化,以及如何对其进行分词。请参阅其文档字符串以获取更多信息。
random_words(lang='en', wordlist='best', nwords=5, bits_per_word=12)
返回一组随机单词,单词之间用空格分隔。 bits_per_word=n
将从 2^n 个单词中选择每个随机单词。
如果您想要一种简单的方法来获取具有 60 位熵的易于记忆的 xkcd 风格密码,这个函数几乎可以完成这项工作。在这种情况下,您实际上应该运行类似的函数 random_ascii_words
,将选择限制为可以键入 ASCII 的单词。但也许您应该直接使用 xkpa。
分词
wordfreq 使用 Python 包 regex
,这是一个比标准库更高级的正则表达式实现,将文本分为可以一致计数的标记。 regex
产生的标记遵循 Unicode 附录 #29,文本分段 的建议,包括可选规则,该规则在撇号和元音之间分割单词。
有些例外,我们会更改分词以更好地与某些语言配合使用
-
在阿拉伯语和希伯来语中,它还规范化了连字符,并删除了组合标记。
-
在日语和韩语中,它使用外部库
mecab-python3
而不是 regex 库。这是 wordfreq 的可选依赖项,编译它需要安装libmecab-dev
系统包。 -
在中文中,它使用外部 Python 库
jieba
,这也是一个可选依赖项。 -
虽然通常将 @ 符号视为符号而不是单词的一部分,但 wordfreq 允许单词以 "@" 或 "@s" 结尾。这是在西班牙语和葡萄牙语中编写性别中立单词的一种方法。
当 wordfreq 的频率列表最初构建时,单词将根据此函数进行分词。
>>> from wordfreq import tokenize
>>> tokenize('l@s niñ@s', 'es')
['l@s', 'niñ@s']
>>> zipf_frequency('l@s', 'es')
3.03
由于现实世界中的分词远非一致,当您使用实际上分割成多个标记的文本查询时,wordfreq 也会尝试优雅地处理。
>>> zipf_frequency('New York', 'en')
5.32
>>> zipf_frequency('北京地铁', 'zh') # "Beijing Subway"
3.29
单词频率通过使用半调和平均值函数与单词频率相结合,以提供它们组合频率的估计。在中文中,必须从结果单词的频率推断词界,因此对每个必须推断的词界对单词频率进行惩罚。
这种结合单词频率的方法隐含地假设您询问的是经常一起出现的单词。这不是乘以频率,因为这会假设它们在统计上无关。因此,如果您给出不常见的标记组合,它将极大地高估它们的频率。
>>> zipf_frequency('owl-flavored', 'en')
3.3
多脚本语言
我们支持的语言中有两种,塞尔维亚语和中国语,使用多种脚本。为了避免虚假的词频差异,我们在查找这些语言的单词时自动转写字符。
当请求的语言为 sr
或 sh
时,使用标准塞尔维亚转写将使用西里尔字母书写的塞尔维亚文本自动转换为拉丁字母。如果您请求的单词列表为 hr
(克罗地亚语)或 bs
(波斯尼亚语),则不会发生转写。
中文文本在内部转换为一种我们称之为“过度简化中文”的表示形式,其中所有繁体中文字符都被其简化中文等价物替换,即使它们在上下文中不是这样写的。这种表示形式使我们能够使用一种简单的映射来匹配繁体中文和简化中文词汇,在适当的时候统一它们的频率,并且似乎不会在无关词汇之间产生冲突。
列举中文词表会产生一些不熟悉的词汇,因为人们实际上并不使用过度简化中文,而且在实践中,繁体中文和简化中文也有不同的词汇使用。
类似、重叠和不同的语言
尽管我们希望给每种语言分配其独特的代码和独特的词表以及独特的源数据,但语言之间实际上并没有明确的界限。
有时,我们可以方便地假装语言的界限与国家边界一致,遵循“语言是一个有军队和海军的方言”(Max Weinreich)的格言。当语言状况和政治状况不一致时,这就会变得复杂。此外,我们的一些数据源依赖于语言检测,而语言检测当然不知道文本作者是哪个国家的。
因此,我们不得不对如何表示模糊的语言界限做出一些任意的决定,例如中国、马来、克罗地亚/波斯尼亚/塞尔维亚等语言内部的界限。
使用langcodes
模块找到最佳的语言代码匹配,以平滑我们的任意决定。例如,如果您要求在cmn-Hans
(简化中文普通话的完整特定语言代码)下获取词汇频率,您将得到zh
词表。
额外的CJK安装
中文、日文和韩文有额外的外部依赖,以便正确进行标记化。它们可以通过请求'cjk'功能一次安装。
pip install wordfreq[cjk]
您可以将wordfreq[cjk]
放入依赖列表中,例如您自己项目的[tool.poetry.dependencies]
列表。
中文的标记化依赖于jieba
包,日文的标记化依赖于mecab-python3
和ipadic
,韩文的标记化依赖于mecab-python3
和mecab-ko-dic
。
从版本2.4.2开始,您不再需要单独安装字典。
许可证
wordfreq
可以在Apache许可证下免费重新分配(请参阅LICENSE.txt
),并且它包括可能根据创意共享署名-相同方式共享4.0许可证重新分配的数据文件(https://creativecommons.org/licenses/by-sa/4.0/)。
wordfreq
包含从Google Books Ngrams(http://books.google.com/ngrams)和Google Books Syntactic Ngrams(http://commondatastorage.googleapis.com/books/syntactic-ngrams/index.html)提取的数据。这些数据的使用条款是
Ngram Viewer graphs and data may be freely used for any purpose, although
acknowledgement of Google Books Ngram Viewer as the source, and inclusion
of a link to http://books.google.com/ngrams, would be appreciated.
wordfreq
还包含以下创意共享许可来源的数据
-
利兹大学翻译研究中心的利兹互联网语料库(http://corpus.leeds.ac.uk/list.html)
-
维基百科,一个自由的百科全书(http://www.wikipedia.org)
-
ParaCrawl,一个多语言网络爬虫(https://paracrawl.eu)
它包含来自OPUS OpenSubtitles 2018(http://opus.nlpl.eu/OpenSubtitles.php)的数据,这些数据源自OpenSubtitles项目(http://www.opensubtitles.org/),并且可以注明来自OpenSubtitles的使用。
它包含来自各种SUBTLEX词表的数据:SUBTLEX-US、SUBTLEX-UK、SUBTLEX-CH、SUBTLEX-DE和SUBTLEX-NL,由Marc Brysbaert等人创建(请参阅以下引用)并在http://crr.ugent.be/programs-data/subtitle-frequencies提供。
我已经通过电子邮件从Marc Brysbaert那里获得了在wordfreq中分发这些词表的许可,用于任何目的,而不仅仅是学术目的,在这些条件下
- 从Wordfreq及其衍生代码中必须注明SUBTLEX作者。
- 必须明确SUBTLEX是免费的数据。
这些条款类似于Creative Commons署名-相同方式共享许可。
一些额外的数据是通过一个自定义应用程序收集的,该应用程序监视Twitter API流,符合Twitter的开发者协议和政策。该软件提供关于Twitter上常用单词的统计数据;它不会显示或重新发布任何Twitter内容。
引用wordfreq
如果您在研究中使用wordfreq,请引用它!我们通过Zenodo发布代码,以便可以通过DOI可靠地引用。当前引用如下:
Robyn Speer. (2022). rspeer/wordfreq: v3.0 (v3.0.2). Zenodo. https://doi.org/10.5281/zenodo.7199437
以下为BibTex格式的相同引用
@software{robyn_speer_2022_7199437,
author = {Robyn Speer},
title = {rspeer/wordfreq: v3.0},
month = sep,
year = 2022,
publisher = {Zenodo},
version = {v3.0.2},
doi = {10.5281/zenodo.7199437},
url = {https://doi.org/10.5281/zenodo.7199437}
}
引用建立在wordfreq基础上的工作
-
Bojar, O.,Chatterjee, R.,Federmann, C.,Haddow, B.,Huck, M.,Hokamp, C.,Koehn, P.,Logacheva, V.,Monz, C.,Negri, M.,Post, M.,Scarton, C.,Specia, L.,& Turchi, M. (2015). 2015年统计机器翻译研讨会发现。 http://www.statmt.org/wmt15/results.html
-
Brysbaert, M. & New, B. (2009). 超越Kucera和Francis:对当前词频规范的批判性评估以及一个新的改进的美国英语词频测量方法。行为研究方法,41 (4),977-990. http://sites.google.com/site/borisnew/pub/BrysbaertNew2009.pdf
-
Brysbaert, M.,Buchmeier, M.,Conrad, M.,Jacobs, A.M.,Bölte, J.,& Böhl, A. (2011). 词频效应:近期发展综述及其对德语频率估计选择的启示。实验心理学,58,412-424。
-
Cai, Q.,& Brysbaert, M. (2010). SUBTLEX-CH:基于电影字幕的中文单词和字符频率。PLoS One,5(6),e10729. http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0010729
-
Davis, M. (2012). Unicode文本分割。Unicode标准附录,29. http://unicode.org/reports/tr29/
-
Halácsy, P.,Kornai, A.,Németh, L.,Rung, A.,Szakadát, I.,& Trón, V. (2004). 为匈牙利语创建开放语言资源。在第四国际语言资源与评估会议(LREC2004)的论文中。 http://mokk.bme.hu/resources/webcorpus/
-
Keuleers, E.,Brysbaert, M. & New, B. (2010). SUBTLEX-NL:基于电影字幕的荷兰语单词新频率测量。行为研究方法,42(3),643-650. http://crr.ugent.be/papers/SUBTLEX-NL_BRM.pdf
-
Kudo, T. (2005). Mecab:另一个词性标注和形态分析器。 http://mecab.sourceforge.net/
-
Lin, Y.,Michel, J.-B.,Aiden, E. L.,Orwant, J.,Brockman, W.,and Petrov, S. (2012). Google图书Ngram语料库的句法注释。ACL 2012系统演示论文,169-174。 http://aclweb.org/anthology/P12-3029
-
Lison, P. and Tiedemann, J. (2016). OpenSubtitles2016:从电影和电视字幕中提取大型并行语料库。在第十届国际语言资源与评估会议(LREC 2016)的论文中。 http://stp.lingfil.uu.se/~joerg/paper/opensubs2016.pdf
-
Ortiz Suárez, P. J.,Sagot, B.,and Romary, L. (2019). 在中低资源基础设施上处理大型语料库的异步管道。在2019年管理工作大型语料库研讨会(CMLC-7)的论文中。 https://oscar-corpus.com/publication/2019/clmc7/asynchronous/
-
ParaCrawl (2018). 提供官方欧洲语言的Web规模平行语料库。 https://paracrawl.eu/
-
范·休文,W. J.,曼德拉,P.,库勒尔斯,E.,& 布里斯巴特,M. (2014). SUBTLEX-UK:一种新的改进的英国英语词汇频率数据库。实验心理学季刊,67(6),1176-1190。 http://www.tandfonline.com/doi/pdf/10.1080/17470218.2013.850521
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码发行版
构建发行版
wordfreq-3.1.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7943098975f25c2a70e1151ee5a62083b14a5f86f6cc5703cc9526f716ceb408 |
|
MD5 | 08bf3c4dc79d821a184f7fcf5a950e3c |
|
BLAKE2b-256 | 4ccd9581ff0ea2c581012d0caae4bba024f3ff6b46e030a55ddec1ce545e2caf |
wordfreq-3.1.1-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4b1c6ecffc6198be3396d5cf871c4423ca71c907c231348d352dd54d62b97473 |
|
MD5 | 249ce84335635b7206a01f1bcab50d0a |
|
BLAKE2b-256 | 246162835c475d69872d30689f284497853fe33fe1d6dd18f57346d13305861d |