exponenta event banner

Создание пользовательской функции исправления орфографии с помощью функции «Редактировать поисковики расстояний»

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

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

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

Загрузить данные

Создайте словарный запас известных слов. Загрузите и извлеките ориентированные на проверку орфографии списки слов (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"    "."

Найдите слова, которые нужно исправить. Чтобы игнорировать слова, которые правильно написаны, найдите индексы слов уже в лексике. Чтобы игнорировать знаки препинания и сложные маркеры, такие как адреса электронной почты, найдите индексы слов, которые не имеют типов маркеров «letters» или «other». Получение сведений о маркере из документа с помощью 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 .

Обратите внимание, что символы верхнего регистра могут быть скорректированы на различные символы нижнего регистра. Например, слово «Некоторые» можно исправить на «приходят». Если несколько слов в словаре средства поиска расстояния редактирования имеют одинаковое расстояние редактирования до входа, то функция выводит первый найденный результат. Например, слова «come» и «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» в исходном тексте преобразуется в «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

См. также

| | | | | |

Связанные темы