2016-04-03 17 views
0

私は、テキストのブロックから一般的な単語(結合詞、副詞、代名詞など)を削除しようとしています。私は正規表現を使用していますが、なんらかの理由で、フィルタにある一般的な単語のいくつかがフィルタにかけられていません。RegEx一般的な単語のフィルタ

言葉のいくつかの例がフィルタリングされていない: "haventは"、 "なぜ"、 "すべきである"

任意のアイデアはなぜですか?

splitResult = s.split() 
     p = re.compile(
      """^(&|also|a|about|again|all|after|are(nt)?|arent|as|an(y)?|at| 
       bcuz|before|be(low)?|between|bring|but|by|and|can(not)?|close(d)?|could(nt)?| 
       cuz|do(nt)?|down|decide(d)?|decision|on(to)?|or|of|our|over|out|have(nt)?|he(re)?| 
       her|his|other(s)?|even|got(ten)?|for|from|get(s)?|got(ten)?|has(nt)?|havent|he(s)?| 
       him|his|if|in|to|in(to)?|is(nt)?||make|me|once|play(ed)?|role|say(s)?|seen|she(s)?| 
       should(nt)?|stop(ped)?|time|my|no(t)?|must(nt)?|now|you(re)?|your|want|want(ed)?| 
       watch(ed)?|way|we(re)?|will|with||i|a|is(nt)?|just|would(nt)?|before|that|the(re)?| 
       their|them|they|this|turn|when|at|how|it(s)?|which|who|after|then|if|how|because|know(s)?| 
       yet|[A-Za-z]{1,2}|http(s)?://.*|www\..*)$""",re.I) 

     for word in splitResult: 
      m = p.findall(word) 
      if not m: 
       word = "".join(c for c in word if c not in ("?", ".", "!", '"', ",","'","(",")")) 
       wordsList.insert(ctr,word) 
+1

私が見る、これは自然言語処理のためのより適切な仕事だと思いますたとえば、http://stackoverflow.com/questions/9953619/technique-to-remove-common-wordsand-their-plural-versions-from-a-stringを参照してください。 – alecxe

+0

これを[Regex101](https://regex101.com/r/wR0dJ2/1)に入れて、*説明*セクションにエラーが表示されます(強調表示されていませんが)。基本的にあなたは 'is(nt)?|| make'を持っています。これは'(nt)?|| make'で '' || i''と '' | i''でなければなりません。この問題は解決しませんが、あなたのRegExを更新することをお勧めします – Druzion

+0

私は問題を見つけることができませんでした。私はちょうどよりクリーンな出力のためにキャプチャを非キャプチャにしました:see [1]デモ](http://ideone.com/mnC7nr)。共通のエンディングを持つキーワードをグループ化することで、このパターンをより効率的なものにすることができます。 –

答えて

0

あなたのパターンは、その交替の一つとしてwhyを持っていません。

パターンが大きくなって管理できないようです。

周囲の空白やアポストロフィがある場合、パターンが一致しません。

haventshouldがフィルタリングに失敗する理由はありません。より多くのコードがなければ、誰も知らない。

|オルタネータ:次のエラーの2があるregex101.comによると

は(以下はregex101.comのバグですが、あなたはそれにもかかわらず、それに応じて正規表現を修正する必要があります。)

この位置で効果的にグループを切り捨て、

このポイントを超えて他のトークンは役に立たないレンダリングはこれはあなたのコード内の|| sが、本質的に、あることを意味します。

注:空白の文字列に一致する空白と一致させたい場合、この正規表現エンジンはできるだけ早く変更することができるため、後で変更しないでください。ここで

彼らは以下のとおりです。

(正規表現で見つかり: \|\|
  • ||make
  • |with||i

+0

それは素晴らしいキャッチです。エラーメッセージは、改善される可能性があります:)倍精度の '||'は、その時点で正規表現を「何も」一致させません。実際には切り詰めません。 (そうだけど、ルールの中にあるすべて) – usr2564301

+0

@RadLexus私はその言葉を選んでいない。 'regex101.com'にそれを伝えてください。 – Laurel

+0

私はそれを実現する||私はちょうど問題を説明することを考えた。 – usr2564301

関連する問題