Python中的相对频率

5

在Python中,是否可以计算列表中元素出现的相对频率呢?

例如:

['apple', 'banana', 'apple', 'orange'] # apple for example would be 0.5

单词的相对频率是什么? - thefourtheye
可能是 https://dev59.com/83E85IYBdhLWcg3wzm5p 的重复问题。 - Daniel
2
@Alpine,这听起来像是你要求我们帮你完成作业。这个程序并不太难。你需要检查列表的长度,并且需要使用字典。 - skyler
5个回答

9

你可以使用NLTK完成这个任务:

import ntlk
text = ['apple', 'banana', 'apple', 'orange']
fd = nltk.FreqDist(text)

请查看书中的教程,以及如何使用源代码

或者,您可以使用计数器:

from collections import Counter
text = ['apple', 'banana', 'apple', 'orange']
c = Counter(text)

1
NLTK 对这个来说不是有点过头了吗? - matsjoyce
NLTK是否过度?这取决于情况。如果您已经安装了NLTK,则它具有“电池包括”功能,可以计算频率分布并打印统计信息(例如most_common等),我发现这非常有用。我做了很多自然语言处理工作,并发现NLTK非常有用。对我来说,它几乎不是过度的 - 只是一个特定工作的有用工具。但是,如果您没有进行任何自然语言处理工作,只是进行一次性频率分布,则它就是过度的。这就是为什么我提供了两个选项的原因。 - craighagerman
2
那不是相对频率,只是计数。相对频率应该是 {apple : 0.5, banana : 0.25, orange : 0.25}。 - Isbister
请参见以下不需要第三方要求的答案:https://dev59.com/K4jca4cB1Zd3GeqP3_K2#58412985。这是一个与NLP无关的问题,因此1)大多数遇到类似问题的人在NLP上不会遇到此问题,2)即使在这种情况下,也不应该假定人们已经安装了nltk,因为有各种各样的NLP框架存在。这涉及到第一个答案;第二部分没有解决所提出的问题,因为它返回绝对频率,而问题要求相对频率。 - pedjjj

4
以下代码段正好实现了问题所需求:给定一个Counter()对象,返回一个包含相同键但相对频率作为值的字典。无需第三方库。
def counter_to_relative(counter):
    total_count = sum(counter.values())
    relative = {}
    for key in counter:
        relative[key] = counter[key] / total_count
    return relative

3
这段简单的代码可以完成任务,它会返回一个元组的列表,但你可以很容易地进行调整。
lst = ['apple', 'banana', 'apple', 'orange']
counts = [(word, lst.count(word) / len(lst)) for word in set(lst)] 

它将返回每个单词的相对频率,如下所示:
[('orange', 0.25), ('banana', 0.25), ('apple', 0.5)]

注意:

  1. 遍历set(lst)以避免重复
  2. lst.count除以len(lst)以获取相对频率

欢迎来到SO!您能添加一些样例输出吗?这样能更清楚地说明代码的作用。 - xjcl

2
你可以通过简单地统计元素在列表中出现的次数来轻松完成此操作。
def relative_frequency(lst, element):
    return lst.count(element) / float(len(lst))

words = ['apple', 'banana', 'apple', 'orange']
print(relative_frequency(words, 'apple'))

0
创建一个字典,以单词为键,出现次数为值。在获得这个字典之后,您可以将每个值除以单词列表的长度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接