2009-07-26 3 views
4

나는 인간이 생성 한 많은 콘텐츠가 있습니다. 가장 자주 발생하는 단어 나 구를 찾고 싶습니다. 이 작업을 수행하는 효율적인 방법은 무엇입니까?단어 빈도를 사용하여 '상위 목록'을 생성하는 알고리즘

+2

자세한 내용을 제공해 줄 수 있습니까? 구체적으로 : "큰 컬렉션"이란 무엇입니까? "효율적인 것은 무엇입니까?" 예 : 당신의 시간 기대는 무엇입니까, 당신은 어떤 언어를 사용하고 있습니까? – hobodave

답변

4

바퀴를 재발 명하지 마십시오. Lucene과 같은 전문 검색 엔진을 사용하십시오.

+1

나는 루신을 좋아하지만, 조금 과잉이라고 생각합니다. 단어를 계산하는 것은 해시 테이블을 사용하여 충분히 간단합니다. –

+1

해결책이 과잉이라고 어떻게 알 수 있습니까? "인간이 만든 콘텐츠의 큰 컬렉션"에 대해 더 잘 이해하고 있습니까? – hobodave

+3

나는 여기에서 말 싸움을 시작하고 싶지 않다. 당신이 옳을 수도 있습니다. 이것이 좋은 해결책이 될 수있는 이유 중 하나는 lucene이 여기에 유용 할만한 훌륭한 tokenizers를 포함하고 있다는 것입니다. 다른 한편으로는 : 1. Lucene은 다소 의존성이 크며, 2를 요구하는 것보다 훨씬 많은 일을하도록 최적화되어 있습니다.해시 테이블은 행성의 모든 언어에서 사용할 수 있지만 루센은 몇 가지 플랫폼으로 제한됩니다. –

3

간단한/쉬운 방법은 해시 테이블을 사용하는 것입니다. 단어를 따라 가면서 카운트를 증가시킵니다.

프로세스가 끝날 때 키/값 쌍을 개수별로 정렬합니다.

+1

이것은 문구에 도움이되지 않습니다. OP는 '단어 또는 구문'에 대해 구체적으로 물었습니다. – hippietrail

3

기본적인 아이디어는 간단합니다 - 당신이 단어를 산출 반복자에 큰 컬렉션을 설정 어떻게 - 실행 의사에, 물론

from collections import defaultdict 

def process(words): 
    d = defaultdict(int) 
    for w in words: d[w] += 1 
    return d 

, 악마가 세부에있다? 단일 시스템에서 처리 할 수는 없지만 mapreduce 접근 방식이 필요합니다. hadoop을 통해? 기타 등등. NLTK은 언어 적 측면 (언어를 분리하지 않는 언어로 단어 분리)을 도와줍니다.

단일 시스템 실행 (mapreduce 사용)에서 발생할 수있는 한 가지 문제점은 단순한 아이디어가 메모리를 채우는 너무 많은 싱글 톤 또는 그 주변 단어 (한 번 또는 몇 번 발생하는 단어)를 제공한다는 것입니다. 확률 론적 반증은 두 가지 패스를 수행하는 것입니다. 하나는 무작위 샘플링 (10 개에서 한 단어 만, 또는 백 개에서 한 개만 가져옴)으로 최상위 순위의 후보 단어 세트를 만든 다음 두 번째 패스는 후보 집합에 없습니다. 샘플링하는 단어의 수와 결과에 원하는 단어의 수에 따라 중요한 단어를 놓칠 확률에 대한 상한을 계산할 수 있습니다 (합리적인 숫자와 자연어의 경우 , 나는 너에게 잘 될거야.).

사전에 단어를 발생 횟수로 매핑하면 발생 횟수로 상위 N 단어를 선택하기 만하면됩니다. 사전이 너무 커서 전체 항목을 기준으로 정렬 할 수없는 경우 힙 대기열이 도움이됩니다 (예를 들어 내가 가장 좋아하는 실행 가능한 의사 코드에서 heapq.nlargest가이를 수행 할 것입니다).

+0

이것은 OP의 단어와 구문에 대해 구체적으로 질문하는 반면, 이것은 단어의 사소한 부분 만 다루고 있습니다. – hippietrail

1

Apriori algorithm을 살펴보십시오. 빈번한 항목 및/또는 빈번한 항목 집합을 찾는 데 사용할 수 있습니다.

위키 피 디아 문서의 상태와 마찬가지로 같은 효과를내는 더 효율적인 알고리즘이 있지만 이것이 상황에 적용되는지 확인하는 좋은 시작이 될 수 있습니다.

-1

단어를 키로하고 값을 카운터로 사용하는 단순한지도가 어떨까요? 높은 값의 카운터를 사용하여 가장 많이 사용되는 단어를 제공합니다. 이것은 단지 O (N) 작업입니다.

+1

이 답변은 이미 제공되었습니다. 두번. – hobodave

+0

그리고 OP의 질문에서 구체적으로 다루는 구절 인 '단어 또는 구'를 무시합니다. – hippietrail