2014-01-07 3 views
4

저는이 포럼이 처음이므로, 매우 긴 질문 인 경우 사과드립니다.다른 긴 목록의 목록을 파이썬으로 검색하십시오.

키워드 목록 및 DB 또는 자유 형식 텍스트 파일에서 생성 된 텍스트 줄 목록을 허용하는 일반 키워드 구문 분석기를 만들려고합니다. 이제 키워드 목록을 기반으로 텍스트 행 목록에서 엔티티를 추출하여 세 가지 핵심 출력을 생성 할 수있게되었습니다.

  • 이 키워드가 언급 된 텍스트 라인과 언급

    1. 키워드,이 키워드가 다음 텍스트 행

    에서 언급 된 시간의

  • 수의 샘플입니다 이 작업을 위해 작성한 파이썬 코드. 당신이 볼 수 있듯이 저는 이것을 3 단계로 성취하려고 노력하고 있습니다.

    단계 - 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) 
    
  • +1

    이것은 좋은 질문 인 것 같습니다. 예제를 약간 잘라 내면 더 나은 답변을 얻을 수 있습니다. 예를 들어 모든 print() 문을 사용할 필요가 없으며 대부분의 변수 사용법을 해결할 수 있습니다 그들의 이름에서. 실패하면, 문제를 보여 주면됩니다 (2 번 통과). 초기 변수 상태에 대한 몇 가지 세부 사항이 도움이 될 것입니다. – Basic

    +0

    지침에 감사드립니다. 코드의 변수 사용에 대한 이해를 돕기 위해 코드 주석을 남겼지만 원치 않는 코드의 모든 부분을 제거했습니다. – ipyinwild

    +0

    그냥 제안하지만, 세 가지 기능, 각 패스마다 하나씩 헤어질 경우 훨씬 더 잘 프로파일 링 할 수 있습니다. 성능에 문제가있는 경우 [프로파일 러] (http://docs.python.org/2.7/library/profile.html)를 통해 작은 데이터 샘플을 사용하여 병목 지점을 정확하게 식별해야합니다. – aquavitae

    답변

    1

    이것은 Aho-Corasick string matching algorithm의 완벽한 사용 사례입니다. 파이썬에서 코드 예제를 사용하여 비슷한 사용 사례에 대한 설명이 this blog post입니다.

    +0

    유망 해 보입니다 ... 일단 유스 케이스에 적응시키는 방법을 이해하면 되돌릴 것입니다. 건배 ... – ipyinwild

    관련 문제