2010-01-06 2 views
0

Etant donné le document D1: contenant les mots (w1, w2, w3) et le document D2 et les mots (w2, w3 ..) et le document Dn et les mots (w1, w2, WN)Cooccurrence de mots dans des documents avec un grand tableau Google

Puis-je structurer mes données en grande table pour répondre aux questions telles que: quels mots se produisent le plus souvent avec w1, ou que les mots se produisent le plus souvent avec w1 et w2.

Ce que je suis en train de réaliser est de trouver le troisième mot Wx (suggestion) qui ocures le plus souvent dans les documents togehter avec des mots W1 et W2

données Je sais la solution dans SQL, mais est-il possible avec Google -grande table?

Je sais que je dois construire mes indices par moi-même, la question est de savoir comment dois-je les structurer pour éviter une explosion de l'indice

grâce Almir

Répondre

0

Utiliser la liste des propriétés et-fusion-jointure est la meilleure façon de répondre à des questions d'adhésion définies dans Google App Engine: Building Scalable, Complex Apps on App Engine.

Vous pourriez configurer votre modèle comme suit:

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

... 

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

Ensuite, il serait facile d'interroger pour la co-occurrence. Par exemple, quels documents ont les mots google et engine?

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

docs = [d.name for d in results] 

Il existe cependant certaines limites. De l'presentation:

sont effectués Index écrit en parallèle sur BigTable Fast-- par exemple, mettre à jour une liste propriété de 1000 points avec 1000 ligne écrit en même temps! Échelles linéaire avec nombre d'articles Limité à 5000 propriétés indexées par entité

Mais les requêtes doivent décompacter tous les résultats entités Lorsque la taille de la liste> ~ 100, se lit comme suit sont trop chers! Lente dans le temps mur-horloge coûte trop cher CPU

Vous pouvez aussi créer un modèle de mots et d'enregistrer dans les StringListProperty que leurs clés, mais en fonction de la taille de vos documents même qui ne serait pas possible.

+0

merci j'ai oublié de mentionner que je cherche le troisième mot qui n'apparaît pas dans la requête mais est souvent trouvé avec les mots W1 et W2, j'ai ajusté ma question – zebra

+0

'et word = 'W3'' ferait l'affaire, mais avez-vous besoin de le faire en ligne? Je pense que c'est une meilleure idée de faire ce genre de traitement hors ligne, en mémoire. – jbochi

+0

mais j'ai besoin de 'W3' à la suite de la requête, pas comme entrée de requête, il devrait "suggérer" les mots co-occurrents avec d'autres deux – zebra

0

Il n'y a rien d'inhérent à la datastore AppEngine qui aidera vous avec ce problème. Vous aurez besoin d'indexer les mots dans les documents par programme.

1

La seule façon de le faire que je suis au courant est d'indexer tous les 3 triplets de mots, avec leurs chefs d'accusation. Votre genre ressemblerait à quelque chose comme ceci:

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

Ensuite, vous devez insérer ou mettre à jour l'entité tuple appropriée pour chaque ensemble de 3 mots uniques dans votre texte. Par exemple, la chaîne "le roi est mort" se traduirait par les tuples (le, roi, est), (le, roi, mort), (le, est, mort), (roi, est, mort) ...Cela entraîne évidemment une explosion exponentielle des entrées, mais je ne suis pas au courant de ce que vous voulez faire.

Pour trouver les suggestions, vous feriez quelque chose comme ceci:

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

Au sens large des algorithmes de recommandation, cependant, il y a beaucoup de recherches sur des moyens plus efficaces de le faire. C'est une question ouverte, comme en témoigne l'existence du défi Netflix.

Questions connexes