ホーム>source

各単語が長いテキストに含まれる回数をカウントする関数を作成しています。以下の関数を短いテキストに使用すると、問題なく実行されます。ただし、非常に長いテキストで実行すると、時間がかかりすぎて返事が返されなくなります。

以下のコードは非効率的で、冗長な部分があるため、ロードに時間がかかりすぎると思います。より効率的なより良い方法はありますか?

def analyse_frequency(x): 
    z = {y : x.count(y) for y in x}
    return sorted(z.items(), key=lambda t: t[1], reverse = True)[:10]

あなたの答え
  • 解決した方法 # 1

    list.count  O(n)複雑さ。 O(n)ループでの操作は特に非効率的です。少なくとも、複雑さO(m *n)、 どこm 一意の単語の数です。

    代わりに、 collections.Counter を使用できます  O(n) 解決:

    words = 'this is a test string of words containing repeated words within the string'
    from collections import Counter
    c = Counter(words.split())
    res = c.most_common(5)
    [('string', 2), ('words', 2), ('this', 1), ('is', 1), ('a', 1)]
    
    

  • 解決した方法 # 2

    ファイル内の単語の頻度を数えるにはカウンター

    from collections import Counter
    f=open ("file.txt","r") 
    words=Counter(f.read().split())
    
    

    これは、単語をキーとして辞書値を出力し、その値としてカウントします。

    何もインポートしたくない場合は、以下をお勧めします。

    f=open("file.txt","r")
    count={}
    for eacword in f.read().split():
        if eacword not in count:
            count[eachword] = 1
        else:
            count[eachword] += 1
    
    

    Nearoの提案によると、次の方法でif elseを回避できます。

    f=open("file.txt","r")
    count={}
    for eacword in f.read().split():
        count[eachword]=count.get(eachword,0)+1
    
    

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ r - lapplyでcol_typeを名前で指定します