【问题标题】:Count frequency of words in a list and sort by frequency计算列表中单词的频率并按频率排序
【发布时间】:2013-12-28 22:22:05
【问题描述】:

我正在使用 Python 3.3

我需要创建两个列表,一个用于唯一单词,另一个用于单词的频率。

我必须根据频率列表对唯一单词列表进行排序,以便频率最高的单词在列表中排在第一位。

我有文本设计,但不确定如何在 Python 中实现它。

目前我发现的方法要么使用Counter,要么使用我们没有学过的字典。我已经从包含所有单词的文件中创建了列表,但不知道如何找到列表中每个单词的频率。我知道我需要一个循环来执行此操作,但无法弄清楚。

这是基本设计:

 original list = ["the", "car",....]
 newlst = []
 frequency = []
 for word in the original list
       if word not in newlst:
           newlst.append(word)
           set frequency = 1
       else
           increase the frequency
 sort newlst based on frequency list 

【问题讨论】:

  • 我们很难知道你知道什么。你学会set了吗?列表的count 方法?等等。用有意义的术语界定问题。
  • 为什么不允许你使用你没有学过的东西?这些天不鼓励提前学习吗?
  • Trie 将是一个相当有效的选择。您可以仅使用列表构建一个
  • 请考虑接受答案。

标签: python python-3.x list frequency word


【解决方案1】:

使用这个

from collections import Counter
list1=['apple','egg','apple','banana','egg','apple']
counts = Counter(list1)
print(counts)
# Counter({'apple': 3, 'egg': 2, 'banana': 1})

【讨论】:

  • 恒星解决方案
  • 到 2021 年仍然很强劲,还有很长的路要走。
【解决方案2】:

你可以使用

from collections import Counter

它支持Python 2.7,阅读更多信息here

1.

>>>c = Counter('abracadabra')
>>>c.most_common(3)
[('a', 5), ('r', 2), ('b', 2)]

使用字典

>>>d={1:'one', 2:'one', 3:'two'}
>>>c = Counter(d.values())
[('one', 2), ('two', 1)]

但是,你必须先读取文件,然后转换成字典。

2。 这是 python 文档示例,使用 re 和 Counter

# Find the ten most common words in Hamlet
>>> import re
>>> words = re.findall(r'\w+', open('hamlet.txt').read().lower())
>>> Counter(words).most_common(10)
[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),
 ('you', 554),  ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]

