给定文档-D1:包含单词(w1,w2,w3) 和文件D2和文字(w2,w3 ..) 和文件Dn和文字(w1,w2,wn)
我可以在大表中构建数据来回答以下问题: 用w1最常出现哪些词, 或w1和w2最常出现的词语。
我想要达到的目的是找到第三个单词Wx(建议),它在文档中最常出现,并且给定单词W1和W2
我知道SQL中的解决方案,但是可以使用google-big table吗?
我知道我必须自己建立我的指数,问题是我应该如何构建它们以避免指数爆炸
感谢 阿尔米尔
答案 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"]
然后查询共现很容易。例如,哪些文档包含google
和engine
?
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
中保存其键,但根据文档的大小,即使这样也是不可行的。