web-dev-qa-db-ja.com

文字列から一般的な単語(およびその複数形)を削除する手法

長いテキスト文字列を解析して、レシピのタグ(キーワード)を見つけようとしています。テキストには、レシピの材料、方向、短い宣伝文が含まれています。

タグリストから一般的な単語を削除する最も効率的な方法は何だと思いますか?

一般的な単語とは、「the」、「at」、「there」、「their」などの単語を意味します

私には2つの方法論がありますが、速度の点でより効率的だと思いますか。また、これを行うためのより効率的な方法を知っていますか。

方法論1:
-各単語が出現する回数を決定します(ライブラリコレクションを使用)
-一般的な単語のリストを用意し、コレクションオブジェクトからそのキーが存在する場合は削除して、コレクションオブジェクトからすべての「一般的な単語」を削除します。
-したがって、速度は変数delimsの長さによって決定されます

import collections from Counter
delim     = ['there','there\'s','theres','they','they\'re'] 
# the above will end up being a really long list!
Word_freq = Counter(recipe_str.lower().split())
for delim in set(delims):
    del Word_freq[delim]
return freq.most_common()

方法論2:
-複数形になる可能性のある一般的な単語については、レシピ文字列の各単語を調べて、一般的な単語の非複数形が部分的に含まれているかどうかを確認します。例えば; 「テストがあります」という文字列については、各単語をチェックして「あり」が含まれているかどうかを確認し、含まれている場合は削除します。

delim         = ['this','at','them'] # words that cant be plural
partial_delim = ['there','they',] # words that could occur in many forms
Word_freq     = Counter(recipe_str.lower().split())
for delim in set(delims):
    del Word_freq[delim]
# really slow 
for delim in set(partial_delims):
    for Word in Word_freq:
        if Word.find(delim) != -1:
           del Word_freq[delim]
return freq.most_common()
18
sazr

私はこのようなことをするだけです:

from nltk.corpus import stopwords
s=set(stopwords.words('english'))

txt="a long string of text about him and her"
print filter(lambda w: not w in s,txt.split())

印刷する

['long', 'string', 'text']

ハッシュセットルックアップがO(1)であると思われる場合は、複雑さの観点から、文字列内の単語数でO(n))にする必要があります。

FWIW、私のバージョンのNLTKは127を定義しています stopwords

'all', 'just', 'being', 'over', 'both', 'through', 'yourselves', 'its', 'before', 'herself', 'had', 'should', 'to', 'only', 'under', 'ours', 'has', 'do', 'them', 'his', 'very', 'they', 'not', 'during', 'now', 'him', 'nor', 'did', 'this', 'she', 'each', 'further', 'where', 'few', 'because', 'doing', 'some', 'are', 'our', 'ourselves', 'out', 'what', 'for', 'while', 'does', 'above', 'between', 't', 'be', 'we', 'who', 'were', 'here', 'hers', 'by', 'on', 'about', 'of', 'against', 's', 'or', 'own', 'into', 'yourself', 'down', 'your', 'from', 'her', 'their', 'there', 'been', 'whom', 'too', 'themselves', 'was', 'until', 'more', 'himself', 'that', 'but', 'don', 'with', 'than', 'those', 'he', 'me', 'myself', 'these', 'up', 'will', 'below', 'can', 'theirs', 'my', 'and', 'then', 'is', 'am', 'it', 'an', 'as', 'itself', 'at', 'have', 'in', 'any', 'if', 'again', 'no', 'when', 'same', 'how', 'other', 'which', 'you', 'after', 'most', 'such', 'why', 'a', 'off', 'i', 'yours', 'so', 'the', 'having', 'once'

もちろん、独自のセットを提供できます。これよりもはるかに多くの単語を削除したい場合を除いて、削除したいすべてのバリエーションを前もって提供するのがおそらく最も簡単(かつ最速)であるというあなたの質問に対するコメントに同意しますが、それはより多くの質問になります偽物を排除するよりも興味深いものを見つけることです。

26
timday

問題のドメインは " 自然言語処理 "です。

車輪の再発明をしたくない場合は、 [〜#〜] nltk [〜#〜] を使用し、ドキュメントで stemming を検索してください。

[〜#〜] nlp [〜#〜] がコンピュータサイエンスで最も難しいテーマの1つであることを考えると、このホイールを再発明することは大変な作業です...

10
Paulo Scardine

あなたは速度について尋ねますが、あなたはより正確さに関心を持つべきです。どちらの提案も多くの間違いを犯し、削除が多すぎたり少なすぎたりします(たとえば、部分文字列 "を含む単語がたくさんありますat ")。次に、nltkモジュールを調べるという提案をします。実際、 NLTK本 の初期の例の1つは、最も一般的な残りの単語がそのジャンルについて何かを明らかにするまで、一般的な単語を削除することを含みます。ツールだけでなく、その方法についての説明もあります。

とにかく、あなたはあなたのコンピュータがそれを実行するのに費やすよりもあなたのプログラムを書くのにはるかに長い時間を費やすでしょう、それでそれをうまくやることに集中してください。

1
alexis