Правильное написание Используя искателей расстояния редактирования

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

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

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

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

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

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

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

numWords = numel(vocabulary)
numWords = 98129

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

Используя импортированный словарь, создайте искателя расстояния редактирования расстояние имеющее 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 array
    "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 array
    "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 array
    "an"    "example"    "document"

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

idxToCorrect = idxWordsToCheck(idxMatches);
words(idxToCorrect) = correctedWords
words = 1×8 string array
    "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);
documentsCorrected = docfun(func,documents)
documentsCorrected = 
  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);
documentsCorrected = docfun(func,documentsLower)
documentsCorrected = 
  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

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

| | | | |

Похожие темы