Создайте пользовательскую функцию исправления орфографических ошибок Используя искателей расстояния редактирования

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

Lemmatization с normalizeWords и word2vec требует, чтобы правильно произнесенные слова по буквам работали. Чтобы легко откорректировать написание слов в тексте, используйте correctSpelling функция. Чтобы изучить, как создать функцию исправления орфографических ошибок, с нуля использующую искателей расстояния редактирования, используйте этот пример в качестве руководства.

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

Загрузка данных

Создайте словарь известных слов. Загрузите и извлеките Проверку правописания ориентированных списков слов (SCOWL) из https://sourceforge.net/projects/wordlist/ в папку в текущей директории. Импортируйте слова из загруженных данных с помощью функции поддержки scowlWordList.

folderName = "scowl-2019.10.06";
maxSize = 60;
vocabulary = scowlWordList(folderName,'english',maxSize);

Просмотрите количество слов в словаре.

numWords = numel(vocabulary)
numWords = 98213

Создайте простой орфографический корректор

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

maxDist = 2;
eds = editDistanceSearcher(vocabulary,maxDist,'SwapCost',1);

Этот искатель расстояния редактирования является чувствительным к регистру, что означает, что изменение случая символов способствует расстоянию редактирования. Например, искатель может найти соседа, "тестирующего" на слово "tseting", потому что оно имеет расстояние редактирования 1 (одна подкачка), но не слова "TSeTiNG", потому что оно имеет расстояние редактирования 6.

Правильное написание

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

Создайте маркируемый объект документа, содержащий опечатки и орфографические ошибки.

str = "An exmaple dccoument with typos and averyunusualword.";
document = tokenizedDocument(str)
document = 
  tokenizedDocument:

   8 tokens: An exmaple dccoument with typos and averyunusualword .

Преобразуйте документы массиву строк слов с помощью строковой функции.

words = string(document)
words = 1×8 string
    "An"    "exmaple"    "dccoument"    "with"    "typos"    "and"    "averyunusualword"    "."

Найдите слова той коррекцией потребности. Чтобы проигнорировать слова по буквам, которые правильно произнесены, найдите индексы слов уже в словаре. Чтобы проигнорировать пунктуацию и комплексные лексемы, такие как адреса электронной почты, найдите индексы слов, которые не имеют типов маркера "буквами" или "другим". Получите маркерные детали из документа с помощью tokenDetails функция.

tdetails = tokenDetails(document);
idxVocabularyWords = ismember(tdetails.Token,eds.Vocabulary);

idxComplexTokens = ...
    tdetails.Type ~= "letters" & ...
    tdetails.Type ~= "other";

idxWordsToCheck = ...
    ~idxVocabularyWords & ...
    ~idxComplexTokens
idxWordsToCheck = 8×1 logical array

   1
   1
   1
   0
   0
   0
   1
   0

Найдите числовые индексы слов и просмотрите соответствующие слова.

idxWordsToCheck = find(idxWordsToCheck)
idxWordsToCheck = 4×1

     1
     2
     3
     7

wordsToCheck = words(idxWordsToCheck)
wordsToCheck = 1×4 string
    "An"    "exmaple"    "dccoument"    "averyunusualword"

Заметьте, что слово "An" отмечается как слово, чтобы проверять. Это слово отмечается, потому что словарь не содержит слово "An" с верхним регистром "A". Более поздний раздел в примере показывает, как создать нечувствительный к регистру орфографический корректор.

Найдите самые близкие слова и их расстояния с помощью knnsearch функция с искателем расстояния редактирования.

[idxNearestWords,d] = knnsearch(eds,wordsToCheck)
idxNearestWords = 4×1

         165
        1353
        1152
         NaN

d = 4×1

     1
     1
     2
   Inf

Если какое-либо из слов не найдено в искателе, то функция возвращается, индексируют NaN с расстоянием Inf. Слово "averyunusualword" не имеет соответствия на расстоянии редактирования 2, таким образом, функция возвращает индекс NaN для того слова.

