Электронная библиотека » Джон Форман » » онлайн чтение - страница 6


  • Текст добавлен: 22 ноября 2023, 14:32


Автор книги: Джон Форман


Жанр: Базы данных, Компьютеры


Возрастные ограничения: +12

сообщить о неприемлемом содержимом

Текущая страница: 6 (всего у книги 25 страниц) [доступный отрывок для чтения: 7 страниц]

Шрифт:
- 100% +
Самое быстрое в мире введение в теорию вероятности

В двух следующих разделах я буду применять выражение р() для обозначения вероятности. Например:

р(следующий фильм Майкла Бэя будет ужасным)= 1

р(Джон Форман когда-нибудь станет вегетарианцем)= 0,0000001

Извините, очень маловероятно, что я когда-либо откажусь от копченых колбасок – единственной вещи, которая мне нравится в Алабаме!

Суммируем условную вероятность

Ну что ж, предыдущие два примера были просто вероятностями, но в этой главе мы будем работать в основном с условной вероятностью. Вот как она выглядит:

р(Джон Форман станет вегетарианцем | вы заплатите ему миллиард долларов)= 1

Вероятность того, что я когда-нибудь стану вегетарианцем очень низка. Однако если вы дадите мне за это превращение миллиард долларов, она немедленно возрастет до 100 %. Этот вертикальный значок «|» используется для отделения события от условий в выражении.

Как совместить вероятность перехода на вегетарианство в 0,0000001 с какой-то условной вероятностью? С помощью закона о полной вероятности. Вот как он работает: вероятность того, что я стану вегетарианцем, равна сумме вероятностей того, что я стану вегетарианцем при всех возможных условиях, умноженной на вероятность того, что они произойдут:

р(вегетарианство) = р(миллиард долларов) × (вегетарианство | миллиард долларов) + р(не миллиард долларов) × (вегетарианство | не миллиард долларов) = 0,0000001

Полная вероятность – это взвешенная сумма всех условных вероятностей, умноженная на вероятность этих условий. А вероятность условия, что вы дадите мне миллиард долларов, равна нулю (практически уверен в справедливости утверждения). Это означает, что р(не миллиард долларов) = 1, и у нас получается

р(вегетарианство) = 0×р(вегетарианство | миллиард долларов) + р(вегетарианство | не миллиард долларов) = 0,0000001

р(вегетарианство) = 0×1 + 1×0,0000001 = 0,0000001

Совместная вероятность, цепное правило и независимость

Есть еще одно понятие теории вероятности – совместная вероятность, которая есть не что иное, как хитрый способ сказать «и». Вспомните свои вступительные экзамены.

Вот вероятность того, что сегодня на обед я съем тако белл:

р(Джон ест тако белл) = 0,2

Обычно я делаю это раз в неделю. А вот вероятность того, я буду слушать сегодня какую-нибудь попсовенькую электронную музычку:

р(Джон слушает электронную музычку) = 0,8

Это очень вероятно.

А каковы же шансы того, что я буду делать сегодня и то и другое? Это называется совместной вероятностью и записывается следующим образом:

р(Джон ест тако белл, Джон слушает электронную музычку)

Просто разделяем два события запятой.

Эти события, в нашем случае, независимы. Это значит, что прослушивание электронной музыки никак не связано с поеданием тако. Зная об их независимости друг от друга, можно просто перемножить эти две вероятности и получить совместную вероятность следующим образом:

р(Джон ест тако белл, Джон слушает электронную музычку) = 0,2 × 0,8 = 0,16

Это называется одним из правил умножения вероятностей. Отметим, что совместная вероятность всегда ниже вероятности происхождения какого-либо одного из событий, что весьма логично. Выигрыш в лотерею в тот день, когда вас ударит молнией, гораздо менее вероятен, чем любое из этих событий в отдельности.

Один из способов увидеть эту зависимость – цепное правило вероятности, которое выглядит так:

р(Джон ест тако белл, Джон слушает электронную музычку) = р(Джон ест тако белл) × р(Джон слушает электронную музычку | Джон ест тако белл)

