Уникальные / полезные комбинации полного имени в логическом порядке - PullRequest
0 голосов
/ 09 марта 2020

Представь, что у тебя есть человек. Его полное имя - Роберт Джек Старший. Я пытаюсь создать сценарий поиска, используя только полезные комбинации его имени в логическом порядке.

Это означает, что сначала я попытаюсь выполнить поиск с Робертом Джеком-старшим, затем с Робертом-старшим, затем с Робертом Джеком и Робертом. Это самый логичный порядок на мой взгляд. Если вы думаете иначе, дайте мне знать!

Пока я выяснил, как получить все уникальные комбинации. Однако, по моему мнению, сценарий займет много времени для поиска всех комбинаций, даже если это имеет более высокую точность.

Поэтому мой вопрос: как я могу исключить все ненужные комбинации и расположить их в логическом порядке и сделать Вы согласны с тем, что я удаляю комбинации?

Причина, по которой я спрашиваю это, состоит в том, что полное имя также может состоять только из имени и фамилии. Так что без второго имени. Код должен соответствовать этим вариациям. К сожалению, я пока не мог придумать решение.

Мой код:

from itertools import chain, combinations

fname = 'Robert Jack Senior'
fname = fname.split(' ')
all_subsets = list(chain(*map(lambda x: combinations(fname, x), range(1, len(fname) + 1))))
all_subsets = [' '.join(subset) for subset in all_subsets]
print(all_subsets)

Вывод:

['Robert', 'Jack', 'Senior', 'Robert Jack', 'Robert Senior', 'Jack Senior', 'Robert Jack Senior']

Как обсуждалось до желаемого вывода (опять же, в мое мнение) будет:

['Robert Jack Senior', 'Robert Senior', 'Robert Jack', 'Robert']

Ответы [ 3 ]

2 голосов
/ 09 марта 2020

Этот код всегда основывает порядок и комбинацию на имени, данном name_split[0], в данном случае Роберт . Попробуйте это:

name = 'Robert Jack Senior' 

def get_name_combinations(name):
    name_split = name.split()
    return [' '.join(name) for i in range(len(name_split) + 1) for name in combinations(name_split, i) if name and name[0] == name_split[0]][::-1]

print(get_name_combinations(name))

вывод:

['Robert Jack Senior', 'Robert Senior', 'Robert Jack', 'Robert']
0 голосов
/ 09 марта 2020

Если заказ имеет значение для вас, и вы не хотите ненужных комбинаций, то вы можете sh достичь желаемого результата с помощью регулярных выражений.

Попробуйте это,

import re

def getCombs(name):
    subsets = []
    mobj = re.search(r"(\w*)\s*(\w*)\s*(\w*)\s*", name)
    if mobj:
        subs = mobj.groups()

        if len(subs) == 3:
            subsets.append(f"{subs[0]} {subs[1]} {subs[2]}")
            subsets.append(f"{subs[0]} {subs[2]}")
            subsets.append(f"{subs[0]} {subs[1]}")
            subsets.append(f"{subs[0]}")
        elif len(subs) == 2:
            subsets.append(f"{subs[0]} {subs[1]}")
            subsets.append(f"{subs[0]}")
        else:
            subsets.append(subs[0])

    return subsets

print(getCombs(fname))

Вывод:

['Robert Jack Senior', 'Robert Senior', 'Robert Jack', 'Robert']
0 голосов
/ 09 марта 2020

Что делать, если вы выполните следующее: сначала выполните поиск по обычному имени, если результатов не найдено, затем go по комбинациям.

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

Best, Ismail

...