2010-01-06 5 views
0

및 문서 D2, 단어 (w2, w3 ..) 및 문서 Dn과 단어 (w1, w2, w3)가 포함 된 문서 D1 : w2, wn)Google 큰 표가있는 문서에서 단어의 동시 발생

큰 테이블에서 데이터를 구조화하여 과 같은 단어에 대해 가장 자주 발생하는 단어를 w1, 또는 w1 및 w2와 함께 가장 자주 발생하는 단어로 구성 할 수 있습니까?

는 내가 달성하기 위해 시도하고 세 번째 단어 WX 주어진 단어 W1 및 W2

내가 SQL에서 솔루션을 알고 함께 togehter 문서에서 가장 자주 ocures (제안)를 찾는 것입니다,하지만 구글 가능합니다 - 큰 테이블? 나는 나 자신에 의해 내 인덱스를 구축해야 할 것이다 알고

이 문제는 도움이 될 것입니다 AppEngine에 데이터 저장소에 내재 아무것도 없다 내가 지수 폭발을

감사 알미르

답변

0

Google App Engine에서 회원 자격 설정 질문에 답변하려면 list-properties 및 merge-join을 사용하는 것이 가장 좋습니다 : Building Scalable, Complex Apps on App Engine.

class Document(db.Model): 
    word = db.StringListProperty() 
    name = db.StringProperty() 

... 

doc.word = ["google", "app", "engine"] 

는 그 다음은 동시 발생에 대한 쿼리하기 쉬운 것입니다 : 당신은 설정 모델을 다음과 같이 할 수

. 예를 들어 어떤 문서의 단어가 google이고 engine입니까?

results = db.GqlQuery(
"SELECT * FROM Documents " 
"WHERE word = 'google'" 
" and word = 'engine'") 

docs = [d.name for d in results] 

일부 제한 사항이 있습니다. presentation에서 :

지수 쓰기가 Fast-- 예를 들어, Bigtable을에 병렬로 수행되어, 행 동시에 기록 1000 1000 개 항목의 목록 속성을 업데이트! 선형 항목 수와 개체

그러나 쿼리가 모든 결과를 풀어야합니다 당 5000 개 색인 속성으로 제한 저울 목록 크기> ~ 100, 이 너무 비싸다 읽고 실체! 벽 시계 느린 시간 또한 단어의 모델을 만들고 StringListProperty 그들의 키에 저장하지만, 문서의 크기에 따라하는 것은 심지어는 실행 가능하지 않을 수

너무 많은 CPU를 비용.

+0

덕분에 나는 검색어에 나타나지 않지만 단어 W1과 W2에서 자주 발견되는 세 번째 단어를 찾고 있음을 잊어 버렸습니다. 내 질문을 조정했습니다. – zebra

+0

'및 단어 = 'W3' '이 속임수를 쓰겠지 만 온라인으로해야합니까? 이런 종류의 오프라인 처리를 메모리에서하는 것이 더 좋은 생각이라고 생각합니다. – jbochi

+0

하지만 'W3'이 쿼리 결과가 아닌 쿼리 결과로 필요하므로 다른 두 단어와 함께 발생하는 단어를 "제안"해야합니다 – zebra

0

을 피하기 위해 그들을 구조하는 방법입니다 이 문제가 있습니다. 프로그래밍 방식으로 문서의 단어를 색인해야합니다.

1

내가 알고있는이 작업을 수행하는 유일한 방법은 단어 개수와 함께 모든 3 개 튜플을 색인화하는 것입니다. 귀하의 종류는 다음과 같이 보일 것입니다 :

class Tuple(db.Model): 
    words = db.StringListProperty() 
    count = db.IntegerProperty() 

는 그런 다음 삽입하거나 텍스트에서 3 개 독특한 단어의 각 세트에 해당하는 튜플 개체를 업데이트해야합니다. 예를 들어, "왕이 죽었다"라는 문자열은 튜플 (왕,), (왕, 죽은), (죽은), (왕, 죽은) ...이 될 것입니다.이것은 명백하게 엔트리의 기하 급수적 인 폭발을 초래하지만, 당신이하고 싶은 일에 대해 주위를 알지 못합니다.

당신은 같은 것을 할 것, 제안 사항을 확인하는 방법은 다음과 같습니다 추천 알고리즘의 넓은 의미에서

q = Tuple.all().filter('word =', w1).filter('word =', w2).order('-count') 

그러나,이 작업을 수행하는 더 효율적인 방법에 대한 연구가 많이있다. Netflix 챌린지의 존재에 의해 입증 된 바와 같이 공개적인 질문입니다.

관련 문제