使用Google大表在文档中同时出现单词

时间:2010-01-06 21:30:53

标签: google-app-engine google-cloud-datastore

给定文档-D1:包含单词(w1,w2,w3) 和文件D2和文字(w2,w3 ..) 和文件Dn和文字(w1,w2,wn)

我可以在大表中构建数据来回答以下问题: 用w1最常出现哪些词, 或w1和w2最常出现的词语。

我想要达到的目的是找到第三个单词Wx(建议),它在文档中最常出现,并且给定单词W1和W2

我知道SQL中的解决方案,但是可以使用google-big table吗?

我知道我必须自己建立我的指数,问题是我应该如何构建它们以避免指数爆炸

感谢 阿尔米尔

3 个答案:

答案 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挑战的存在所证明的那样。

答案 1 :(得分:0)

AppEngine数据存储中没有固有的东西可以帮助您解决这个问题。您需要以编程方式索引文档中的单词。

答案 2 :(得分:0)

使用list-properties和merge-join是在Google App Engine中回答设置成员资格问题的最佳方式:Building Scalable, Complex Apps on App Engine

您可以按如下方式设置模型:

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

...

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

然后查询共现很容易。例如,哪些文档包含googleengine

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

docs = [d.name for d in results]

但是有一些限制。来自presentation

  

索引写入并行完成   Bigtable Fast--例如,更新列表   物品1000件1000排   同时写!线性缩放   物品数量限制为5000   每个实体的索引属性

     

但是查询必须解压缩所有结果   实体当列表大小> ~100,读   太贵了!在挂钟慢   时间花费太多CPU

您还可以创建单词模型并仅在StringListProperty中保存其键,但根据文档的大小,即使这样也是不可行的。