2017-03-26 8 views
0

Je travaille sur un problème sur mon projet. J'ai un DB avec colonne où j'ai stocké des types comme "15 mins break" ou "30 min temps libre" Je veux faire une autre colonne avec la catégorie. Mes catégories sont stockées dans le dictionnaire:Trouver le mot du dictionnaire dans la chaîne

{ "short":["10","5","15","10min","5min","15min","shorter"], 
"middle":["20","25","30","35","20min","25min","30min","35min"], 
"long":["40","45","50","55","60","40min","45min","50min","55min","60min"]} 

Toute idée de comment puis-je attribuer à la catégorie des types en utilisant python? Je veux dire juste cette partie pour trouver la similitude avec le mot dans le dictionnaire? mon code jusqu'à présent

...calling sql select 
for i, index in rows(): 
    type = index[0] 
    if (any of words from dictionary) is in type: 
     category = (name of category, for example "short") 
     update in sql 
     ... 

THx

+0

Je n'ai pas vraiment ce que vous voulez. Pouvez-vous donner un exemple avec * input * et * output *? –

+0

Connaissez-vous l'algorithme que vous souhaitez appliquer? Sinon, ce n'est pas le bon endroit pour demander. Si oui, vous devriez le spécifier dans votre question. – WNG

+0

J'ai ajouté un pseudo code de mon code pour mieux comprendre mon problème. – mirko

Répondre

0

Vous voulez savoir si tout des marqueurs de catégorie sont dans la description de rupture. On suppose s1 et s2 êtes-vous des descriptions échantillons et d est votre dictionnaire:

s1 = "15 mins break" 
s2 = "30 min free time" 
s3 = "something5something" 

Ensuite, l'expression suivante évalue leur catégorie (dans le but de re.findall() est de tokenizer le texte, remplacer l'expression régulière avec tout ce qui est approprié pour votre projet.)

[cat for cat in d if any(marker in re.findall(r'[a-z0-9]+',s1) for marker in d[cat])] 
#['short'] 

[cat for cat in d if any(marker in re.findall(r'[a-z0-9]+',s2) for marker in d[cat])] 
#['middle'] 

[cat for cat in d if any(marker in re.findall(r'[a-z0-9]+',s3) for marker in d[cat])] 
#[] 

Ceci suppose que toutes les chaînes sont en minuscules.

+0

J'ai essayé quelque chose comme ça, mais cela me donne de fausses réponses positives. Par exemple quand je regarde dans une chaîne comme: 's =" something5quelque chose "' – mirko

+0

Ensuite, vous avez besoin d'un tokenizer, par exemple 're.findall()' (voir la réponse mise à jour) ou 'nltk.world_tokenize()'. – DyZ

+0

Bon merci, ça marche. Je vais étudier comment et pourquoi ça marche. Ty – mirko