2012-06-14 4 views
5

제목에서 알 수 있듯이 stopWords = ["the", "and", "with", etc...]처럼 단어 목록을 가지고 있으며 "여우와 강아지를 죽여라"와 같은 텍스트가 전송됩니다. 나는 "여우를 죽여라"같은 결과물을 매우 효율적이고 빠르게 원합니다. 나는이 작업을 수행 할 수있는 방법단어 목록이있는 경우 목록에 단어가 포함되어 있지 않고 효율적으로 문자열에 단어가 포함되어 있는지 확인하려면 어떻게해야합니까?

답변

8

가장 중요한 대화 개선이 으로 설정하면 stopWords는 set이됩니다. 이것은 당신이 바로 중지 단어 중 하나가

if any(word in stopWords for word in msg.split()): 
    ... 
+0

정규 표현식을 만드는 것보다 더 효율적입니까? – mlt

+0

@ mlt, 그렇지 않을 수도 있습니다. 이 일과는 너무 다르게 추측하기가 어렵습니다. 정규 표현식을 사용하여 답을 써야합니다. –

1

list comprehension 사용 (내가 루프를 사용하여 반복 할 수 알지만, 매우 효율적이지 먹으 렴) :

stopWords = ["the", "and", "with"] 
msg = "kill the fox and the dog" 

' '.join([w for w in msg.split() if w not in stopWords]) 

을 제공합니다

'kill fox dog' 
+1

'가 각각 확인하기 위해 목록을 반복해야하기 때문에 중지 단어가 길어지면하지 stopWords'에서 승 것은 느린 얻을 것이다. 이런 이유로 stopWords를 설정하는 것이 중요합니다. –

+0

@gnibbler 좋습니다. 감사합니다. 새로운 것을 배울 수있어서 항상 행복합니다 (나는 거의 세트를 사용하지 않습니다) – Levon

0
  1. 사전에 단어의 원래 목록을 넣어 텍스트에있는 경우 알고 싶은 경우 조회가

    stopWords = set(["the", "and", "with", etc...]) 
    " ".join(word for word in msg.split() if word not in stopWords) 
    

    매우 빠르게 될 것을 의미합니다.

  2. 단어의 구분 기호로 공백을 사용하여 주어진 문자열의 문자를 반복합니다. 사전에서 각 단어를 찾으십시오.
3

가장 빠른 작업은 "stopwords"를 목록 대신 설정하고 "x in stopwords"가있는 구성원을 직접 확인하는 것입니다. 이 구조는 이러한 종류의 작업을 위해 빠르게 설계되었습니다.

See the set documentation

0

는 (다른 사람이 제안 같은) set()에 중지 단어를 가지고에 다른 단어를 축적 당시로서는 단순히이 모두와 함께 작업 집합을 가지고 working = working - stopWords를 ... 사용하여 차이 집합을 설정 작업 stopWords가 필터링되었습니다. 또는 단지 그러한 단어의 존재를 확인하기 위해 조건부를 사용하십시오. 예를 들어 :

#!python 
stopWords = set('the a an and'.split()) 
working = set('this is a test of the one working set dude'.split()) 
if working == working - stopWords: 
    print "The working set contains no stop words" 
else: 
    print "Actually, it does" 

실제로 사용할 수있는 이러한 trie 등보다 효율적인 데이터 구조가 있습니다 정지 단어의 집합, 상대적으로 밀도가 큰. 바이너리 (C) 확장자로 쓰여진 것을 볼 수는 없지만 순수 파이썬에서 구현 된 trie와 파이썬의 set() 지원을 사용하는 크로스 오버 포인트가 어디인지 궁금합니다. (그래도 Cython의 좋은 경우 일 수 있습니다.)

실제로 누군가가이 질문을 여기에서 따로 따로 처리했다고 생각합니다. SO: How do I create a fixed length mutable array of python objects in cython.

궁극적으로 간단한 세트 기반 버전을 만들어 테스트하고 프로파일 링 한 다음, 필요할 경우 trie 및 Cython-trie 변형을 가능한 개선 사항으로 시도해야합니다.

0

대신 정규식에서 목록을 조합하고 주변 단어와 함께 하나의 공백으로 단어를 대체 할 수 있습니다.

import re 
stopWords = ["the", "and", "with"] 
input = "Kill the fox and dog" 
pattern = "\\s{:s}\\s".format("\\s|\\s".join(stopWords)) 
print(pattern) 
print(re.sub(pattern, " ", input)) 

출력됩니다

\sthe\s|\sand\s|\swith\s 
Kill fox dog 
관련 문제