lecture2-2015 (1126921), страница 2
Текст из файла (страница 2)
Soup does very well without--Maybe it's always pepper that makes people hot-tempered,'...""" tokens = WordPunctTokenizer().tokenize(raw) print(tokens) ["'", 'When', 'I', "'", 'M', 'a', 'Duchess', ",'", 'she', 'said', 'to', 'herself', ',', '(', 'not', 'in', 'a', 'very', 'hopeful', 'tone', 'though', '),', "'", 'I', 'won', "'", 't', 'have', 'any', 'pepper', 'in', 'my', 'kitchen', 'AT', 'ALL', '.', 'Soup', 'does', 'very', 'well', 'without', '--', 'Maybe', 'it', "'", 's', 'always', 'pepper', 'that', 'makes', 'people', 'hot', '-', 'tempered', ",'..."]Обработка текстовТокенизация• Многозначность определения токена• хэштеги (#текст)• “I’m” - один токен?• “won’t” - один токен?• Dr.
- токен?• Зависит от задачиОбработка текстовТокенизация• В каком виде лучше представлять результаттокенизации?• список токенов• простая модель• что, если нужно сразу несколькотокенизаторов?• что если нужно понимать где в текстеоригинальное слово?• Более общий способ представлениярезультатов анализа текстов - модельаннотацийОбработка текстовАннотации• Аннотация - в общем случае тройка• начало• конец• значение (не обязательно)• Пример токенизации>>> [(0, 1), (1, 5), (6, 9), (10, 11), (12, 19), (19, 20), (20, 21), (22, 25), (26, 30), (31, 33), (34, 41), (41, 42), (43, 44),(44, 47), (48, 50), (51, 52), (53, 57), (58, 65), (66, 70), (82, 88), (88, 89), (89, 90), (91, 92), (92, 93), (94, 96), (96,99), (100, 104), (105, 108), (109, 115), (116, 118), (119, 121), (122, 129), (130, 132), (133, 137), (138, 142), (143,147), (148, 152), (164, 168), (169, 183), (184, 186), (186, 188), (189, 195), (196, 202), (203, 207), (208, 213), (214,220), (221, 233), (233, 234), (234, 238)]print(raw[109:115])>>> pepperОбработка текстовАннотации• Аннотации используются во многихпроектах по обработке текстов• Apache UIMA• Texterra - ISPRAS API(https://api.ispras.ru)from ispras import texterrat = texterra.API(‘API KEY') tokens = t.tokenizationAnnotate(raw) print([(token['start'], token['end']) for token in tokens])Обработка текстовСегментация• В китайском языке слова не разделяются проблемнымисимволами• 戴帽⼦子的貓 -> Thecatinthehat• Жадный алгоритм по словарю• Многозначность• thetabledownthere• the table down there• theta bled own there• Проблемы, если слова нет в словаре• Но в целом, алгоритм неплохо работает длякитайского языка, так как слова имеют схожую длинуОбработка текстовСегментация• Обозначим сегментацию через бинарныйвекторtext = "doyouseethekittyseethedoggydoyoulikethekittylikethedoggy" seg1 = “0000000000000001000000000010000000000000000100000000000” seg2 = “0100100100100001001001000010100100010010000100010010000"def segment(text, segs): words = [] last = 0 for i in range(len(segs)): if segs[i] == '1': words.append(text[last:i+1]) last = i+1 words.append(text[last:]) return wordsprint(segment(text, seg2)) >>> ['do', 'you', 'see', 'the', 'kitty', 'see', 'the', 'doggy', 'do', 'you', 'like','the', 'kitty', 'like', 'the', 'doggy']*NLTK BookОбработка текстовСегментация• Придумаем функцию оценки качества сегментации• размер лексикона (длина слов плюс разделительныйсимвол для каждого слова)• количество информации, необходимое для реконструкцииисходного текста из лексиконаhttp://www.nltk.org/book/ch03.htmlОбработка текстовСегментация• Придумаем функцию оценки качества сегментации• размер лексикона (длина слов плюс разделительныйсимвол для каждого слова)• количество информации, необходимое для реконструкцииисходного текста из лексиконаtext = "doyouseethekittyseethedoggydoyoulikethekittylikethedoggy" seg1 = “0000000000000001000000000010000000000000000100000000000” seg2 = “0100100100100001001001000010100100010010000100010010000"def evaluate(text, segs): words = segment(text, segs) text_size = len(words) lexicon_size = sum(len(word) + 1 for word in set(words)) return text_size + lexicon_sizeprint(evaluate(text, seg1))>>> 64 print(evaluate(text, seg2))>>> 48Обработка текстовСегментация• Найдем минимум функции алгоритмомимитации отжигаfrom random import randintdef flip(segs, pos): return segs[:pos] + str(1-int(segs[pos])) + segs[pos+1:] def flip_n(segs, n): for i in range(n): segs = flip(segs, randint(0, len(segs)-1)) return segs def anneal(text, segs, iterations, cooling_rate): temperature = float(len(segs)) while temperature > 0.5: best_segs, best = segs, evaluate(text, segs) for i in range(iterations): guess = flip_n(segs, int(round(temperature))) score = evaluate(text, guess) if score < best: best, best_segs = score, guess score, segs = best, best_segs temperature = temperature / cooling_rate print(evaluate(text, segs), segment(text, segs)) return segsanneal(text, seg1, 5000, 1.2)Обработка текстовСегментация• Результат работы(64, ['doyouseethekitty', 'seethedoggy', 'doyoulikethekitty', 'likethedoggy'])(64, ['doyouseethekitty', 'seethedoggy', 'doyoulikethekitty', 'likethedoggy'])(64, ['doyouseethekitty', 'seethedoggy', 'doyoulikethekitty', 'likethedoggy'])(64, ['doyouseethekitty', 'seethedoggy', 'doyoulikethekitty', 'likethedoggy'])(64, ['doyouseethekitty', 'seethedoggy', 'doyoulikethekitty', 'likethedoggy'])(63, ['doyouse', 'et', 'hekitty', 'seethedoggydoyoulik', 'et', 'hekitty', 'likethe', 'd', 'oggy'])(62, ['doyouse', 'ethekitty', 'seethe', 'doggydoyoulik', 'ethekitty', 'l', 'ikethed', 'oggy'])(60, ['do', 'youse', 'ethekitty', 'seethedoggydoyoulik', 'ethekitty', 'l', 'ikethedoggy'])(60, ['do', 'youse', 'ethekitty', 'seethedoggydoyoulik', 'ethekitty', 'l', 'ikethedoggy'])(57, ['do', 'youse', 'ethekitty', 'see', 'thedoggy', 'doyoulik', 'ethekitty', 'l', 'ike', 'thedoggy'])(53, ['doyouse', 'ethekitty', 'see', 'thedoggy', 'doyoulik', 'ethekitty', 'like', 'thedoggy'])(51, ['doyou', 'se', 'ethekitty', 's', 'ee', 'thedoggy', 'doyou', 'lik', 'ethekitty', 'lik', 'e', 'thedoggy'])(49, ['doyou', 'se', 'ethekitty', 'see', 'thedoggy', 'doyou', 'lik', 'ethekitty', 'lik', 'e', 'thedoggy'])(49, ['doyou', 'se', 'ethekitty', 'see', 'thedoggy', 'doyou', 'lik', 'ethekitty', 'lik', 'e', 'thedoggy'])(46, ['doyou', 'se', 'ethekitty', 'se', 'e', 'thedoggy', 'doyou', 'lik', 'ethekitty', 'lik', 'e', 'thedoggy'])(46, ['doyou', 'se', 'ethekitty', 'se', 'e', 'thedoggy', 'doyou', 'lik', 'ethekitty', 'lik', 'e', 'thedoggy'])(46, ['doyou', 'se', 'ethekitty', 'se', 'e', 'thedoggy', 'doyou', 'lik', 'ethekitty', 'lik', 'e', 'thedoggy'])Обработка текстовСтемминг и лемматизация• Часто необходимо обрабатывать разныеформы слова одинаково.• Например, при поиске: по запросам“кошками” и “кошкам” ожидаютсяодинаковые ответы• Стемминг - это процесс нахожденияосновы слова, которая не обязательносовпадает с корнем слова• Лемматизация - приведение слова ксловарной формеОбработка текстовСтемминг• Стемминг - это процесс нахожденияосновы слова, которая не обязательносовпадает с корнем слова• Стемминг отбрасывает суффиксы иокончания до неизменяемой формыслова• Примеры:• кошка -> кошк• кошками -> кошк• пылесосы -> пылесосОбработка текстовСтемминг• Наиболее распространенный стеммер - Snowballиз проекта Apache Lucene• Работает для нескольких языков, включая русский#coding: utf-8 from nltk import SnowballStemmer word = "пылесосы".decode("utf-8") stem = SnowballStemmer("russian").stem(word) print(stem)http://snowball.tartarus.org/algorithms/russian/stemmer.htmlОбработка текстовЛемматизация• У разных слов часто совпадает основа• пол : полу , пола , поле , полю , поля , пол ,полем , полях , полям• лев : левый, левая, лев• Увеличивается многозначность и ухудшаютсярезультаты работы приложений• Лемматизация - приведение слова к словарнойформе• Примеры:• Кошки -> кошка• Кошками -> кошкаОбработка текстовЛемматизация• Для английского языка можно использоватьnltk.WordNetLemmatizer()• Для русского языка:• Илья Сегалович, Михаил Маслов.
Русскийморфологический анализ и синтез с генерациеймоделей словоизменения для не описанных всловаре слов.• Используется словарь словоформ А.А. Зализняка• Находит нормальную форму даже для не словарныхслов• Алгоритм реализован в системе mystemОбработка текстовЛемматизация• Вариант русского лемматайзерареализован в ISPRAS API• lemmatizationAnnotate(text)Так говорила в июле 1805 года известная Анна Павловна Шерер, фрейлина иприближенная императрицы Марии Феодоровны, встречая важного и чиновного князяВасилия, первого приехавшего на ее вечер.
Анна Павловна кашляла несколько дней,у нее был грипп, как она говорила (грипп был тогда новое слово, употреблявшеесятолько редкими). В записочках, разосланных утром с красным лакеем, было написанобез различия во всех: так говорить в июль 1805 год известный анна павловна шерер фрейлин иприближенный императрица мария феодоровна встречать важный и чиновнойкнязь василий первый приехавший на она вечер анна павловна кашлялнесколько день у она быть грипп как она говорить грипп быть тогда новый словоупотребляться только редкий в записочка разосылать утро с красный лакейбыть писать без различие в весьОбработка текстовОпределение границ предложений• Поиск терминов необходимо производитьвнутри предложений• Как автоматически определять границыпредложений?• Обычно определяются по точке• Точка - имеет много значений• граница предложения• сокращение: “Dr.”, “U.S.A.”• Разделитель в числах 3.14•…Обработка текстовОпределение границ предложений• Необходимы алгоритмы разрешениямногозначности точки• Задача сводится к классификации точки на двакласса: конец предложения или нет• Например, можно написать список правил• перед точкой и после нее стоят цифры• слово перед точкой есть в словаресокращений• Правил может быть много и хочется выводить ихкомбинировать автоматически• Используется машинное обучениеОбработка текстовЗакон ЦипфаЗакон Ципфа — эмпирическая закономерность распределения частоты словестественного языка: если все слова языка (или просто достаточно длинноготекста) упорядочить по убыванию частоты их использования, то частота n-го словав таком списке окажется приблизительно обратно пропорциональной егопорядковому номеру n.