Совместная вероятность – это вероятность происхождения одного события, умноженная на вероятность происхождения второго при условии, что произойдет первое. Но так как эти два события не зависят друг от друга, условие не имеет значения. Я буду слушать попсовое техно в том же объеме, несмотря на обед:

р(Джон слушает электронную музычку | Джон ест тако белл) = р(Джон слушает электронную музычку)

Это сводит цепное правило к простому:

р(Джон ест тако белл, Джон слушает электронную музычку) = р(Джон ест тако белл) × (Джон слушает электронную музычку) = 0,16

Что же с зависимыми событиями?

Я введу новую вероятность – вероятность того, что сегодня я буду слушать Depeche Mode:

р(Джон слушает Depeche Mode) = 0,3

Есть 30 %-ная вероятность, что я запилю немного DM сегодня. Не судите меня. Теперь у меня есть два события, зависящие друг от друга: прослушивание электроники или DM. Почему? Да потому что DM и есть попсовое техно! А это значит:

р(Джон слушает электронную музычку | Джон слушает DM) = 1

Если я слушаю Depeche Mode сегодня, то есть 100 %-ная вероятность, что я слушаю попсовое техно. Это тавтология. Так как Depeche Mode достаточно попсовый, вероятность того, что я слушаю попсовое техно при том, что я слушаю Depeche Mode, равна 1.

А это значит следующее: если я хочу вычислить совместную вероятность этих событий, я не просто их перемножаю. Следуя цепному правилу,

р(Джон слушает электронную музычку, Джон слушает DM) = р(Джон слушает DM) × (Джон слушает электронную музычку | Джон слушает DM) = 0,3 × 1 = 0,3

Правило Байеса

Так как я определил Depeche Mode как попсовое техно, вероятность того, что я слушаю попсовое техно при том, что я слушаю Depeche Mode, равна 1. Но нет ли других способов? У нас еще нет вероятности для этого утверждения:

р(Джон слушает Depeche Mode | Джон слушает попсовое техно)

В конце концов, существуют же другие популярные группы, которые играют техно. Может, Kraftwerk? Или новый альбом Daft Punk?

Один милый джентльмен по фамилии Байес придумал правило:

р(попса) × р(DM | попса) = р(DM) × р(попса | DM)

Это правило позволяет вам рассчитать отношение условного события к вероятности, если событие и условие меняются местами.

Перейдя к сокращенным названиям переменных, мы видим, что можно изолировать вероятность, которая нам неизвестна (вероятность того, что я слушаю DM при том, что я слушаю попсовое техно):

р(DM | попса) = р(DM) × р(попса | DM) / р(попса)

Эта формула – самый распространенный вид правила Байеса. В общем-то это способ крутить условными вероятностями. Когда вам известна условная вероятность только с одной стороны, а также полные вероятности события и условия, вы можете легко все перевернуть.

Подставляя значения, получим:

р(DM | попса) = 0,3 × 1 / 0,8 = 0,375

Я буквально имею 30 %-ный шанс слушать Depeche Mode в любой день. Так или иначе, если я знаю, что собираюсь послушать какое-нибудь попсовое техно сегодня, шансы, что это будет Depeche Mode подскакивают до 37,5 %! Отлично.

Использование правила Байеса для создания моделирования

Ну что ж, пора оставить в покое мои музыкальные вкусы и вернуться к проблеме твитов о мандрилах. Каждая запись для нас представляет набор слов, то есть мы разбиваем каждый твит на слова (часто называемые жетонами – token) пробелами и пунктуацией. Есть два класса твитов: о приложении – твиты о Mandrill.com, и другие – все остальные твиты.

Нам важны эти две вероятности:

р(приложение | слово1, слово2, слово3, …)

р(другое | слово1, слово2, слово3, …)

Это вероятность того, что твит либо о приложении, либо о чем-то другом, при том, что мы видим слова «слово1», «слово2», «слово3» и т. д.

Стандартное применение наивной байесовской модели классификатора – это создание нового документа на основе того, к какому классу вероятнее всего относятся твиты, если рассматриваются слова, из которых они состоят. Другими словами, если

р(приложение | слово1, слово2, слово3, …) > р(другое | слово1, слово2, слово3, …)

