多年来,我多次想要使用不同质量的频率列表(字符,单词,n-gram等),但从未弄清楚如何一起使用它们。
当时我认为只有排名而没有其他数据的列表应该是有用的。从那时起,我学会了Zipf's law和power laws。虽然我不擅长数学,所以我并不完全理解一切。
我在StackOverflow和CrossValidated中发现了一些似乎可能相关的问题。但我要么在正确的层面上理解它们,要么缺乏有用的答案。
我想要的是一种使用全频率数据标准化列表的方法以及仅包含排名数据的列表,以便我可以一起使用这两个列表。
例如,包含频率数据的单词列表:
word per /million
的 50155.13
我 50147.83
你 39629.27
是 28253.52
了 28210.53
不 20543.44
在 12811.05
他 11853.78
我们 11080.02
...
...
... 00000.01
只有排名数据的单词列表:
word rank
的 1
一 2
是 3
有 4
在 5
人 6
不 7
大 8
中 9
...
...
... 100,000
如何将频率数据和排名数据标准化为可以在比较中使用的相同类型的值?
(这个问题中的示例列表只是示例。假设从程序员无法控制的外部源获取更长的列表。)
答案 0 :(得分:3)
很明显,当你有一个包含频率的完整列表时,你可以确定一个等级(按频率按降序排列列表并指定一个等级增量),但不是相反的方式(你怎么知道) ,一个单词出现的次数,给定它排在第3位的信息?你只能推断,它与第2排名位置的单词相比/更低的频率出现,与第4位的单词相比更高/更高的频率)。
应用Zipf定律,您可以将排名映射回一些频率估计并尝试粗略估计频率。但是我不确定这对于不同语言的推广有多好。
[编辑]你现在真的引起了我的注意:)我在Wolfram MathWorld上遇到了Zipf定律this application。我会用我刚才创建的英语术语语料库做一些小实验。我会带着结果回来,只是有点耐心。
[edit2]我现在从Word Frequencies in Written and Spoken English: based on the British National Corpus.(this one获取了一个频率列表,确切地说;它只包含前5000个字左右,但应该足够快速考虑)并应用一个简单的1/rank
来估算频率。我做了一个KNIME工作流程的实验(使用图表的JFreeChart节点和Palladian节点[免责声明:我是Palladian节点的作者]进行RMSE计算),如下所示:
具有实际频率的图表和来自等级的估计看起来如下(等级是对数缩放,抱歉没有在轴上提供足够的标题;蓝线是估计;红线是来自数据集的实际值):
因此,虽然较高级别上存在一些异常值(例如2,3,4),但当将其与TF-IDF或类似的东西结合使用时,频率估计仍然应该是完全不错的。 (RMSE在这种情况下约为0.004,这当然是由于长尾的最小偏差)
这是一个包含一些实际值的片段:
顺便说一句.;另请参阅维基百科关于Zipf's law的文章中的这一部分,其中显示了类似的结果。