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