Рубрики
Без рубрики

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

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

Автор оригинала: Kristina Popovic.

Вступление

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

Первая программа для реализации проверки орфографии была написана в 1971 году для DEC PDP-10 . Называемая ЗАКЛИНАНИЕМ, она была способна выполнять только простые сравнения слов и обнаруживать разницу в одной или двух буквах. По мере развития аппаратного и программного обеспечения появляются и средства проверки орфографии. Современные средства проверки орфографии способны обрабатывать морфологию и использовать статистику для улучшения предложений.

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

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

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

содержание

  • Установка
  • Правильный метод()
  • Правильность
  • Учебный текстовый блок

Установка

Во-первых, нам нужно будет установить Text Blob , так как он не поставляется предустановленным. Откройте консоль и установите ее с помощью 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, этот поток будет вам знаком. Мы прочитали файл и содержимое внутри него и построили экземпляр Text Blob , передав содержимое конструктору.

Затем мы запускаем функцию 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 использует статистику употребления слов в английском языке, чтобы сделать умные предложения о том, какие слова нужно исправить. Он хранит эти статистические данные в файле под названием 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("[a-z]+", 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 неправильно написанных слов, что довольно хорошо, учитывая запуск без особого контекста.

Вывод

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

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

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