Исправление орфографии в Python с помощью TextBlob

Введение Орфографические ошибки являются обычным явлением, и большинство людей привыкло к программному обеспечению, указывающему, была ли ошибка допущена. От автокоррекции на наших телефонах до красного подчеркивания в текстовых редакторах - проверка орфографии является важной функцией для многих различных продуктов. Первая программа, реализующая проверку орфографии, была написана в 1971 году для DEC PDP-10. Названный SPELL, он был способен выполнять только простые сравнения слов и обнаруживать различия в одной или двух буквах. По мере развития аппаратного и программного обеспечения

Вступление

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

Первая программа, реализующая проверку орфографии, была написана в 1971 году для DEC PDP-10 . Названный SPELL, он был способен выполнять только простые сравнения слов и обнаруживать различия в одной или двух буквах. По мере развития аппаратного и программного обеспечения появляются и средства проверки орфографии. Современные средства проверки правописания способны обрабатывать морфологию и использовать статистику для улучшения предложений.

Python предлагает множество модулей для использования с этой целью, что делает написание простого средства проверки орфографии легким 20-минутным испытанием.

Одной из этих библиотек является TextBlob , которая используется для обработки естественного языка и предоставляет интуитивно понятный API для работы.

В этой статье мы рассмотрим, как реализовать исправление орфографии в Python с помощью TextBlob .

Оглавление

Монтаж

Во-первых, нам нужно установить TextBlob , поскольку он не предустановлен. Откройте консоль и установите ее с помощью pip :

 $ pip install textblob 

Это должно установить все, что нам нужно для этого проекта. По окончании установки вывод консоли должен включать что-то вроде:

 Successfully installed click-7.1.2 joblib-0.17.0 nltk-3.5 regex-2020.11.13 textblob-0.15.3 

TextBlob построен на основе NLTK, поэтому он также поставляется с установкой.

Правильная () функция

Самый простой способ исправить вводимый текст - использовать метод correct() . В качестве примера текста мы будем использовать абзац из книги Чарльза Дарвина «Происхождение видов», которая является частью общественного достояния и упакована в файл с именем text.txt .

Кроме того, мы добавим несколько умышленных орфографических ошибок:

 As far as I am abl to judg, after long attnding to the sbject, the condiions of lfe apear to act in two ways—directly on the whle organsaton or on certin parts alne and indirectly by afcting the reproducte sstem. Wit respct to te dirct action, we mst bea in mid tht in every cse, as Profesor Weismann hs latly insistd, and as I have inidently shwn in my wrk on "Variatin undr Domesticcation," thcere arae two factrs: namly, the natre of the orgnism and the natture of the condiions. The frmer sems to be much th mre importannt; foor nealy siimilar variations sometimes aris under, as far as we cn juddge, disimilar conditios; annd, on te oter hannd, disssimilar variatioons arise undder conditions which aappear to be nnearly uniiform. The efffects on tthe offspring arre ieither definnite or in definite. They maay be considdered as definnite whhen allc or neearly all thhe ofefspring off inadividuals exnposed tco ceertain conditionas duriing seveal ggenerations aree moodified in te saame maner. 

Почти в каждом слове полно орфографических ошибок. Давайте напишем простой скрипт, используя TextBlob, чтобы исправить эти ошибки и распечатать их обратно в консоль:

 from textblob import TextBlob 
 
 with open("text.txt", "r") as f: # Opening the test file with the intention to read 
 text = f.read() # Reading the file 
 textBlb = TextBlob(text) # Making our first textblob 
 textCorrected = textBlb.correct() # Correcting the text 
 print(textCorrected) 

Если вы раньше работали с TextBlob, этот процесс покажется вам знакомым. Мы прочитали файл и его содержимое и TextBlob экземпляр TextBlob, передав содержимое конструктору.

Затем мы запускаем в correct() для исправления орфографии.

После запуска приведенного выше сценария вы должны получить примерно такой результат:

 Is far as I am all to judge, after long attending to the subject, the conditions of life appear to act in two ways—directly on the while organisation or on certain parts alone and indirectly by acting the reproduce system. It respect to te direct action, we must be in mid the in every case, as Professor Weismann he lately insisted, and as I have evidently shown in my work on "Variation under Domesticcation," there are two facts: namely, the nature of the organism and the nature of the conditions. The former seems to be much th are important; for nearly similar variations sometimes arms under, as far as we in judge, similar condition; and, on te other hand, disssimilar variations arise under conditions which appear to be nearly uniform. The effects on the offspring are either definite or in definite. They may be considered as definite when all or nearly all the offspring off individuals exposed to certain conditions during several generations are modified in te same manner. 

Насколько верна коррекция орфографии TextBlob?

Как видим, в тексте остались орфографические ошибки. Такие слова, как "abl" должны были означать "able" , а не "all" . Хотя даже с ними он все равно лучше оригинала.

Теперь возникает вопрос, насколько это лучше?

