Это третий пост в моей серии Маркировка последовательности в Python , найдите предыдущий здесь: Часть тега . Получите код для этой серии на GitHub .
Несмотря на то, что наличие POS -тегов является хорошей и ценной информацией, этого может быть недостаточно, чтобы получить ценные прогнозы для нашей задачи. Тем не менее, мы можем предоставить наш алгоритм дополнительной информации; например, длина токена, длина предложения, положение в предложении, будь то жетон – это число или все прописные …
Некоторые импорты:
from vuelax.tokenisation import index_emoji_tokenize import pandas as pd import csv
Начиная с нашего уже помеченного набора данных (помните, что у меня есть файл с именем data/to_label.csv
). Ниже приведены лишь несколько вспомогательных функций для чтения и расширения нашего набора данных:
labelled_data = pd.read_csv("data/to_label-done.csv") labelled_data.head()
Нам нужно создать вспомогательную функцию, чтобы прочитать все помеченные предложения из ранее созданных labelled_data
DataFrame:
def read_whole_offers(dataset): current_offer = 0 rows = [] for _, row in dataset.iterrows(): if row['offer_id'] != current_offer: yield rows current_offer = row['offer_id'] rows = [] rows.append(list(row.values)) yield rows offers = read_whole_offers(labelled_data) offer_ids, tokens, positions, pos_tags, labels = zip(*next(offers)) print(offer_ids) print(tokens) print(positions) print(pos_tags) print(labels)
А вот и вывод первого предложения полета:
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) ('¡', 'CUN', 'a', 'Ámsterdam', '$', '8,960', '!', 'Sin', 'escala', 'en', 'EE.UU') (0, 1, 5, 7, 17, 18, 23, 25, 29, 36, 39) ('faa', 'np00000', 'sp000', 'np00000', 'zm', 'dn0000', 'fat', 'sp000', 'nc0s000', 'sp000', 'np00000') ('n', 'o', 's', 'd', 'n', 'p', 'n', 'n', 'n', 'n', 'n')
Создание нашего обучения
Функции, которые я решил увеличить данные, являются следующими:
- Длина каждого токена
- Длина всего предложения (считать в жетонах)
- POS -метк токена слева
- POS -метк токена справа
- Токен является прописным или нет
И это соответствующая функция для создания указанных функций:
def generate_more_features(tokens, pos_tags): lengths = [len(l) for l in tokens] n_tokens = [len(tokens) for l in tokens] augmented = [''] + list(pos_tags) + ['
'] uppercase = [all([l.isupper() for l in token]) for token in tokens] return lengths, n_tokens, augmented[:len(tokens)], augmented[2:], uppercase generate_more_features(tokens, pos_tags)
В качестве примера вывода:
([1, 3, 1, 9, 1, 5, 1, 3, 6, 2, 5], [11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11], ['', 'faa', 'np00000', 'sp000', ... 'sp000', 'nc0s000', 'sp000'], ['np00000', 'sp000', ... 'nc0s000', 'sp000', 'np00000', '
'], [False, True, False, False, False, False, False, False, False, False, False])
Наконец, нам нужно применить функцию ко всем предложениям в нашем наборе данных и сохранить их в файл, чтобы сохранить их под рукой для следующей задачи, вы можете прочитать больше об этом здесь: обучение CRF в Python.
Как всегда, не стесняйтесь задавать некоторые вопросы, если они у вас есть, оставив здесь комментарий или связавшись со мной в Twitter через @io_exception Анкет
Оригинал: “https://dev.to/fferegrino/extracting-more-features-sequence-labelling-in-python-part-3-3389”