Категоризация предложения с использованием словаря - PullRequest
0 голосов
/ 22 сентября 2018

Я использую функцию ниже для получения категоризации предложения в темах

def theme(x):
    output =[]
    category = ()
    for i in x:
        if 'AC' in i:
            category = 'AC problem'
        elif 'insects' in i:
            category = 'Cleanliness'
        elif 'clean' in i:
            category = 'Cleanliness'
        elif 'food' in i:
            category = 'Food Problem'
        elif 'delay' in i:
            category = 'Train Delayed'
        else:
            category = 'None'
        output.append(category)
    return output

Я не хочу использовать повторные операторы if для каждого слова в категории.Вместо этого я хочу, чтобы я дал список / словарь, например, Cleanliness = ['Clean', 'Cleaned', 'spoilt', 'dirty'] для получения категории «Чистота» по отношению к предложению, если в нем есть любое из слов в списке.Как я могу это сделать

Ответы [ 4 ]

0 голосов
/ 22 сентября 2018

Я выработал другой способ:

def theme(x):
output = []
for i in x:
    if set(cleanliness).intersection(i.lower().split()):
        category = 'clean'
    elif set(ac_problem).intersection(i.lower().split()):
        category = 'ac problem'
    else:
        category = 'none'
    output.append(category)
return output
0 голосов
/ 22 сентября 2018

Вы можете использовать наборы слов, чтобы структурировать ваши слова по категориям, а затем сгенерировать подсказку для поиска по категориям на основе указанной структуры:

categories = {
    'Cleanliness': {'insects', 'clean'},
    'AC Problem': {'AC'},
    'Food Problem': {'food'},
    'Train Delayed': {'delay'}
}
lookup = {word: category for category, words in categories.items() for word in words}
def theme(x):
    return {lookup.get(word, 'None') for word in x}

, чтобы theme(['AC', 'clean', 'insects']) вернулнабор соответствующих категорий:

{'Cleanliness', 'AC Problem'}
0 голосов
/ 22 сентября 2018

Это должно сделать то, что вы просите.Я установил все ключи в нижний регистр и преобразовал i в нижний регистр при проверке, если вы получаете совпадение, но с другой заглавной буквы, он все еще считается.

def theme(x):
output =[]
category = ()

myDict = {"ac":"AC problem", "insects":"Cleanliness", "clean":"Cleanliness", "food":"Food Problem", "delay":"Train Delayed"} #I reccomend coming up with a more suitable name for your dictionary in your actual program

for i in x:
    if i.lower() in myDict: #Checks to see if i is in the dictionary before trying to print the result; prevents possible Key Errors
        category = (myDict[i.lower()]) #If it is in the dictionary it category will be set to the result of the key

        output.append(category)

    else:
        output.append("None") #If i isn't in the dictionary output will append None instead
return output

Вот несколько примеров:

>>>print(theme(['Clean', 'Cleaned', 'spoilt', 'dirty']))
['Cleanliness', 'None', 'None', 'None']

>>>print(theme(['Delay', 'Ham', 'Cheese', 'Insects']))
['Train Delayed', 'None', 'None', 'Cleanliness']
0 голосов
/ 22 сентября 2018

Может быть, вы можете сделать это так:

def theme(x):
    output = []
    name_dic = {"AC": "AC problem",
                "clean": "Cleanliness",
                "food": "Food Problem"
                }
    for e in x:
        output.append(name_dic.get(e))

    return output

Или, точнее, так:

def theme(x):
    output = []
    name_list = [
        ("AC", "AC problem"),
        ("clean", "Cleanliness"),
        ("insects", "Cleanliness"),
        ("food", "Food Problem")
    ]
    name_dic = dict(name_list)
    for e in x:
        output.append(name_dic.get(e))

    return output

Надеюсь, это поможет.

...