Aspiring Data Science
370 subscribers
425 photos
11 videos
10 files
1.87K links
Заметки экономиста о программировании, прогнозировании и принятии решений, научном методе познания.
Контакт: @fingoldo

I call myself a data scientist because I know just enough math, economics & programming to be dangerous.
Download Telegram
#python #npl #spellchecking

А кто работал со спеллчекерами в Питоне? contextualSpellCheck, якобы построенный на базе Bert-a, кажется довольно тупо сделанным.

Хотел их поругать, но нет, после изучения кода оказалось, что они как раз и сравнивают кандидатов от Берта с самой опечаткой. Просто вероятности они выводят ДО переранжирования, + в конкретном примере ванильный Берт не выдал ни одного хорошего кандидата.
#nlp #spellchecking

Продолжаю работать с contextualSpellCheck. Хотя они оказались не так плохи, как я вначале подумал, они всё же налажали. Их либа рассматривает только 10 вариантов подстановки от нейронной модельки, и изменить это число невозможно без перекомпиляции (шучу, это же питон, можно просто отредактировать исходники). Не глупость ли это? Ну спасибо, ребята, что за всех решили, что 10 кандидатов будет достаточно. Кстати, это прямо частый паттерн, когда создатели библиотеки часть внутренних параметров хардкодят и забывают открывать. Понятно, что для их повседневных задач это не оказалось нужным, а остальным-то что делать?

С top_n=1000 на предыдущем примере получается уже более осмысленный ответ, Cuba вместо точки, и даже правильный ответ Dubai мелькает.

Но тут уже удивляет пакет editdistance. Каким образом у них Cuba более похожа на dubia, чем Dubai?
#python #npl #spellchecking #bayes

А, понял, в чём дело. Я почему-то думал, что расстояние Левенштейна учитывает перестановки, а на самом деле туда входят только замены, вставки, удаления. Тогда действительно Dubai->Cuba это замена и удаление, Dubai->Dubia это удаление и вставка. + contextualSpellCheck при сравнении кандидатов не учитывает регистр, так что d и D у него различные символы. Что мне нужно, так это более общее расстояние Дамерау-Левенштейна, которое уже учитывает свопы.

От Берта кандидаты приходят с такими вероятностями: ('Cuba', 0.00026), ('Dubai', 0.00017). contextualSpellCheck из представленных кандидатов выбирает ответ наиболее похожий на саму опечатку. Хотя в докстринге они говорят "At present using a library to calculate edit distance between actual word and candidate words. Candidate word for which edit distance is lowest is selected. If least edit distance is same then word with higher probability is selected by default", это неправда, на вероятности в методе candidate_ranking вообще не смотрят. Мы могли бы пойти тем же путём и получить правильный ответ, но это ненаучно, и было бы, видимо, просто везением ) Не зря же Берты тренировались на огромных массивах текстов? Давайте посмотрим, кто победит, если мы будем рассматривать Бертовы вероятности как априорные, а текстовые схожести (в смысле Дамерау-Левенштейна) кандидата и опечатки как вероятность B/A что правильный ответ - это кандидат A, при том что человек напечатал B. Мне всё-таки интересно, в Дубай сложнее визу получить, или на Кубу?

В нашем случает полную вероятность P(B) вычислять не надо, она константна для всех кандидатов и на аргмакс не влияет. Получается, нам надо выбрать кандидата с максимальным произведением вероятности Берта на похожесть с опечаткой. Строго говоря, Бертовы вероятности можно еще нормировать на сумируемость к единице, т.к. у нас ограниченная выборка кандидатов из всего словаря, но это опять же будет константа, и на выбор не повлияет.
👍2
#python #npl #spellchecking #bayes
Итак, после нескольких часов допиливания конструктор contextualSpellCheck обзавёлся несколькими новыми параметрами:

top_n (int, optional): suggestions from underlying ANN model to be considered. Defaults to 10.
lowercased_distance (bool, optional): lowercase candidates before computing edit distance. Defaults to True.
damerau_distance (bool, optional): additionally account for symbol swaps when calculating a distance. Defaults to True.
bayes_selection (bool, optional): use bayes reasoning when selecting the best candidate. Bert probabilities are the prior, textual similarities of candidates to the input are treated as the probabilities B/A that the corect candiadte is A, while the input was B. Defaults to True.
ranked_bert_probs (bool, optional): use ranked probs as oppposed to the absolute probs values coming from Bert. Defaults to True.

И я научил электронного болвана понимать, что имелась в виду виза в Дубай. 😁
#python #npl #spellchecking #bayes

Вот разбивочка, как Байесовский метод приходит к выводу, что подразумевался Дубай.
1👍1
#python #npl #spellchecking #bayes

Это мы брали ранговые оценки вероятностей, для смягчения приора. Если же сильно поверить Берту и взять абсолютные оценки, Дубай улетает за первую десятку. Я не знаю, если честно, насколько хорошо Берты откалиброваны по вероятностям, может, @tech_priestess подскажет?

По итогу внёс в либу contextualSpellCheck предложение новой функциональности. А ну как удастся прокрасться в контрибьюторы почти что Spacy. )
❤‍🔥1👍1
#nlp #spellchecking

Кстати, если решите отлавливать опечатки, и SpaCy входит в ваш инструментарий, используйте мой форк либы contextualSpellCheck. У нас есть печеньки GPU, Дамерау и Байес! А если статью сравнительную напишете, будет вообще чудесно, мне некогда (.
👍1