bugfix> python > 投稿

パンダのデータフレームに列があり、各セルにはかなり長い単語の文字列が含まれています。これらの文字列はSQLデータベースからのものであり、スペースで区切られた英語以外の単語と英数字のIDフレーズが混在しています。これらの文字列は、SQLの最大文字数まで可能です。これも小さなデータフレームではなく、数百万行あります。

問題は、各セルに正しい英単語だけを保持する最速の方法は何ですか?

以下は、tqdmから提案された速度(したがって、progress_apply)に基づいて完了すると思われる私の最初の方法です。

import pandas as pd
from nltk.corpus import words
from tqdm import tqdm
def check_for_word(sentence):
    s = sentence.split(' ')
    for word in s:
        if word not in words.words():
            s.remove(word)
    return ' '.join(s)
tqdm.pandas(desc="Checking for Words in keywords")
df['keywords'] = df['keywords'].progress_apply(check_for_word) 

かなり速くなる方法はありますか?

ご協力いただきありがとうございます!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

以下の回答は非常に役に立ち、実行に1秒もかかりませんでした(素晴らしい改善です!)。最終的には、nltk.corpusの単語からnltk.corpusのワードネットに変更する必要がありました。これは、単語が目的のリストを網羅していないためです。最終結果は次のようになりました。

from nltk.corpus import wordnet
from tqdm import tqdm
def check_for_word(s):
    return ' '.join(w for w in str(s).split(' ') if len(wordnet.synsets(w)) > 0)
tqdm.pandas(desc="Checking for Words in Keywords")
df['keywords'] = df['keywords'].progress_apply(check_for_word)

実行に43秒かかりました。

回答 1 件
  • words.words()   O(n) を取るリストを返します  リストに単語が存在するかどうかをチェックする時間。時間の複雑さを最適化するために、このリストからセットを作成して、一定時間の検索を提供できます。
    2番目の最適化は、 remove()  リストのメソッドは O(n) を取ります  時間。別のリストを維持して、そのオーバーヘッドを削除できます。さまざまな操作の複雑さの詳細については、https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txtを参照してください。

    set_of_words = set(words.words())
    def check_for_word(sentence):
        s = sentence.split(' ')
        return ' '.join(w for word in s if word in set_of_words)
    
    

あなたの答え