Следующий фрагмент кода представляет собой простой скрипт, который проверяет, насколько хорошо TextBlob исправляет ошибки, на основе этого примера:

 from textblob import TextBlob 
 
 # A function that compares two texts and returns 
 # the number of matches and differences 
 def compare(text1, text2): 
 l1 = text1.split() 
 l2 = text2.split() 
 good = 0 
 bad = 0 
 for i in range(0, len(l1)): 
 if l1[i] != l2[i]: 
 bad += 1 
 else: 
 good += 1 
 return (good, bad) 
 
 # Helper function to calculate the percentage of misspelled words 
 def percentageOfBad(x): 
 return (x[1] / (x[0] + x[1])) * 100 

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

 with open("test.txt", "r") as f1: # test.txt contains the same typo-filled text from the last example 
 t1 = f1.read() 
 
 with open("original.txt", "r") as f2: # original.txt contains the text from the actual book 
 t2 = f2.read() 
 
 t3 = TextBlob(t1).correct() 
 
 mistakesCompOriginal = compare(t1, t2) 
 originalCompCorrected = compare(t2, t3) 
 mistakesCompCorrected = compare(t1, t3) 
 
 print("Mistakes compared to original ", mistakesCompOriginal) 
 print("Original compared to corrected ", originalCompCorrected) 
 print("Mistakes compared to corrected ", mistakesCompCorrected, "\n") 
 
 print("Percentage of mistakes in the test: ", percentageOfBad(mistakesCompOriginal), "%") 
 print("Percentage of mistakes in the corrected: ", percentageOfBad(originalCompCorrected), "%") 
 print("Percentage of fixed mistakes: ", percentageOfBad(mistakesCompCorrected), "%", "\n") 

Запустив его, вы распечатаете:

 Mistakes compared to original (126, 194) 
 Original compared to corrected (269, 51) 
 Mistakes compared to corrected (145, 175) 
 
 Percentage of mistakes in the test: 60.62499999999999 % 
 Percentage of mistakes in the corrected: 15.937499999999998 % 
 Percentage of fixed mistakes: 54.6875 % 

Как мы видим, correct метод позволил получить процент орфографических ошибок с 60,6% до 15,9%, что довольно неплохо, однако есть небольшая загвоздка. Он исправил 54,7% слов, так почему до сих пор остается 15,9% ошибок?

Ответ - чрезмерное исправление . Иногда он может изменить слово, которое написано правильно, например, первое слово в нашем примере текста, где "As" было исправлено на "Is" . В других случаях у него просто недостаточно информации о слове и контексте, чтобы сказать, какое слово пользователь намеревался ввести, поэтому он догадывается, что следует заменить "whl" на "while" вместо "whole" .

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

Обучение TextBlob с пользовательскими наборами данных

Что делать, если вы хотите проверить орфографию на другом языке, который не поддерживается TextBlob из коробки? Или, может быть, вы хотите немного уточнить? Что ж, может быть способ добиться этого. Все сводится к тому, как работает проверка орфографии в TextBlob.

TextBlob использует статистику использования слов на английском языке, чтобы делать разумные предложения по поводу того, какие слова следует исправить. Он хранит эту статистику в файле с именем en-spelling.txt , но также позволяет вам создать свой собственный файл статистики использования слов.

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

В нашем случае остальная часть книги предоставит отличный контекст и дополнительную информацию, которая потребуется TextBlob для более точного исправления.

Перепишем скрипт:

 from textblob.en import Spelling 
 import re 
 
 textToLower = "" 
 
 with open("originOfSpecies.txt","r") as f1: # Open our source file 
 text = f1.read() # Read the file 
 textToLower = text.lower() # Lower all the capital letters 
 
 words = re.findall("[az]+", textToLower) # Find all the words and place them into a list 
 oneString = " ".join(words) # Join them into one string 
 
 pathToFile = "train.txt" # The path we want to store our stats file at 
 spelling = Spelling(path = pathToFile) # Connect the path to the Spelling object 
 spelling.train(oneString, pathToFile) # Train 

Если мы заглянем в train.txt , мы увидим:

 a 3389 
 abdomen 3 
 aberrant 9 
 aberration 5 
 abhorrent 1 
 abilities 1 
 ability 4 
 abjectly 1 
 able 54 
 ably 5 
 abnormal 17 
 abnormally 2 
 abodes 2 
 ... 

Это означает, что слово "a" как слово 3389 раз, а слово "ably" только 5 раз. Чтобы протестировать эту обученную модель, мы будем использовать suggest(text) вместо correct(text) , которое представляет собой список кортежей с достоверностью слов. Первым элементом в списке будет слово, в котором он уверен, поэтому мы можем получить к нему доступ через suggest(text)[0][0] .

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

 from textblob.en import Spelling 
 from textblob import TextBlob 
 
 pathToFile = "train.txt" 
 spelling = Spelling(path = pathToFile) 
 text = " " 
 
 with open("test.txt", "r") as f: 
 text = f.read() 
 
 words = text.split() 
 corrected = " " 
 for i in words : 
 corrected = corrected +" "+ spelling.suggest(i)[0][0] # Spell checking word by word 
 
 print(corrected) 

И теперь это приведет к:

 As far as I am all to judge after long attending to the subject the conditions of life appear to act in two ways—directly on the whole organisation or on certain parts alone and indirectly by acting the reproduce system It respect to the direct action we most be in mid the in every case as Professor Weismann as lately insisted and as I have incidently shown in my work on "Variatin under Domesticcation," there are two facts namely the nature of the organism and the nature of the conditions The former seems to be much th are important for nearly similar variations sometimes arise under as far as we in judge dissimilar conditions and on the other hand dissimilar variations arise under conditions which appear to be nearly uniform The effects on the offspring are either definite or in definite They may be considered as definite when all or nearly all the offspring off individuals exposed to certain conditions during several generations are modified in the same manner. 

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

Заключение

В этой статье мы использовали TextBlob для реализации базового корректора орфографии, как с моделью прогнозирования акций, так и с пользовательской.

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

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

comments powered by Disqus