Сохранять ссылки на идентификаторы при токенизации записи с использованием генератора

1

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

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

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

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 для всех токенов ALL, а не только соответствующее значение 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.
  • 0
    Я понимаю, что у меня есть буквальное добавление столбца Id и индекса из df для каждого токена. Нужно найти способ вставить Id только вместе с каждым соответствующим токеном.
Теги:
pandas
dataframe
generator
token

1 ответ

0

Вам нужно изменить индекс 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 i, record in enumerate(df[source_column]):
                if isinstance(record, float) is False:
                    for token in tokenizer(record):
                        yield (token, key_name, df.iloc[i]['Id'])
  • 0
    Большое спасибо! Кажется, перечислил был метод, который я пропустил.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню