Рубрики
Без рубрики

Извлечение дополнительных функций – маркировка последовательности в Python (часть 3)

Наш алгоритм нуждается больше, чем часть речи, чтобы работать хорошо, поэтому давайте дадим ему больше вещей для работы. Tagged с Python, DataScience, NLP.

Это третий пост в моей серии Маркировка последовательности в 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”