то данный твит – о Mandrill.com.

Правило, использованное для решения этой задачи – по которому выбирается наиболее вероятный класс, опираясь на слова, – известно как правило апостериорного максимума (МАР).

Но как же вычислить эти две вероятности? Первый шаг – использование правила Байеса. С помощью него можно переписать условную вероятность приложения как

р(приложение | слово1, слово2, слово3, …) = р(приложение) р(слово1, слово2, слово3, …| приложение) / р(слово1, слово2, слово3, …)

Точно так же

р(другое | слово1, слово2, слово3, …)= р(другое) р(слово1, слово2,

слово3, … | другое) / р(слово1, слово2, слово3, …)

Но, заметьте, у обоих этих вычислений в делителе

р(слово1, слово2, слово3, …)

Такая конфигурация – просто вероятность того, что эти слова вообще встретятся в документе. Так как эта величина не меняется от класса к классу, вы можете сократить на нее неравенство МАР, еще и при том, что вас интересует только наибольшее значение из

р(приложение) р(слово1, слово2, слово3, …)

р(другое) р(слово1, слово2, слово3, …)

Но как подсчитать вероятность наличия набора слов, зная, что эта запись – про приложение или, наоборот, о чем-то другом?

И тут все действительно начинает становиться идиотским!

Предположим, вероятности наличия этих слов в документах не зависят одна от другой. Тогда получаем

р(приложение) р(слово1, слово2, слово3, …| приложение) = р(приложение) р(слово| приложение) р(слово2 |приложение) р(слово| приложение)…

р(другое) р(слово1, слово2, слово3, …| другое) = р(другое) р(слово1|другое) р(слово| другое) р(слово| другое)…

Предположение о независимости позволяет разбить эту совместную условную вероятность набора слов при известном классе на вероятности нахождения каждого слова в данном классе.

И что же в этом идиотского? Да то, что слова в документе зависят друг от друга!

Если вы классифицируете спам и у вас в документе два слова – «эректильная» и «дисфункция» – то это значит

р(эректильная, дисфункция | спам) = р(эректильная | спам) р(дисфункция | спам)

Ну это же идиотизм, не так ли? Это наивность, потому что если бы я вам сказал, что у меня есть письмо-спам со словом «дисфункция» и предложил бы отгадать предшествующее ему слово, вы бы почти наверняка сказали «эректильная». Это зависимость, которая откровенно игнорируется.

Самое смешное, что, несмотря на широкое практическое применение, этот идиотизм никого не волнует. Это из-за того, что правилу МАР все равно, что вы правильно рассчитали вероятности своих классов. Для него имеет значение лишь то, какое из неправильно рассчитанных значений вероятности больше. Принимая слова как независимые, мы вносим в этот расчет множество ошибок, но, по крайней мере, эта небрежность повсеместна. Неравенства, используемые в правиле МАР, обычно проявляются так же, как если бы вы применяли разностороннее понимание лингвистики в модели.

Высококлассные вероятности часто считаются равными

Напомню, что в случае с приложением Mandrill мы хотим классифицировать твиты, основываясь на том, которая величина больше:

р(приложение) р(слово1, слово2, слово3, …| приложение) = р(приложение) р(слово| приложение) р(слово2 |приложение) р(слово| приложение)…

р(другое) р(слово1, слово2, слово3, …| другое) = р(другое) р(слово1|другое) р(слово| другое) р(слово| другое)…

Так какова же вероятность р(приложение) и р(другое)? Вы можете войти в Twitter и увидеть, что р(приложение) на самом деле около 20 %. 80 % записей, содержащих слово «mandrill», совсем о другом. Несмотря на то, что сейчас это верно, со временем все может измениться, и я бы предпочел огромное количество твитов, классифицированных как твиты о приложении (но на самом деле таковыми не являющихся – ложноположительных), отфильтровке нескольких релевантных (ложноотрицательных), так что я оцениваю свои шансы примерно 50/50. Вы постоянно будете встречать это предположение в наивном байесовском классификаторе в реальном мире, особенно в фильтрации спама, где процент спама в почте все время меняется и измерить его в глобальных масштабах довольно сложно.