【讨论】:

    【解决方案3】:
    words = file("test.txt", "r").read().split() #read the words into a list.
    uniqWords = sorted(set(words)) #remove duplicate words and sort
    for word in uniqWords:
        print words.count(word), word
    

    【讨论】:

    • 一个很棒的python方式!
    • 你用大文件测试过代码吗?如果文件太大,将花费大量时间。收集更有效。
    • 这不如Counter。当您执行set(words) 时,您不必要地丢弃计数,因此每次您需要计数时,您都必须使用words.count(word) 查找每个计数,这将是低效的,尤其是。用于大文本。
    【解决方案4】:

    熊猫回答:

    import pandas as pd
    original_list = ["the", "car", "is", "red", "red", "red", "yes", "it", "is", "is", "is"]
    pd.Series(original_list).value_counts()
    

    如果您希望它按升序排列,则很简单:

    pd.Series(original_list).value_counts().sort_values(ascending=True)
    

    【讨论】:

      【解决方案5】:

      另一种解决方案,使用另一种算法,不使用集合:

      def countWords(A):
         dic={}
         for x in A:
             if not x in  dic:        #Python 2.7: if not dic.has_key(x):
                dic[x] = A.count(x)
         return dic
      
      dic = countWords(['apple','egg','apple','banana','egg','apple'])
      sorted_items=sorted(dic.items())   # if you want it sorted
      

      【讨论】:

        【解决方案6】:

        一种方法是制作一个列表列表,新列表中的每个子列表都包含一个单词和一个计数:

        list1 = []    #this is your original list of words
        list2 = []    #this is a new list
        
        for word in list1:
            if word in list2:
                list2.index(word)[1] += 1
            else:
                list2.append([word,0])
        

        或者,更有效:

        for word in list1:
            try:
                list2.index(word)[1] += 1
            except:
                list2.append([word,0])
        

        这比使用字典效率低,但它使用了更基本的概念。

        【讨论】:

          【解决方案7】:

          您可以使用 reduce() - 一种功能性方式。

          words = "apple banana apple strawberry banana lemon"
          reduce( lambda d, c: d.update([(c, d.get(c,0)+1)]) or d, words.split(), {})
          

          返回:

          {'strawberry': 1, 'lemon': 1, 'apple': 2, 'banana': 2}
          

          【讨论】:

            【解决方案8】:

            使用 Counter 会是最好的方法,但如果你不想这样做,你可以通过这种方式自己实现。

            # The list you already have
            word_list = ['words', ..., 'other', 'words']
            # Get a set of unique words from the list
            word_set = set(word_list)
            # create your frequency dictionary
            freq = {}
            # iterate through them, once per unique word.
            for word in word_set:
                freq[word] = word_list.count(word) / float(len(word_list))
            

            freq 将以您已经拥有的列表中每个单词的频率结束。

            你需要 float 将其中一个整数转换为浮点数,因此结果值将是浮点数。

            编辑:

            如果你不能使用 dict 或 set,这里有另一种效率较低的方法:

            # The list you already have
            word_list = ['words', ..., 'other', 'words']
            unique_words = []
            for word in word_list:
                if word not in unique_words:
                    unique_words += [word]
            word_frequencies = []
            for word in unique_words:
                word_frequencies += [float(word_list.count(word)) / len(word_list)]
            for i in range(len(unique_words)):
                print(unique_words[i] + ": " + word_frequencies[i])
            

            unique_wordsword_frequencies 的索引将匹配。

            【讨论】:

              【解决方案9】:

              理想的方法是使用将单词映射到其计数的字典。但如果你不能使用它,你可能想要使用 2 个列表 - 1 个存储单词,另一个存储单词计数。请注意,单词的顺序和计数在这里很重要。实现这一点很困难,效率也不高。

              【讨论】:

              • 事实证明我必须努力,所以我需要两个列表。我存储了单词,但不确定如何存储频率,以便我能够根据频率列表对单词列表进行排序。
              【解决方案10】:

              试试这个:

              words = []
              freqs = []
              
              for line in sorted(original list): #takes all the lines in a text and sorts them
                  line = line.rstrip() #strips them of their spaces
                  if line not in words: #checks to see if line is in words
                      words.append(line) #if not it adds it to the end words
                      freqs.append(1) #and adds 1 to the end of freqs
                  else:
                      index = words.index(line) #if it is it will find where in words
                      freqs[index] += 1 #and use the to change add 1 to the matching index in freqs
              

              【讨论】:

                【解决方案11】:

                这是支持您的问题的代码 is_char() 单独检查验证字符串计数那些字符串,Hashmap 是 python 中的字典

                def is_word(word):
                   cnt =0
                   for c in word:
                
                      if 'a' <= c <='z' or 'A' <= c <= 'Z' or '0' <= c <= '9' or c == '$':
                          cnt +=1
                   if cnt==len(word):
                      return True
                  return False
                
                def words_freq(s):
                  d={}
                  for i in s.split():
                    if is_word(i):
                        if i in d:
                            d[i] +=1
                        else:
                            d[i] = 1
                   return d
                
                 print(words_freq('the the sky$ is blue not green'))
                

                【讨论】:

                  【解决方案12】:
                  for word in original_list:
                     words_dict[word] = words_dict.get(word,0) + 1
                  
                  sorted_dt = {key: value for key, value in sorted(words_dict.items(), key=lambda item: item[1], reverse=True)}
                  
                  keys = list(sorted_dt.keys())
                  values = list(sorted_dt.values())
                  print(keys)
                  print(values)
                  

                  【讨论】:

                    【解决方案13】:

                    最好的办法是:

                    def wordListToFreqDict(wordlist):
                        wordfreq = [wordlist.count(p) for p in wordlist]
                        return dict(zip(wordlist, wordfreq))
                    

                    然后尝试: wordListToFreqDict(originallist)

                    【讨论】:

                    • 这几乎不是执行此操作的“最佳”方式。您只需要对文本进行一次传递即可计算单词的频率,而在这里您需要对每个唯一单词进行一次传递。
                    • 它甚至没有为每个唯一的单词添加约束。
                    猜你喜欢
                    • 1970-01-01
                    • 2014-11-07
                    • 2022-01-18
                    • 2015-01-07
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多