Создаем автокорректор текста на Python (аналог т9). Работаем с пакетом nltk.

МЕНЮ


Главная страница
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Библиотека NLTK, или NLTK, — пакет библиотек и программ для символьной и статистической обработки естественного языка.

Эта статья поможет вам создать простую программу автокоррекции тектса на python. Этот проект заключается в создании двух разных рекомендательных систем правописания, которые смогут принимать входные данные пользователя и рекомендовать правильно написанное слово. Звучит круто!

Natural Language Toolkit

nltk расшифровывается как Natural Language Toolkit, и всю информацию о возможностях данной библиотеки можно сделать, можно найти здесь.

В частности, мы будем использовать методы: words, edit_distance, jaccard_distance и ngrams.

edit_distance, jaccard_distance относятся к функциям-метрикам, которые будут использоваться для определения слова, наиболее похожего на ввод пользователя.

N-грамма — это непрерывная последовательность из n элементов заданного слова текста или речи. Например: «Белый дом» является биграммой и не означает в прямом смысле дом белого цвета.

Кроме того, мы также будем использовать pandas для работы с данными.

import nltk
from nltk.corpus import words
from nltk.metrics.distance import (
edit_distance,
jaccard_distance,
)
from nltk.util import ngrams
nltk.download('words')
import pandas

words.words() дает список правильно написанных слов, который был включен в библиотеку nltk . spellings_series — это проиндексированный список этих слов.


correct_spellings = words.words()
spellings_series = pandas.Series(correct_spellings)
spellings_series

Метрика: расстояние Жаккара

Это мера того, насколько непохожи два набора, я попытался объяснить это простым языком ниже:

Рассматриваемая строка будет итеративно сравниваться с каждым словом в spellings_series.

Расстояние Жаккара обычно используется для вычисления матрицы размера n x n для кластеризации и многомерного масштабирования n наборов выборок. Это расстояние является метрикой на совокупности всех конечных множеств. d ? (A, B) = 1 - J ? (A, B)

Расстояние Жаккара является мерой того, насколько непохожи два набора сдлва, и может быть найдено как дополнение к индексу Жаккара (т. е. расстояние Жаккара = 100% - индекс Жаккара).

Мы собираемся использовать пустой список с циклом for для итеративного перебора всех слов со списком spellings_series.

Функция jaccard будет принимать аргументы entries and gram_number, где entries относятся к рассматриваемым словам, а gram_number устанавливает количество используемых n-грамм (подробнее здесь). N-грамма — последовательность из n элементов. С семантической точки зрения, это может быть последовательность звуков, слогов, слов или букв. На практике чаще встречается N-грамма как ряд слов, устойчивые словосочетания называют коллокацией. Последовательность из двух последовательных элементов часто называют биграмма, последовательность из трёх элементов называется триграмма. Не менее четырёх и выше элементов обозначаются как N-грамма, N заменяется на количество последовательных элементов.

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

Далее, Distances будет итеративно вычислять соответствующие расстояния Жаккара для слов в написании с помощью встроенной функции jaccard_distance.

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

def jaccard(entries, gram_number):

outcomes = []
for entry in entries: #iteratively for loopspellings = spellings_series[spellings_series.str.startswith(entry[0])]
distances = ((jaccard_distance(set(ngrams(entry, gram_number)),
set(ngrams(word, gram_number))), word)
for word in spellings)
closest = min(distances)
outcomes.append(closest[1])
return outcomes

Теперь, с нашей замечательной новой функцией жаккарда, мы можем создать рекомендатель слов(аналог т9), JDreco. Эта функция по умолчанию принимает список строк «cormulent», «incidence», «validrate» и возвращает предлагаемый список слов.

def JDreco(entries=['cormulent', 'incendenece', 'validrate']):
"""finds the closest word based on jaccard distance"""
return jaccard(entries, 3)
print(JDreco())

Поздравляем, Ваша первая рекомендательная модель готова!

Метрика: редактирования расстояние , также известное как расстояние Левенштейна.

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

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

Функция итеративно сравнивает записи со списком правильных слов и возвращает Расстояние Левенштейна Затем слово с наименьшим расстоянием будет считаться наиболее правильным словом.

def editreco(entries=['cormulent', 'incendenece', 'validrate']):

outcomes = []
for entry in entries:
distances = ((edit_distance(entry,
word), word)
for word in correct_spellings)
closest = min(distances)
outcomes.append(closest[1])
return outcomes


editreco()

Вторая рекомендованная модель завершена!

Ввод пользователя

Теперь давайте запустим наши модели в работу. Мы попробуем составить список из 3 слов: версия с ошибкой “Three words please”— «threa woeds pleese», посмотрим, как пойдет. В приведенном ниже коде пользователю предлагается ввести три отдельных слова для создания пользовательского ввода списка.

userinput = []
for i in range(0,3):
word = input("threa woeds pleese: ")
userinput.append(word)

userinput

Вывод 1 программы :

результата вывода ‘thread’, ‘woe’, ‘plea’.

JDreco(userinput)

Вывод 2 программы :

результата вывода ‘tarea’, ‘Moed’, ‘please’

editreco(userinput)

Дальнейшие улучшения

Результаты были так далеки от того, что я ожидал! Похоже, что editreco работает лучше, правильно предлагая «пожалуйста», по сравнению с JDreco.

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

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

Спасибо за внимание!

https://t.me/ai_machinelearning_big_data - лучший ресурс для изучения машинного обучения

https://t.me/pythonl - канал для изучения Python


Источник: zen.yandex.ru

Комментарии: