데이터가 db (oracle)에서 왔지만 정규식을 사용하여 python으로 해결하려고합니다. 그러나 합리적인 시간에 프로세스가 완료되지 않을까 염려하여 몇 가지 제안을 사용할 수 있습니다. 키워드, 5000 개의 문자열 목록, 각 길이 < = 40 search_phrases, 1/3 백만 문자열 목록, 각 길이는 50에서 150 사이 found_phrasess, 30 000 문자열 목록, 20, 50 I 양식 patter1을 = 수를 키워드의 패턴을 SEARCH_WORDS를 통해 검색 할Regex가 너무 오래 걸리는 (대용량 데이터 세트)
사이의 길이의 각 하는 pattern2 = 수 KEYWORD1 아무것도 번호 KEYWORD2
는 이러한 패턴을 수집 그런 다음 목록에서 이미 found_phrases에있는 것을 제거하십시오.
found = []
p1 = r'[0-9.]+[/\s-]*'
pattern1 = re.compile(r'|'.join([p1 + word for word in keywords])
for phrase in search_phrases:
found.extend(re.findall(pattern1, phrase))
return set(found).difference(found_phrases)
이 정규 표현식에 있기 때문에 OverflowError 작동하지 않습니다
은 우선은 파이썬에서 다음을 시도했다. 그래서 대신 double for-loop를 수행했습니다.for phrase in search_phrases:
for word in keywords:
found.extend(re.findall(p1 + word, phrase))
그러나 이것은 너무 오래 걸립니다 (아직 완료되지 않았습니다).
파이썬으로 더 빨리 완성하는 방법이나 db에 머물러야한다는 권장 사항 (목록은 두 테이블의 별개의 열 항목 임)을 알고 거기에서 정규식을 수행하는 방법을 배우면, 저에게 알려주세요. 감사.
갱신 1 : 지금 난 단지 (시간 제한) patter1을 검색하고,이 순서로
for word in keywords:
for phrase in search_phrases:
found.extend(re.findall(p1+word, phrase))
에 for 루프의 순서를 전환하고
, 그것은 샘플 SEARCH_PHRASE 목록에서 실행 (30 000 요소) 약 90 초.
grep -f 키워드 search_phrases 인 경우 결과 파일의 길이가 약 5 % 짧아집니다 (대부분의 search_phrases가 일치합니다).
샘플 키워드 : 'g', 'gr', 'G', '그램', '그램', 'mg', '밀리그램', '밀리그램' 당신은 질량 측정을 생각할 수 있습니다) 견본 검색 : "
몇 가지 데이터와 예상되는 결과의 간단한 예를 들려 줄 수 있습니까? – tbone
키워드와 search_phrases를 1-1 텍스트 파일로 덤프 할 수 있으면 좋은 사전 필터가 될 수 있습니다. grep -f keywords search_phrases 출력이 약간 친숙 할 수 있습니다. –
패턴 2와 일치하는 것이 있으면 패턴 1의 히트로 간주해서는 안된다고 가정합니다. – Chaosphere2112