5

正規表現を1つの条件に正確に一致させるにはどうすればよいですか?

たとえば、次の正規表現があります。

(\w+)(?=ly|es|s|y)

式を「眼鏡」という単語と照合すると、次のようになります。

glasse

正しい一致は次のとおりです。

glass (match should be on 'es' rather than 's' as in the match above)

この表現は、次のようなあらゆる種類の単語に対応する必要があります。

films
lovely
glasses
glass

現在、正規表現は上記の単語と次のように一致しています。

film - correct
lovel - incorrect
glasse - incorrect
glas - incorrect

単語の正しい一致は次のとおりです。

film
love
glass
glass

現在私が抱えている問題は、単語に「眼鏡」などの両方が含まれている可能性があるため、正規表現を調整して「s」または「es」のいずれかに正確に対応する方法がわからないことです。

アップデート

これまでの回答ありがとうございます。ステミングの複雑さと言語知識の必要性に感謝します。しかし、私の特定のケースでは、単語は有限であるため(フィルム、素敵な、ガラス、ガラス)、したがって、これらの単語と上記の式の接尾辞にのみ遭遇します。私はこれのための特定のアプリケーションを持っていません。正規表現を使用してそれが可能かどうかを知りたいと思いました。私はそれが不可能であるという結論に達しました、しかし、以下は可能でしょうか:

一致するものが見つかったか、見つからなかったかのいずれかです。たとえば、ガラスは一致しますが、ガラスは一致しませんが、フィルムは一致します。

film (match) - (films)
glass (match) - (glasses)
glass (no match) - (glass)

私が考えているのは、接尾辞を最後から文字列と正確に一致させる方法があるかどうかです。上記の例では、「es」はガラスに一致するため、条件「s」は破棄されます。ガラス(一致しない)の場合、条件「s」はその前に別の「s」があるため破棄され、完全には一致しません。私はこれについて100%ではないことを認めなければならないので、私の論理は少し不安定に見えるかもしれません、それは単なるアイデアです。

4

3 に答える 3

5

ステミングを実行する場合は、Snowballなどのライブラリを使用してください。正規表現でやりたいことはできなくなります。特に、正規表現では、言語の何らかの知識がなければ、末尾の「s」を「フィルム」から削除する必要があるが、「ガラス」から削除する必要があることを知ることはできません。

ステミングとレンマ化に関する膨大な文献があります。Googleはあなたの友達です。

于 2012-12-28T04:24:16.133 に答える
3

あなたがここで抱えている基本的な問題は、

(\w+)(?=ly|es|s|y)

貪欲であり、正規表現全体を一致させながら、可能な限り取得します。使用している正規表現のフレーバーを正確に言っていませんが、試してみてください

(\w+?)(?=ly|es|s|y)

+?と同じ+ですが、が進まないことを意味します。全体的な一致を成功させながら、一致をできるだけ少なくします。

ただし、これには、とに分割glassされるという問題がglasありsます。これを処理するには、次のようなものが必要になります

(\w+?)(?=ly|es|(?<!s)s|y)

ネガティブルックビハインドを使用してs、前に別のsが付いている場合に代替が一致しないようにします。

于 2012-12-28T14:55:13.150 に答える
1

python内/用のそのような種類のソリューションを探している人の場合として、自然言語ツールキットによって提供されるRegexpStemmerがあり、それは非常に高速に動作します

# regex stemmer 
from nltk.stem import RegexpStemmer
rs = RegexpStemmer('ing$|s$|ed$|y$', min=3)
t=time.clock()
train[col]=train[col].apply(lambda x: ' '.join([rs.stem(word) for word in x.split()]))
print(time.clock()-t)

http://www.nltk.org/api/nltk.stem.html

http://snowball.tartarus.org/algorithms/english/stemmer.html

于 2018-02-14T10:26:21.390 に答える