1

一連の文をチェックして、文の中にいくつかのシード ワードが含まれているかどうかを確認したいと考えています。しかし、私は使用を避けたいと思ってfor seed in lineringますbring.

また、ドキュメントに複数語表現 (MWE) likeword with spacesが含まれているかどうかも確認したいと思います。

私はこれを試しましたが、これは非常に遅いです.これを行うより速い方法はありますか?

seed = ['words with spaces', 'words', 'foo', 'bar', 
        'bar bar', 'foo foo foo bar', 'ring']

 docs = ['these are words with spaces but the drinks are the bar is also good', 
    'another sentence at the foo bar is here', 
    'then a bar bar black sheep, 
    'but i dont want this sentence because there is just nothing that matches my list',
    'i forgot to bring my telephone but this sentence shouldn't be in the seeded docs too']

docs_seed = []
for d in docs:
  toAdd = False
  for s in seeds:
    if " " in s:
      if s in d:
        toAdd = True
    if s in d.split(" "):
      toAdd = True
    if toAdd == True:
      docs_seed.append((s,d))
      break
print docs_seed

目的の出力は次のようになります。

[('words with spaces','these are words with spaces but the drinks are the bar is also good')
('foo','another sentence at the foo bar is here'), 
('bar', 'then a bar bar black sheep')]
4

2 に答える 2

3

正規表現の使用を検討してください。

import re

pattern = re.compile(r'\b(?:' + '|'.join(re.escape(s) for s in seed) + r')\b')
pattern.findall(line)

\b「単語」(単語文字のシーケンス)の開始または終了に一致します。

例:

>>> for line in docs:
...     print pattern.findall(line)
... 
['words with spaces', 'bar']
['foo', 'bar']
['bar', 'bar']
[]
[]
于 2013-02-27T08:10:16.687 に答える
0

これは機能し、現在のアプローチよりもいくらか高速になるはずです。

docs_seed = []
for d in docs:
    for s in seed:
        pos = d.find(s)
        if not pos == -1 and (d[pos - 1] == " " 
               and (d[pos + len(s)] == " " or pos + len(s) == len(d))):
            docs_seed.append((s, d))
            break

findドキュメント内の値の位置seed(または、見つからない場合は-1)を指定し、値の前後の文字がスペースである(または文字列が部分文字列の後に終了する)ことを確認します。これにより、マルチワード式が単語の境界で開始または終了する必要がないという元のコードのバグも修正されます。元のコードは"words with spaces"、のような入力と一致します"swords with spaces"

于 2013-02-27T08:07:25.250 に答える