В этом примере показано, как откорректировать написание с помощью искателей расстояния редактирования и словаря известных слов.
Если вы написали слова 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
docfun
| editDistance
| editDistanceSearcher
| knnsearch
| tokenDetails
| tokenizedDocument