Автор | АРАВИНД ПАИ Компилировать|ВКонтакте Источник | Аналитика Видья
Обзор
-
Токенизация — ключ к работе с текстовыми данными
-
Мы обсудим различные нюансы токенизации, в том числе то, как обрабатываются слова вне словаря (OOV).
вводить
Изучение нового языка с нуля может быть сложной задачей. Если вы когда-либо изучали язык, который не является вашим родным языком, вы поймете! Слишком много уровней, которые нужно учитывать, например, синтаксис. Это довольно сложная задача.
Чтобы наш компьютер понял любой текст, нам нужно разбить слово так, чтобы его могла понять машина. Это концепция токенизации в обработке естественного языка (NLP).
Проще говоря, токенизация очень важна для обработки текстовых данных.
Вот что интересно в токенизации, это не просто разбивка текста. Токенизация играет важную роль в обработке текстовых данных. Поэтому в этой статье мы рассмотрим токенизацию в обработке естественного языка и способы ее реализации в Python.
содержание
-
токенизация
-
Настоящая причина токенизации
-
Что (слово, символ или подслово) мы должны использовать?
-
Реализация кодирования пар байтов в Python
токенизация
Токенизация — обычная задача в обработке естественного языка (NLP). Это фундаментальный шаг для традиционных методов NLP, таких как Count Vectorizer, и передовых архитектур, основанных на глубоком обучении, таких как Transformers.
Слова являются строительными блоками естественного языка.
Токенизация — это метод разделения текста на более мелкие единицы, называемые токенами. Здесь идентификаторами могут быть слова, символы или подслова. Таким образом, токенизацию можно условно разделить на три типа: токенизация слова, символа и подслова (символа n-граммы).
Например, рассмотрим это предложение: «Никогда не сдавайся».
Самый распространенный способ образования слов основан на пространстве. Предполагая пробел в качестве разделителя, токенизация предложения приводит к 3 словам: «Никогда не сдавайся». Поскольку каждый токен представляет собой слово, он становится примером токенизации слова.
Точно так же токены могут быть символами или подсловами. Например, давайте считать умнее":
-
ID персонажа: s-m-a-r-t-e-r
-
Идентификация подслова: smart-er
Но так ли это необходимо? Нужна ли нам токенизация для всего этого?
Настоящая причина токенизации
Поскольку слова являются строительными блоками естественного языка, наиболее распространенный способ обработки необработанного текста происходит на уровне слов.
Например, модели на основе Transformer (современные (SOTA) архитектуры глубокого обучения в НЛП) обрабатывают необработанный текст на уровне слов. Точно так же самые популярные архитектуры глубокого обучения для NLP, такие как RNN, GRU и LSTM, также обрабатывают необработанный текст на уровне слов.
Как показано, RNN получает и обрабатывает каждое слово на определенном временном шаге.
Поэтому токенизация — это первый шаг в моделировании текстовых данных. Выполните токенизацию корпуса, чтобы получить слова. Затем подготовьте словарный запас, используя следующие слова. Лексика относится к словам, которые появились в корпусе. Помните, что словарный запас можно построить, рассматривая каждое уникальное слово в корпусе или рассматривая K наиболее часто встречающихся слов.
Создание словаря — конечная цель токенизации.
Один из самых простых способов повысить производительность вашей модели НЛП — создать словарь, используя K лучших слов.
Теперь давайте разберемся, как словарный запас используется в традиционных и продвинутых методах НЛП, основанных на глубоком обучении.
-
Традиционные методы НЛП, такие как подсчет частоты слов и TF-IDF, используют словарный запас в качестве признаков. Каждое слово в словаре считается уникальным признаком:
-
В продвинутых архитектурах НЛП, основанных на глубоком обучении, словари используются для создания входных предложений. Наконец, эти слова передаются в качестве входных данных модели.
Что (слово, символ или подслово) мы должны использовать?
Как упоминалось ранее, токенизация может выполняться на уровне слова, символа или подслова. Это частый вопрос — какую токенизацию использовать при решении задач НЛП? Давайте обсудим это здесь.
токенизация на уровне слов
Токенизация Word является наиболее часто используемым алгоритмом токенизации. Он разбивает фрагмент текста (на английском языке) на отдельные слова на основе определенного разделителя. В зависимости от разделителя формируются разные идентификаторы на уровне слов. Предварительно обученные вложения слов, такие как Word2Vec и GloVe, относятся к токенизации слов.
У этого есть только несколько недостатков.
Недостатки токенизации на уровне слов
Одна из основных проблем с идентификацией слов связана со словами, не входящими в словарь (OOV). Слова OOV — это новые слова, встречающиеся в тесте. Эти новые слова отсутствуют в лексиконе. Следовательно, эти методы не могут обрабатывать слова OOV.
Но подождите, не торопитесь с выводами!
-
Небольшой трюк может спасти токенизаторы слов от слов OOV. Хитрость заключается в том, чтобы сформировать словарь из K самых частых слов и заменить редкие слова в обучающих данных неизвестными идентификаторами (UNK). Это помогает модели изучить представления слов OOV с помощью UNK.
-
Поэтому во время тестирования любое слово, отсутствующее в словаре, будет сопоставлено с идентификатором UNK. Вот как мы решаем проблему OOV в токенизаторах.
-
Проблема с этим подходом заключается в том, что когда мы сопоставляем OOV с UNK-словами, вся информация о слове теряется. Структура слов может помочь точно представить слова. Другая проблема заключается в том, что каждое слово OOV имеет одинаковое представление.
Другая проблема с идентификацией слов связана с размером словарного запаса. Как правило, предварительно обученные модели обучаются на большом текстовом корпусе. Итак, представьте себе создание словаря со всеми словами в таком большом корпусе. Это значительно расширит ваш словарный запас!
Это открывает путь к токенизации на уровне персонажа.
Токенизация уровня персонажа
Токенизация символов разбивает каждый текст на набор символов. Он устраняет недостатки, которые мы видели выше в отношении токенизации слов.
-
Токенизатор символов когерентно обрабатывает слова OOV, сохраняя информацию о слове. Он разбивает слова OOV на символы и использует эти символы для представления слов.
-
Это также ограничивает размер словарного запаса. Хотите угадать свой словарный запас? Ответ 26.
Недостатки токенизации персонажей
Идентификация символов решает проблему OOV, но когда мы представляем предложение в виде последовательности символов, длина входного и выходного предложений быстро увеличивается. Поэтому становится сложно выучить отношения между словами, чтобы сформировать осмысленные слова.
Это подводит нас к другой токенизации, называемой токенизацией подслов, которая находится где-то между токенизацией слов и символов.
токенизация подслов
Токенизация подслов разбивает текст на подслова (или n символов). Например, такие слова, как «ниже», можно разделить на «ниже», «самый умный», «самый умный» и так далее.
Модели на основе преобразования (SOTA в НЛП) полагаются на алгоритмы токенизации подслов для подготовки словарей. Теперь я расскажу об одном из самых популярных алгоритмов токенизации подслов, который называется Byte Pair Encoding (BPE).
Использовать BPE
Кодирование парами байтов, BPE — это метод токенизации, широко используемый в моделях на основе конвертеров. BPE решает проблему токенизаторов слов и символов:
-
BPE эффективно решает проблему OOV. Он разбивает OOV на подслова и использует эти подслова для представления слов.
-
Меньшая длина входных и выходных предложений после BPE по сравнению с токенизацией символов
BPE — это алгоритм токенизации, который итеративно объединяет наиболее часто встречающиеся символы или последовательности символов. Ниже приведено руководство для пошагового изучения BPE.
Шаги для изучения BPE
-
добавить символ конца
-
Инициализировать словарный запас уникальными символами в корпусе
-
Подсчитайте частоту пар или последовательностей символов в корпусе
-
Объединить наиболее часто встречающиеся пары в корпусе
-
сохранить лучшую пару в словарном запасе
-
Повторите шаги с 3 по 5 для определенного количества итераций.
Мы разберем эти шаги на примере.
Рассмотрим корпус
1a) Добавьте символ окончания слова (say) к каждому слову в корпусе:
1б) Разделите слова корпуса на символы:
2. Инициализируйте словарь:
Итерация 1:
3. Рассчитайте частоту:
4. Объедините самые распространенные пары:
5. Сохраните лучшую пару:
Повторите шаги 3-5 для каждой итерации с этого момента. Позвольте мне продемонстрировать еще одну итерацию.
Итерация 2:
3. Рассчитайте частоту:
4. Объедините самые распространенные пары:
5. Сохраните лучшую пару:
После 10 итераций операция слияния BPE выглядит так:
Довольно прямолинейно, верно?
Применение BPE в словах OOV
Но как мы можем использовать BPE для представления слов OOV во время тестирования? Любые идеи? Сейчас мы ответим на этот вопрос.
Во время тестирования слова OOV были разбиты на последовательности символов. Затем примените изученные операции, чтобы объединить символы в более крупные известные символы.
Ниже приведен процесс представления для представления слов OOV:
-
Разделить слова OOV на символы после добавления
-
Подсчет пар или последовательностей символов в слове
-
Выберите изученную пару, которая существует
-
Объедините самые распространенные пары
-
Повторяйте шаги 2 и 3, пока не сможете объединить
Давайте посмотрим на все это дальше!
Реализация кодирования пар байтов в Python
Теперь мы знаем, как BPE изучает и применяет лексику OOV. Итак, пришло время реализовать его на Python.
Код Python для BPE уже доступен в коде, опубликованном в оригинальной статье.
читать корпус
Мы рассмотрим простой корпус для иллюстрации идеи BPE. Однако та же идея применима и к другому корпусу:
#导入库
import pandas as pd
#正在读取.txt文件
text = pd.read_csv("sample.txt",header=None)
#将数据帧转换为单个列表
corpus=[]
for row in text.values:
tokens = row[0].split(" ")
for token in tokens:
corpus.append(token)
предварительная обработка текста
Разделите слова на символы в корпусе и добавьте в конце каждого слова:
#初始化词汇
vocab = list(set(" ".join(corpus)))
vocab.remove(' ')
#把这个词分成字符
corpus = [" ".join(token) for token in corpus]
#追加</w>
corpus=[token+' </w>' for token in corpus]
изучить BPE
Подсчитайте частоту каждого слова в корпусе:
import collections
#返回每个单词的频率
corpus = collections.Counter(corpus)
#将计数器对象转换为字典
corpus = dict(corpus)
print("Corpus:",corpus)
вывод:
Давайте определим функцию для подсчета частоты пар или последовательностей символов. Он принимает корпус и возвращает частоты:
#pair或字符序列的频率
#参数是语料并且返回每个pair的频率
def get_stats(corpus):
pairs = collections.defaultdict(int)
for word, freq in corpus.items():
symbols = word.split()
for i in range(len(symbols)-1):
pairs[symbols[i],symbols[i+1]] += freq
return pairs
Теперь следующая задача — объединить наиболее часто встречающиеся пары в корпусе. Мы определим функцию, которая берет корпус, лучшую пару, и возвращает измененный корпус:
#合并语料库中最常见的pair
#接受语料库和最佳pair
import re
def merge_vocab(pair, corpus_in):
corpus_out = {}
bigram = re.escape(' '.join(pair))
p = re.compile(r'(?<!\S)' + bigram + r'(?!\S)')
for word in corpus_in:
w_out = p.sub(''.join(pair), word)
corpus_out[w_out] = corpus_in[word]
return corpus_out
Далее пришло время изучить операции BPE. Поскольку BPE — это итеративный процесс, мы будем выполнять и понимать этапы итерации. Рассчитаем частоту биграмм:
#bi-gram的频率
pairs = get_stats(corpus)
print(pairs)
вывод:
Найдите самые распространенные:
#计算最佳pair
best = max(pairs, key=pairs.get)
print("Most Frequent pair:",best)
вывод:('е', 'с')
Наконец, объедините лучшую пару и сохраните в словаре:
#语料库中频繁pair的合并
corpus = merge_vocab(best, corpus)
print("After Merging:", corpus)
#将元组转换为字符串
best = "".join(list(best))
#合并到merges和vocab
merges = []
merges.append(best)
vocab.append(best)
вывод:
Мы будем следовать аналогичным шагам:
num_merges = 10
for i in range(num_merges):
#计算bi-gram的频率
pairs = get_stats(corpus)
#计算最佳pair
best = max(pairs, key=pairs.get)
#合并语料库中的频繁pair
corpus = merge_vocab(best, corpus)
#合并到merges和vocab
merges.append(best)
vocab.append(best)
#将元组转换为字符串
merges_in_string = ["".join(list(i)) for i in merges]
print("BPE Merge Operations:",merges_in_string)
вывод:
Самое смешное еще впереди! Примените BPE к словарю OOV.
Применение BPE в лексике OOV
Теперь мы увидим, как применять BPE к словам OOV. Например, слово OOV является «самым низким»:
#BPE在OOV词汇中的应用
oov ='lowest'
#将OOV分割为字符
oov = " ".join(list(oov))
#添加 </w>
oov = oov + ' </w>'
#创建字典
oov = { oov : 1}
Применение BPE к словам OOV также является итеративным процессом. Мы выполним шаги, описанные ранее в этой статье:
i=0
while(True):
#计算频率
pairs = get_stats(oov)
#提取keys
pairs = pairs.keys()
#找出之前学习中可用的pair
ind=[merges.index(i) for i in pairs if i in merges]
if(len(ind)==0):
print("\nBPE Completed...")
break
#选择最常学习的操作
best = merges[min(ind)]
#合并最佳pair
oov = merge_vocab(best, oov)
print("Iteration ",i+1, list(oov.keys())[0])
i=i+1
вывод:
Как видите, слово OOV «low est» разбивается на low-est.
конец
Токенизация — это мощный способ работы с текстовыми данными. Мы видели это в этой статье и реализовали токенизацию с помощью Python.
Попробуйте этот метод на любом текстовом наборе данных. Чем больше вы практикуетесь, тем лучше вы поймете, как работает токенизация (и почему это такая важная концепция НЛП).
Оригинальная ссылка:Woohoo.Со слов аналитиков vi.com/blog/2020/0…
Добро пожаловать на сайт блога Panchuang AI:panchuang.net/
sklearn машинное обучение китайские официальные документы:sklearn123.com/
Добро пожаловать на станцию сводки ресурсов блога Panchuang:docs.panchuang.net/