Но если мы примем и р(приложение), и р(другое) за равные 50 %, то во время сравнения двух величин с помощью правила МАР вы можете просто не обращать на них внимания. Таким образом, классифицируйте твит как относящийся к приложению, если

р(приложение) р(слово1|приложение) р(слово2 |приложение) р(слово| приложение)… >= р(слово1|другое) р(слово2 |другое) р(слово| другое)…

Но как вычислить вероятность слова в классе? К примеру, рассмотрим такую вероятность:

р(«блестеть» | приложение)

Для этого нужно взять тренировочный набор твитов о приложении, разбить их на слова, подсчитать эти слова и найти процент слов, являющихся словом «блестеть». Почти наверняка это будет 0, потому что большинство твитов о мандрилах, содержащее слово «блестеть» относятся к видеоигре.

Остановитесь на секунду и подумайте об этом. Чтобы построить модель наивного байесовского классификатора, вам нужно лишь отследить частоту использования слов, связанных и не связанных с приложением, за промежуток времени. А это несложно!

Еще немного деталей классификатора

Перед началом работы с Excel нужно понять, что делать с двумя практическими препятствиями применения наивного Байеса в Excel или любом другом языке программирования:

• редкие слова;

• исчезновение порядка (антипереполнение).

Что делать с редкими словами

Первая проблема – это проблема редких слов. Что, если в записи, которую вы собрались классифицировать, есть слово «Тубал-Каин»? Основываясь на данных из тренировочного набора, можно сделать вывод, что ни в одном из классов такого слова нет. Место, где такое часто происходит в твиттере – это сокращенные адреса страниц, так как каждая новая ссылка, помещенная в Twitter, должна иметь новый код, никогда не использованный ранее.

Вы можете предположить:

р(«Тубал-Каин» | приложение) = 0

Но тогда вы получите:

р(«Тубал-Каин» | приложение) р(слово2 | другое) р(слово3 | другое)… = 0

Тубал-Каин эффективно обнуляет все вычисление вероятности.

Предположим, что вы все же встречали слово «Тубал-Каин» однажды. Можно поступить так со всеми редкими словами.

Но постойте – это же несправедливо по отношению к словам, которые вам действительно однажды встречались! Ну ладно, прибавьте и к ним 1.

Но тогда это несправедливо для слов, которые встретились вам дважды. Ладно, добавьте 1 на каждый счет.

Это называется дополнительным сглаживанием и часто используется для приспособления неведомых ранее слов к модели наборов слов (bag of words).

Что делать с исчезновением порядка

Теперь, когда мы разобрались с редкими словами, перейдем к следующей проблеме – исчезновения порядка.

Многие из встречаемых слов – редкие, поэтому в итоге получаются очень маленькие вероятности. В нашем случае большинство слов имеет вероятности менее 0,001. И из-за предположения о независимости приходится еще и перемножать эти ничтожные вероятности друг с другом.

Что, если у вас есть запись из 15 слов, вероятность каждого из которых меньше 0,001? В итоге в неравенстве МАР вы получите микроскопическое значение вроде 1 × 10–45. На самом деле Excel вполне способен обработать настолько малую величину. Он начинает спотыкаться только на сотне-другой нулей после запятой. Так что для классификации твитов такая величина вполне может сойти. Но для более объемных документов (например, писем, новостных статей) маленькие величины могут нанести серьезный ущерб вычислениям.

Просто чтобы больше не думать об этом, давайте поищем способ не делать умножение в МАР напрямую:

р(слово1|приложение) р(слово2 |приложение) … >= р(слово1|другое) р(слово2 |другое) …

Эту проблему можно решить, используя функцию логарифма (натуральный логарифм в Excel задается формулой LN).

Вот вам забавный факт из математики. Допустим, у вас есть произведение:

0,2 × 0,8

Если вы прологарифмируете его, будет верно следующее:

ln(0,2 × 0,8) = ln(0,2) + ln(0,8)

Вычисляя натуральный логарифм любого числа между 0 и 1, вместо мизерного значения с кучей нулей после запятой вы получаете четкое отрицательное число. Так что вы можете взять натуральный логарифм от каждой вероятности и сложить их, чтобы получить максимум для последующего сравнения. Это дает значение, на которое не будет ругаться компьютер.

