1
votes

Rechercher un mot-clé dans l'entrée utilisateur et trouver le mot-clé correspondant dans le dictionnaire

Je fais un moteur de recherche, j'ai essayé de coder de sorte que lorsque l'utilisateur saisit certains des mots-clés, il recherche le mot-clé dans le dictionnaire et imprime la clé et les éléments.

Canada = {'name': 'Canada', 'continent': 'North America', 'capital': 'Ottawa', 'currency': 'Canadian dollar',
          'population': '32,268,240', 'area': '9,970,610'}
Laos = {'name': 'Laos', 'continent': 'Asia', 'capital': 'Vientiane', 'currency': 'Lao kip',
          'population': '5,924,145', 'area': '236,800'}
Mexico = {'name': 'Mexico', 'continent': 'North America', 'capital': 'Mexico City', 'currency': 'Mexico peso',
        'population': '107,029,400', 'area': '1,958,201'}
key_words = ("Canada", "Mexico", "Laos")
key = ("area", "population", "currency")
user_input = input("Type: ")

for word in user_input.split():
   if word in key_words:
      print()

Pourriez-vous m'aider avec le codage pour que: Par exemple: Lorsque l'utilisateur saisit: "monnaie du Mexique", il imprimera: peso mexicain, ou lorsque l'utilisateur saisira: "région du Laos", il imprimera 236.800.


4 commentaires

Et pourquoi pensez-vous que le code publié pourrait y parvenir?


As-tu une question?


Je suis désolé de ne pas avoir publié la question correctement, je l'ai modifiée maintenant.


tout d'abord le texte split () en mots, puis vérifiez chaque mot de chaque dictionnaire. La plupart des mots doivent être comparés aux clés - c'est-à-dire. area - mais certains avec des valeurs - c'est-à-dire. Mexique . Ou conservez tous les dictionnaires dans un seul dictionnaire et utilisez le nom comme clé - data = {"Mexico": {'area': '1,958,201'}}


3 Réponses :


0
votes

Vous devez définir certaines règles que l'utilisateur doit suivre, vous pouvez créer un moteur de recherche de requête floue à partir de zéro, mais ce n'est pas quelque chose qui va se passer aujourd'hui. Pour l'instant, faites en sorte que l'utilisateur spécifie ce qu'il veut, par exemple. PAYS DE L'ÉLÉMENT .

Enter query: population and currency of mexico
>> currency Mexico peso
>> population 107,029,400

Vous pouvez restructurer votre code comme ceci en utilisant un dictionnaire pour contenir toutes vos données au lieu de le diviser en variables.

database = {
    'canada': {
        'name': 'Canada',
        'continent': 'North America',
        'capital': 'Ottawa',
        'currency': 'Canadian dollar',
        'population': '32,268,240',
        'area': '9,970,610'
        },
    'laos' : {
        'name': 'Laos',
        'continent': 'Asia',
        'capital': 'Vientiane',
        'currency': 'Lao kip',
          'population': '5,924,145',
        'area': '236,800'
        },
    'mexico': {
        'name': 'Mexico',
        'continent': 'North America',
        'capital': 'Mexico City',
        'currency': 'Mexico peso',
        'population': '107,029,400',
        'area': '1,958,201'
        }
    }

user_input = input("Enter your query: ")
user_input = user_input.lower().split(' ')

# find country
country = None
for keyword in user_input:
    if keyword in database:
        # using .pop() removes the country from the list
        country = user_input.pop(user_input.index(keyword))

# If the user entered a valid country
if country:
    for keyword in user_input:
        if keyword in database.get(country):
            print(keyword, database[country][keyword])

else:
    print('Could not find that country in the database')

EDIT : Code mis à jour pour que vous puissiez être plus ambigu et saisir des mots clés / pays dans n'importe quel ordre et avoir plusieurs mots clés

exemple:

Enter <query> <country>: currency mexico
>> Mexico pesos


2 commentaires

Merci pour votre réponse. Cela m'a vraiment beaucoup aidé. Mais je me demande simplement, que se passe-t-il si l'utilisateur saisit des mots-clés avec d'autres mots. Existe-t-il un moyen d'améliorer le code pour qu'il puisse s'adapter? Merci d'avance


@ Pentagone J'ai mis à jour le code, vous pouvez donc maintenant entrer des mots-clés dans n'importe quel ordre et entrer plusieurs mots-clés à trouver, par exemple. mexico capital currency ou même population mexico area . Si vous voulez créer un moteur de recherche comme google où vous pouvez taper quelle est la population du mexique et de sa région? alors vous devrez vous pencher sur la correspondance de chaîne floue (google it)



0
votes

Vous pouvez essayer:

Canada = {'name': 'Canada', 'continent': 'North America', 'capital': 'Ottawa', 'currency': 'Canadian dollar',
          'population': '32,268,240', 'area': '9,970,610'}
Laos = {'name': 'Laos', 'continent': 'Asia', 'capital': 'Vientiane', 'currency': 'Lao kip',
          'population': '5,924,145', 'area': '236,800'}
Mexico = {'name': 'Mexico', 'continent': 'North America', 'capital': 'Mexico City', 'currency': 'Mexico peso',
        'population': '107,029,400', 'area': '1,958,201'}

countries = {'Canada' : Canada, 'Mexico' :Mexico, 'Laos' : Laos} 

user_input = input("Type: ")

asked_country = list(set(user_input.split()).intersection(countries.keys()))[0] 
output = list(set(countries[asked_country].keys()))[0]
print(countries[asked_country][output]) 

# Type: currency of Mexico             
# Mexico peso


0 commentaires

0
votes

Solution pas courte, mais plus claire et plus large. Par exemple, pour une requête comme Superficie et population du Canada , il imprimera:

from collections import defaultdict

Canada = {'name': 'Canada', 'continent': 'North America', 'capital': 'Ottawa', 'currency': 'Canadian dollar',
          'population': '32,268,240', 'area': '9,970,610'}
Laos = {'name': 'Laos', 'continent': 'Asia', 'capital': 'Vientiane', 'currency': 'Lao kip',
          'population': '5,924,145', 'area': '236,800'}
Mexico = {'name': 'Mexico', 'continent': 'North America', 'capital': 'Mexico City', 'currency': 'Mexico peso',
        'population': '107,029,400', 'area': '1,958,201'}

key = set(["area", "population", "currency"])

# build the forward and reverse indexes
forward_index = [Canada, Laos, Mexico]
reverse_index = defaultdict(set)

for i, description in enumerate(forward_index):
    phrase = ' '.join(['%s %s'%(k,v) for k, v in description.items()])
    words = phrase.lower().split()
    for w in words:
        reverse_index[w].add(i)

# search
user_input = input("Type: ")

res = None
keywords = set()
for word in user_input.lower().split():
    if word in key:
        keywords.add(word)

    posting_set = reverse_index.get(word, None)

    # tolerant search: skip missing words
    if posting_set is None:
        continue

    if res is None:
        res = posting_set
    else:
        res = res.intersection(posting_set)

# print all the results
if res is None or len(keywords) == 0:
    print("<nothing found>")
else:
    print("results:")
    for idx in res:
        desc = forward_index[idx]
        for kw in keywords:
            print("%s = %s" % (kw, desc[kw]))

Type: area and population of Canada
results:
area = 9,970,610
population = 32,268,240


0 commentaires