Совместное вхождение слов в документы с большой таблицей Google - PullRequest
0 голосов
/ 07 января 2010

Данный документ-D1: содержащий слова (w1, w2, w3) и документ D2 и слова (w2, w3 ..) и документ Dn и слова (w1, w2, wn)

Могу ли я структурировать свои данные в большой таблице, чтобы ответить на такие вопросы, как: какие слова встречаются чаще всего с w1, или какие слова встречаются чаще всего с w1 и w2.

Я пытаюсь найти третье слово Wx (предложение), которое чаще всего встречается в документах вместе с данными словами W1 и W2

Я знаю решение в SQL, но возможно ли это с большой таблицей Google?

Я знаю, что мне придется самостоятельно строить свои индексы, вопрос в том, как мне их структурировать, чтобы избежать взрыва индекса

спасибо Альмир

Ответы [ 3 ]

1 голос
/ 13 января 2010

Единственный способ сделать это, о котором я знаю, - это проиндексировать все 3 набора слов с их количеством. Ваш вид будет выглядеть примерно так:

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

Затем вам нужно вставить или обновить соответствующую сущность кортежа для каждого набора из 3 уникальных слов в вашем тексте. Например, строка «король мертв» приведет к кортежам (король мертв), (король мертв), (король мертв), (король мертв) ... Это очевидно, приводит к экспоненциальному взрыву в записях, но я не знаю, как это можно сделать для того, что вы хотите сделать.

Чтобы найти предложения, вы должны сделать что-то вроде этого:

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

В более широком смысле алгоритмы рекомендаций, тем не менее, проводится много исследований относительно более эффективных способов сделать это. Это открытый вопрос, о чем свидетельствует наличие проблемы Netflix.

0 голосов
/ 07 января 2010

Использование list-properties и merge-join - лучший способ ответить на множество вопросов о членстве в Google App Engine: Создание масштабируемых, сложных приложений на 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]

Однако есть некоторые ограничения. Из презентации :

Запись в индекс выполняется параллельно Bigtable Fast - например, обновить список свойство 1000 предметов с 1000 строк пишет одновременно! Весы линейно с количеством предметов ограничено до 5000 индексированные свойства на единицу

Но запросы должны распаковывать все результаты объекты Когда размер списка> ~ 100, читает слишком дорого! Медленно в настенных часах время стоит слишком много CPU

Вы также можете создать модель слов и сохранить в StringListProperty только их ключи, но в зависимости от размера ваших документов даже это будет невозможно.

0 голосов
/ 07 января 2010

В хранилище данных AppEngine нет ничего, что помогло бы вам решить эту проблему. Вам нужно будет индексировать слова в документах программно.

...