2012-11-06 5 views
3

이것은 내 첫 번째 게시물이므로 사소한 것으로 밝혀지면 사과드립니다. 프로그래밍 세계에 비교적 익숙하지 않으며 파이썬을 처음으로 선택했습니다. "심각한 "OOP 언어. 나는 SO 아카이브를 통해 검색을했으나 내 것과 완전히 관련된 질문을 찾을 수 없었다. 좋아, 길게, 짧은 여기, 문제 :

나는 역 색인에 일하고있다. 나는 따라 그물에 튜토리얼과 팁 몇 가지를 발견하고 난 다음 한 : 단어를 형태소 분석과 기능을 finditer 자신의 시작과 끝 위치 덕분에 그들을 반환파이썬 - 역 색인에 대한 쿼리

  • 수준의 문서. 그들을 토큰 화 (목록에있는 목록) A A 문서의 수집을 소요하고 {'cloud': {0: [(5, 10)]}, 'document': {1: [(11, 19)], 2: [(22, 30)]} ...}처럼

{'word':{document_id:(start_pos, end_pos)}}

의 형태로 역 색인에서 그들을두고

  • 클래스 Inverted_Index. 내가 스택을 읽는 동안

    if nested_dict not in existing_dict: 
        existing_dict[nested_dict] = {} 
    

    내가 "defaultdict 것으로 나타났습니다 owerflow : 은 (I은 문서의 열거 된 컬렉션을 반복, SO 주제의 도움으로 DOCUMENT_ID 않았다 그리고 중첩 된 사전에 대해, 내가 좋아하는, amateurishly을했다. "데이터 유형은이를 수행하는 데있어 매우 우수한 방법이지만 아직"콜렉션 "모듈을 찾지 못했습니다.

    Inverted_Index의 내부 문자열을 쿼리로 사용하는 Query 메서드 (OR 연산자의 버전)를 수행하고 해당 문자열이 내 역 색인의 키/용어와 일치하면 document_id가 다음과 같은 단어의 시작과 끝 지점 :

    [(1, [(0, 4), (11, 19)]), ...] 
    

    그리고 그 후에 나는 붙어있었습니다. 환경과 함께 문서에서 발견 된 단어를 인쇄하는 쿼리 출력을 만들고 싶지만 쿼리 메서드 (start와 end 위치의 document_id)와 역 색인을 연결하는 방법을 모르는데, 자신의 환경에서 일치하는 검색어를 강조하는 방법을 알 수 없습니다. 그렇기 때문에 나는 시작점과 끝점을 만들었지 만 파이썬으로 그것을 강조하는 방법을 모른다. 대담합니까?

    내가 같은 결과 뭔가 생각 :

    ###################
    귀하의 질의 : '초콜릿 푸딩'
    결과 : 1
    yaddi yaddi 옹알 초콜릿 즐 즐 즐 푸딩
    hocolate BLA BLA BLA 푸딩 yaddi의 yaddi 옹알 BLA

    01,235,164 : ID 문서 내에 ########

    즉, 나는 http://docs.python.org/2/library/string.html#string.center을 읽었으며 동일한 열에서 단어/쿼리를 정렬하면 속일 수 있다고 생각합니다. 그러나 나는 거기에 도착하는 방법을 모른다. 그래서 어떤 종류의 힌트라도 훌륭 할 것이다. 왜냐하면 나는 파이썬 뒤에있는 논리를 이해하는데 어려움을 겪고 있기 때문에 내 프로그램에 갇히지 않았기 때문이다. 튜토리얼은하지 않는다. 정의.(예, 저는 파이썬 책을 가지고 있지만, 이런 종류의 문제에 대한 접근법을 확장 시켰습니다. 초보자를위한 것이 아닌 것으로 생각할 수도 있지만, 어디서부터 시작해야할지 모르겠습니다. 어떤 프로그램을 만들어서 만들 수 있을까요? 것은 우리가 대학에서 언어 이론과 정보 검색 이론을 배우지 만, 실제로 우리는 몇 가지 일을합니다.).

    감사합니다. 이 이야기 - 중 - 내 삶의 끝 부분에 대한

    그리고 미안 :

    class inverted_index(dict): 
    
        def __init__(self,collection_of_docs): 
         for doc_id,document in enumerate(collection_of_docs): 
          for word,start,end in document.tokenize(): #form: [('sky', 0, 4)] 
           if word not in self: 
            self[word]={} 
           if doc_id not in self[word]: 
            self[word][doc_id]=[] 
           self[word][doc_id].append((start,end)) 
    
    
        def query(self,query_string): 
         result={} 
         for query_term in re.findall(r'\w+',query_string.lower(),re.UNICODE): 
          for doc_id in self.get(query_term,{}): 
           if doc_id not in result: 
            result[doc_id]=self[query_term][doc_id] 
           else: 
            result[doc_id]=result[doc_id]+self[query_term][doc_id] 
         return sorted(result.items(),key=lambda e:-len(e[1])) 
    
  • +0

    Solr과 같은 상용 문서 색인을 사용하지 않는 이유가 있습니까? – jterrace

    답변

    1

    당신은 'get_with_surroundings'을해야합니다 : D


    나는 막연이 주제를 제작하지 않는, 코드를 잊어 버렸습니다 텍스트에 방법.

    은 당신이 표시해야 할 얼마나 많은 환경에 따라 변경 될 수 있습니다

    class inverted_index(dict): 
        def __init__(self,collection_of_docs): 
         self.collection_of_docs = collection_of_docs #to store those 
         # ... rest of your code 
    
        def get_with_surroundings(document_id, position_tuple): 
         start, end = position_tuple 
         return self.collection_of_docs[document_id].text[start-10:end+10] 
    

    10과 -10과 같이 할 수있다. Document 클래스에는 문서의 일반 파이썬 문자열 인 'text'특성이 있다고 가정합니다.

    쿼리 결과 중 하나를 사용하여이 메서드를 호출하면 필요한 결과를 얻을 수 있습니다.

    How do I print bold text in Python?은 파이썬의 굵은 글씨체에 도움이 될 수 있습니다.