저는이 포럼이 처음이므로, 매우 긴 질문 인 경우 사과드립니다.다른 긴 목록의 목록을 파이썬으로 검색하십시오.
키워드 목록 및 DB 또는 자유 형식 텍스트 파일에서 생성 된 텍스트 줄 목록을 허용하는 일반 키워드 구문 분석기를 만들려고합니다. 이제 키워드 목록을 기반으로 텍스트 행 목록에서 엔티티를 추출하여 세 가지 핵심 출력을 생성 할 수있게되었습니다.
- 키워드,이 키워드가 다음 텍스트 행
에서 언급 된 시간의
단계 - 1을 줄이기 위해 키워드에 인덱스 형 검색을 수행 - 나는 텍스트 라인
2 단계 (1 개 구문 분석 패스) 목록에서 알려진 모든 원치 않는 줄을 제거 할 수 있도록 순서를 수락 거부 전체 루프 검색을 수행해야하는 행 목록
3 단계 - 전체 반복 검색을 수행하십시오.
문제점 : 3 단계 (코드에서 2 번 통과)는 매우 효율적이며 4500 개의 요소가있는 키워드 목록 및 거의 200 만 개의 행이있는 텍스트 행의 예입니다. 코드는 24 시간 이상 실행됩니다.
누구나 패스 2를하는 더 좋은 방법을 제안 할 수 있습니까? 또는 전체 기능을 작성하는 더 좋은 방법이 있다면?
저는 파이썬 초보자입니다. 따라서 내가 명백한 것을 놓친 경우, 사전에 사과하십시오.
##########################################################################################
# The keyWord parser conducts a 2 pass keyword lookup and parsing.
# Inputs:
# keywordIDsList - Is a list of the IDs of the keyword (Standard declaration: keywordIDsList[]= Hash value of the keyWords)
# KeywordDict - is the Dict of all the keywords and the associated ID.
# (Standard declaration: keywordDict[keywordID]=(keywordID, keyWord) where keywordID is hash value in keywordIDsList)
# valueIDsList - Is a list of the IDs of all the values that need to be parsed (Standard declaration: valueIDsList[]= Unique reference number of the values)
# valuesDict - Is the Dict of all the value lines and the associated IDs.
# (Standard declaration: valuesDict[uniqueValueKey]=(uniqueValueKey, valueText) where uniqueValueKey is the unique key in valueIDsList)
# rejectPattern - A regular expression based pattern for rejecting columns with certain types of patterns. This is an optional field.
# Outputs:
# parsedHashIDsList - Is the a hash value that is generated for every successful parse results
# parsedResultsDict - Is actual parsed value as parsedResultsDict[parsedHashID]=(uniqueValueKey, keywordID, frequencyResult)
# successResultIDsList - list of all unique value references that were parsed successfully
# rejectResultIDsList - list of all unique value references that were rejected
##########################################################################################
def keywordParser(keywordIDsList, keywordDict, valueIDsList, valuesDict, rejectPattern):
parsedResultsDict = {}
parsedHashIDsList = []
successResultIDsList = []
rejectResultIDsList = []
processListPass1 = []
processListPass2 = []
idxkeyWordDict = {}
for keyID in keywordIDsList:
keywordID, keyWord = keywordDict[keyID]
idxkeyWordDict[keyWord] = (keywordID, keyWord)
percCount = 1
# optional: if rejectPattern is provided then reject lines
# ## Some python code for processing the reject patterns - this works fine
# Pass 1: Index based matching - partial code for index based search
for valueID in processListPass1:
valKey, valText = valuesDict[valueID]
try:
keyWordVal, keywordID = idxkeyWordDict[valText]
except:
processListPass2.append(valueID)
percCount = 0
# Pass 2: Text based search and lookup - this part of the code is extremely inefficient
for valueID in processListPass2:
percCount += 1
valKey, valText = valuesDict[valueID]
valSuccess = 'N'
for keyID in keywordIDsList:
keyWordVal, keywordID = keywordDict[keyID]
keySearch = re.findall(keyWordVal, valText, re.DOTALL)
if keySearch:
parsedHashID = hash(str(valueID) + str(keyID))
parsedResultsDict[parsedHashID] = (valueID, keywordID, len(keySearch))
valSuccess = 'Y'
if valSuccess == 'Y':
successResultIDsList.append(valueID)
else:
rejectResultIDsList.append(valueID)
return (parsedResultsDict, parsedHashIDsList, successResultIDsList, rejectResultIDsList)
이것은 좋은 질문 인 것 같습니다. 예제를 약간 잘라 내면 더 나은 답변을 얻을 수 있습니다. 예를 들어 모든 print() 문을 사용할 필요가 없으며 대부분의 변수 사용법을 해결할 수 있습니다 그들의 이름에서. 실패하면, 문제를 보여 주면됩니다 (2 번 통과). 초기 변수 상태에 대한 몇 가지 세부 사항이 도움이 될 것입니다. – Basic
지침에 감사드립니다. 코드의 변수 사용에 대한 이해를 돕기 위해 코드 주석을 남겼지만 원치 않는 코드의 모든 부분을 제거했습니다. – ipyinwild
그냥 제안하지만, 세 가지 기능, 각 패스마다 하나씩 헤어질 경우 훨씬 더 잘 프로파일 링 할 수 있습니다. 성능에 문제가있는 경우 [프로파일 러] (http://docs.python.org/2.7/library/profile.html)를 통해 작은 데이터 샘플을 사용하여 병목 지점을 정확하게 식별해야합니다. – aquavitae