Найдите индексы слов с положительными конечными расстояниями редактирования.

idxMatches = ~isnan(idxNearestWords)
idxMatches = 4×1 logical array

   1
   1
   1
   0

Получите индексы слов с соответствиями в искателе и просмотрите соответствующие откорректированные слова в словаре.

idxCorrectedWords = idxNearestWords(idxMatches)
idxCorrectedWords = 3×1

         165
        1353
        1152

correctedWords = eds.Vocabulary(idxCorrectedWords)
correctedWords = 1×3 string
    "an"    "example"    "document"

Замените слова с орфографической ошибкой, которые имеют соответствия с откорректированными словами.

idxToCorrect = idxWordsToCheck(idxMatches);
words(idxToCorrect) = correctedWords
words = 1×8 string
    "an"    "example"    "document"    "with"    "typos"    "and"    "averyunusualword"    "."

Чтобы создать маркируемый документ этих слов, используйте tokenizedDocument функция и набор 'TokenizedMethod' к 'none'.

document = tokenizedDocument(words,'TokenizeMethod','none')
document = 
  tokenizedDocument:

   8 tokens: an example document with typos and averyunusualword .

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

Создайте функцию исправления орфографических ошибок

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

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

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

func = @(words,tdetails) correctSpelling(eds,words,tdetails);

Откорректируйте написание массива маркируемых документов с помощью docfun с указателем на функцию func.

str = [
    "Here is some reallyu badly wrirten texct."
    "Some moree mitsakes here too."];
documents = tokenizedDocument(str);
updatedDocuments = docfun(func,documents)
updatedDocuments = 
  2×1 tokenizedDocument:

    8 tokens: here is some really badly written text .
    6 tokens: come more mistakes here too .

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

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

Создайте нечувствительный к регистру орфографический корректор

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

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

vocabularyLower = lower(vocabulary);
vocabularyLower = unique(vocabularyLower);

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

maxDist = 2;
eds = editDistanceSearcher(vocabularyLower,maxDist,'SwapCost',1);

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

documentsLower = lower(documents);

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

func = @(words,tdetails) correctSpelling(eds,words,tdetails);
updatedDocuments = docfun(func,documentsLower)
updatedDocuments = 
  2×1 tokenizedDocument:

    8 tokens: here is some really badly written text .
    6 tokens: some more mistakes here too .

Здесь, слово "Some" в исходном тексте преобразовано в "некоторых" прежде чем быть введенным к орфографическому корректору. Соответствующее слово "некоторые" незатронуты искателем как слово, некоторые происходят в словаре.

Функция исправления орфографических ошибок

correctSpelling функция корректирует написание в массиве строк слов с помощью соответствующих маркерных деталей и искателя расстояния редактирования. Можно использовать эту функцию с docfun откорректировать написание нескольких документов целиком.

function words = correctSpelling(eds,words,tdetails)

% Get indices of misspelled words ignoring complex tokens.
idxVocabularyWords = ismember(tdetails.Token,eds.Vocabulary);

idxComplexTokens = ...
    tdetails.Type ~= "letters" & ...
    tdetails.Type ~= "other";

idxWordsToCheck = ...
    ~idxVocabularyWords & ...
    ~idxComplexTokens;

% Convert to numeric indices.
idxWordsToCheck = find(idxWordsToCheck);

% Find nearest words.
wordsToCheck = words(idxWordsToCheck);
idxNearestWords = knnsearch(eds,wordsToCheck);

% Find words with matches.
idxMatches = ~isnan(idxNearestWords);

% Get corrected words.
idxCorrectedWords = idxNearestWords(idxMatches);
correctedWords = eds.Vocabulary(idxCorrectedWords);

% Correct words.
idxToCorrect = idxWordsToCheck(idxMatches);
words(idxToCorrect) = correctedWords;

end

Смотрите также

| | | | | |

Похожие темы