Сохранять ссылки на идентификаторы при токенизации записи с использованием генератора - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь продублировать (очень крутой) подход к сопоставлению данных, описанный здесь , используя панд.Цель состоит в том, чтобы взять составные части (токены) записи и использовать их для сопоставления с другим df.

Я застрял, пытаясь понять, как сохранить идентификатор источника и связать его с отдельными токенами.Надеюсь, у кого-то здесь есть умное предложение, как я могу это сделать.Я искал в стеке, но не смог найти похожий вопрос.

Вот некоторые примеры данных и основной код для иллюстрации.Это берет фрейм данных, токенизирует выбранные столбцы, генерирует токен, тип токена и идентификатор (но часть идентификатора не работает):

d = {'Id': [3,6], 'Org_Name': ['Acme Co Inc.', 'Buy Cats Here LLC'], 'Address': ['123 Hammond Lane', 'Washington, DC 20456']}
df = pd.DataFrame(data=d)

def tokenize_name(name):
    if isinstance(name, basestring) is True:
        clean_name = ''.join(c if c.isalnum() else ' ' for c in name)
        return clean_name.lower().split()
    else:
        return name

def tokenize_address(address):
    if isinstance(address, basestring) is True:
        clean_name = ''.join(c if c.isalnum() else ' ' for c in address)
        return clean_name.lower().split()
    else:
        return address

left_tokenizers = [
    ('Org_Name', 'name_tokens', tokenize_name),
    ('Address', 'address_tokens', tokenize_address)
]

#this works except for ID references
def prepare_join_keys(df, tokenizers):
    for source_column, key_name, tokenizer in tokenizers:
        for index in df.index:
            if source_column in df.columns:
                for record in df[source_column]:
                    if isinstance(record, float) is False:
                        for token in tokenizer(record):
                            yield (token, key_name, df.iloc[index]['Id'])

for item in prepare_join_keys(df, left_tokenizers):
    print item

Этот код выдает правильные токены, но выдает значения Id для ВСЕХ токенов вместотолько соответствующее значение идентификатора.Я знаю, что у меня здесь не так, но я не могу придумать, как это сделать, используя функцию генератора.Желаемый результат будет:

acme, name_tokens, 3
co, name_tokens, 3
inc, name_tokens, 3
buy, name_tokens, 6
cats, name_tokens, 6
here, name_tokens, 6
llc, name_tokens, 6
123, address_tokens, 3
hammond, address_tokens, 3
etc.

1 Ответ

0 голосов
/ 30 ноября 2018

Вам нужно изменить индекс Id, а не в выделенном цикле for, но в то же время вы получите новую запись.Я бы предложил что-то вроде:

def prepare_join_keys(df, tokenizers):
    for source_column, key_name, tokenizer in tokenizers:
        # for index in df.index:
        if source_column in df.columns:
            for index, record in enumerate(df[source_column]):
                if isinstance(record, float) is False:
                    for token in tokenizer(record):
                        yield (token, key_name, df.iloc[index]['Id'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...