2013-10-02 3 views
2

데이터가 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', '밀리그램', '밀리그램' 당신은 질량 측정을 생각할 수 있습니다) 견본 검색 : "

+1

몇 가지 데이터와 예상되는 결과의 간단한 예를 들려 줄 수 있습니까? – tbone

+0

키워드와 search_phrases를 1-1 텍스트 파일로 덤프 할 수 있으면 좋은 사전 필터가 될 수 있습니다. grep -f keywords search_phrases 출력이 약간 친숙 할 수 있습니다. –

+0

패턴 2와 일치하는 것이 있으면 패턴 1의 히트로 간주해서는 안된다고 가정합니다. – Chaosphere2112

답변

0

http://htql.net에서 htql.RegEx를 사용할 수 있습니다. 큰 목록을 잘 처리 할 수 ​​있습니다. 다음은 웹 사이트의 예입니다.

import htql; 
address = '88-21 64th st , Rego Park , New York 11374' 
states=['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 
    'Delaware', 'District Of Columbia', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 
    'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 
    'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 
    'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 
    'Oregon', 'PALAU', 'Pennsylvania', 'PUERTO RICO', 'Rhode Island', 'South Carolina', 'South Dakota', 
    'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 
    'Wyoming']; 

a=htql.RegEx(); 
a.setNameSet('states', states); 

state_zip1=a.reSearchStr(address, "&[s:states][,\s]+\d{5}", case=False)[0]; 
# state_zip1 = 'New York 11374' 
관련 문제