나는 인간이 생성 한 많은 콘텐츠가 있습니다. 가장 자주 발생하는 단어 나 구를 찾고 싶습니다. 이 작업을 수행하는 효율적인 방법은 무엇입니까?단어 빈도를 사용하여 '상위 목록'을 생성하는 알고리즘
답변
바퀴를 재발 명하지 마십시오. Lucene과 같은 전문 검색 엔진을 사용하십시오.
나는 루신을 좋아하지만, 조금 과잉이라고 생각합니다. 단어를 계산하는 것은 해시 테이블을 사용하여 충분히 간단합니다. –
해결책이 과잉이라고 어떻게 알 수 있습니까? "인간이 만든 콘텐츠의 큰 컬렉션"에 대해 더 잘 이해하고 있습니까? – hobodave
나는 여기에서 말 싸움을 시작하고 싶지 않다. 당신이 옳을 수도 있습니다. 이것이 좋은 해결책이 될 수있는 이유 중 하나는 lucene이 여기에 유용 할만한 훌륭한 tokenizers를 포함하고 있다는 것입니다. 다른 한편으로는 : 1. Lucene은 다소 의존성이 크며, 2를 요구하는 것보다 훨씬 많은 일을하도록 최적화되어 있습니다.해시 테이블은 행성의 모든 언어에서 사용할 수 있지만 루센은 몇 가지 플랫폼으로 제한됩니다. –
간단한/쉬운 방법은 해시 테이블을 사용하는 것입니다. 단어를 따라 가면서 카운트를 증가시킵니다.
프로세스가 끝날 때 키/값 쌍을 개수별로 정렬합니다.
이것은 문구에 도움이되지 않습니다. OP는 '단어 또는 구문'에 대해 구체적으로 물었습니다. – hippietrail
기본적인 아이디어는 간단합니다 - 당신이 단어를 산출 반복자에 큰 컬렉션을 설정 어떻게 - 실행 의사에, 물론
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가이를 수행 할 것입니다).
이것은 OP의 단어와 구문에 대해 구체적으로 질문하는 반면, 이것은 단어의 사소한 부분 만 다루고 있습니다. – hippietrail
Apriori algorithm을 살펴보십시오. 빈번한 항목 및/또는 빈번한 항목 집합을 찾는 데 사용할 수 있습니다.
위키 피 디아 문서의 상태와 마찬가지로 같은 효과를내는 더 효율적인 알고리즘이 있지만 이것이 상황에 적용되는지 확인하는 좋은 시작이 될 수 있습니다.
단어를 키로하고 값을 카운터로 사용하는 단순한지도가 어떨까요? 높은 값의 카운터를 사용하여 가장 많이 사용되는 단어를 제공합니다. 이것은 단지 O (N) 작업입니다.
이 답변은 이미 제공되었습니다. 두번. – hobodave
그리고 OP의 질문에서 구체적으로 다루는 구절 인 '단어 또는 구'를 무시합니다. – hippietrail
자세한 내용을 제공해 줄 수 있습니까? 구체적으로 : "큰 컬렉션"이란 무엇입니까? "효율적인 것은 무엇입니까?" 예 : 당신의 시간 기대는 무엇입니까, 당신은 어떤 언어를 사용하고 있습니까? – hobodave