Если вы немного растерялись, не волнуйтесь. В Excel все станет ясно и понятно.

Да начнется Excel-вечеринка!
Заметка

Электронная таблица Mandrill.xslx, используемая в этой главе, находится на сайте книги, www.wiley.com/go/datasmart. Эта таблица содержит все исходные данные для того, чтобы вы могли работать вместе со мной. Можете также просто следить за ходом повествования, используя листы, в которых все расчеты уже совершены.

В электронной таблице для этой главы – Mandrill.xslx, есть два листа с исходными данными. Первый, AboutMandrillApp, содержит 150 твитов, по одному на строку, относящихся к приложению Mandrill. Второй, AboutOther, содержит 150 твитов об остальных мандрилах.

Перед началом хочу сказать – добро пожаловать в мир обработки естественного языка (Native Language Processing, NLP)! NLP пережевывает текст, написанный человеком, и выплевывает знания. «Человеческое» содержимое (например, записи в Twitter) готово для потребления компьютером. Перед этим необходимо провести несколько мелких операций.

Убираем лишнюю пунктуацию

Первый шаг в создании набора слов из твита – это токенизирование слов, разделенных пробелами. Но не все, что отделено пробелами, является словами. Нужно перевести все буквы в строчные и удалить пунктуацию, потому что в Twitter пунктуация далеко не всегда что-то значит. Причина понижения регистра в том, что «e-mail» и «E-mail» не различаются по значению.

Поэтому в ячейку В2 на обоих листах добавьте формулу:

=LOWER(A2)

=СТРОЧН(А2)

Это переведет первую запись в строчной вид. В С2 вырежем все фразы. Не стоит кромсать ссылки, так что вырежем все части, после которых есть пробел с помощью команды SUBSTITUTE/ПОДСТАВИТЬ:

=SUBSTITUTE(В2,"."," ")

=ПОДСТАВИТЬ(В2,"."," ")

Эта формула заменяет знаки ". " единичным пробелом " ".

Вы также можете указать ячейку D2 в С2 и заменить все двоеточия с пробелами после них единичными пробелами:

=SUBSTITUTE(С2,": "," ")

=ПОДСТАВИТЬ(С2,": "," ")

В ячейках от Е 2 до Н2 необходимо сделать такие же замены знаков "?", "!", ";" и ",":

=SUBSTITUTE(D2,"?"," ")

=SUBSTITUTE(E2,"!"," ")

=SUBSTITUTE(F2,";"," ")

=SUBSTITUTE(G2,","," ")

=ПОДСТАВИТЬ(D2,"?"," ")

=ПОДСТАВИТЬ(E2,"?"," ")

=ПОДСТАВИТЬ(F2,"?"," ")

=ПОДСТАВИТЬ(G2,"?"," ")

Не нужно добавлять пробел после знаков препинания в предыдущих четырех формулах, потому что они почти не встречаются в ссылках (особенно в сокращенных).

Выделите ячейки В2:Н2 на обоих листах и кликните дважды на формуле, чтобы разослать ее дальше по листу до строки 151. Получатся два листа, вроде того, что изображен на рис. 3–3.


Разное о пробелах

Теперь создайте два новых листа и назовите их AppTokens и OtherTokens.

Вам необходимо сосчитать, сколько раз каждое слово используется в записях данной категории. Это значит, что вам нужно собрать все слова из твитов в одном столбце. Резонно предположить, что каждый твит содержит не более 30 слов (но вы смело можете увеличить их количество до 40 или даже 50), так что если вы собираетесь присваивать каждому жетону отдельную строку, вам понадобится 150 × 30 = 4500 строк.

Для начала назовите ячейку А1 на обоих листах «Tweet».

Выделите А2:А4501 и с помощью специальной вставки вставьте значения твитов из столбца Н двух начальных листов. Таким образом вы получите список всех обрабатываемых твитов, как показано на рис. 3–4. Обратите внимание: так как вы вставляете 150 твитов в 4500 строк, Excel повторяет все за вас. Восхитительно!

Это означает, что если вы выделите первое слово из первого твита в строке 2, этот самый твит повторится для выделения второго слова в строке 152, третьего – в 302 и т. д.



В столбце В вам нужно отметить положение каждого следующего пробела между словами в записи. Можете назвать этот столбец, например, Space Position. Так как в начале каждого твита больше нет пробелов, начните с помещения 0 в ячейки А2:А151, чтобы отметить, что слова начинаются с первого символа каждого твита.

Начиная с В152 после первого полного повтора твитов можно рассчитать положение следующего пробела:

=FIND(" ",A152,B2+1)

=НАЙТИ(" ",A152,B2+1)

Формула FIND/НАЙТИ будет искать в твитах следующий пробел, считая знаки от предыдущего, упомянутого в В2, который находится 150 строками выше, как показано на рис. 3–5.



Так или иначе, помните, что эта формула выдаст ошибку, как только закончатся символы в записи – если в ней, к примеру, меньше 30 слов, которые вы планировали. Чтобы справиться с этим, вам нужно вставить формулу в утверждение IFERROR/ЕСЛИОШИБКА и просто прибавить 1 к длине твита, чтобы найти положение после последнего слова:

=IFERROR(FIND(" ",A152,B2+1),LEN(A152)+1)

=ЕСЛИОШИБКА(НАЙТИ(" ",A152,B2+1),LEN(A152)+1)

Затем вы можете кликнуть дважды на этой формуле, чтобы распространить ее по таблице до А4501. Так получится лист, изображенный на рис. 3–6.



Затем в столбце С можно начать извлекать единичные жетоны (token) из твитов. Назовите столбец С Token и начиная с С2 перетаскивайте подходящие слова с помощью функции MID/ПСТР. Эта функция извлекает из строки текста начальное положение и количество символов. Так, в С2 наш текст находится в А2, начальное положение – 1 после последнего пробела (В2+1), а длина – это разница между последующим положением пробела в В152 и текущим в В2 минус 1 (не забываем, что твиты повторяются через каждые 150 строк).

Получается следующая формула:

=MID(A2,B2+1,B152-B2–1)

=ПСТР(A2,B2+1,B152-B2–1)

Теперь еще раз вернемся к коротким твитам в конце строки, в которых у нас рано заканчивались слова. Если есть ошибка, превратите этот жетон в комбинацию «.», которую потом легко будет проигнорировать:

=IFERROR(MID(A2,B2+1,B152-B2–1),".")

=ЕСЛИОШИБКА(ПСТР(A2,B2+1,B152-B2–1),".")

Теперь вы можете распространить эту формулу на весь лист двойным щелчком, чтобы токенизировать каждый твит, как показано на рис. 3–7.

Добавьте столбец Length в D и в ячейке D2 получите длину жетона в С2 в символах:

=LEN(C2)

=ДЛСТР(С2)

Можете также распространить это на весь лист двойным кликом. Это значение позволяет вам находить и удалять любой жетон в три или менее символов, которые практически всегда бессмысленны.


Заметка

Обычно в таком типе обработки натурального языка кроме удаления всех коротких слов существует еще список стоп-слов для отдельного языка (в данном случае, английского), которые также удаляются. Стоп-слова – это слова с очень низким лексическим содержанием, которое подобно содержанию питательных веществ для модели «набор слов».

К примеру, «потому что» и «вместо» могут быть стоп-словами из-за того, что они обычные и не особенно помогают отличить один документ от другого. Самые распространенные стоп-слова в английском почти всегда короткие: «a», «and», «the» и т. д., поэтому в данной главе будет рассмотрен наиболее простой, но и наиболее драконовский способ удаления коротких слов из твитов.

Если вы все делали вместе со мной, у вас должен получиться лист AppTokens, показанный на рис. 3–8 (лист Other Tokens идентичен ему, за исключением твитов, вставленных в столбец А).



Страницы книги >> Предыдущая | 1 2 3 4 5 6 7 | Следующая
  • 3 Оценок: 1

Правообладателям!

Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.

Читателям!

Оплатили, но не знаете что делать дальше?


Популярные книги за неделю


Рекомендации