主要内容

使用编辑距离搜索器创建自定义拼写纠正功能

这个例子展示了如何使用编辑距离搜索器和已知单词的词汇表来纠正拼写。

词元化与normalizeWordsword2vec需要拼写正确的单词才能工作。为了方便地纠正文本中的单词拼写,请使用用语函数。要学习如何使用编辑距离搜索器从头开始创建拼写纠正函数,请使用这个示例作为指导。

如果在文本集合中有拼写错误的单词,那么可以使用编辑距离搜索器查找与给定词汇表拼写正确的单词。要纠正文档中拼写错误的单词的拼写,可以用词汇表中最近的单词替换它们。使用编辑距离搜索根据编辑距离找到最近拼写正确的单词到拼写错误的单词。例如,相邻字素交换和字素插入、删除和替换的数量。

加载数据

建立一个已知词汇的词汇库。下载并提取面向拼写检查的单词列表(SCOWL)https://sourceforge.net/projects/wordlist/保存到当前目录中的文件夹中。使用支持功能从下载的数据中导入单词金宝appscowlWordList

folderName =“scowl-2019.10.06”;最大尺寸= 60;词汇= scowlWordList (folderName,“英语”,最大尺寸);

查看词汇表中的单词数。

numWords =元素个数(词汇)
numWords = 98213

创建简单的拼写校正器

使用导入的词汇表,创建一个最大距离为2的编辑距离搜索器。为获得更好的结果,可以通过设置“SwapCost”选项1。对于较大的词汇量,这可能需要几分钟。

maxDist = 2;eds = editDistanceSearcher(词汇、maxDist、“SwapCost”1);

这个编辑距离搜索器是区分大小写的,这意味着改变字符的大小写会影响编辑距离。例如,搜索器可以找到邻居“测试”单词“tsetting”,因为它有编辑距离1(一个交换),但不能找到单词“tsetting”,因为它有编辑距离6。

正确的拼写

通过选择拼写错误的单词并在编辑距离搜索器中找到最近的邻居,纠正标记化文档数组中拼写错误的单词。

创建包含打字错误和拼写错误的标记化文档对象。

str =“一个有拼写错误和不常见单词的例子。”;文档= tokenizedDocument (str)
document = tokenizedDocument: 8 tokens:一个带有拼写错误和averyunusalword的例子。

使用string函数将文档转换为单词的字符串数组。

话说=字符串(文档)
话说=1×8字符串一个" example " "dccoument" " " typpos " " " averyunusalword " " "。"

找出需要改正的单词。要忽略拼写正确的单词,请查找词汇表中已经存在的单词的索引。若要忽略标点符号和复杂标记(如电子邮件地址),请查找不包含标记类型“letters”或“other”的单词的索引。属性从文档中获取令牌细节tokenDetails函数。

tdetails = tokenDetails(文档);idxVocabularyWords = ismember (tdetails.Token eds.Vocabulary);idxComplexTokens =...tdetails。类型~ =“字母”...tdetails。类型~ =“其他”;idxWordsToCheck =...~ idxVocabularyWords &...~ idxComplexTokens
idxWordsToCheck =8×1逻辑数组1 1 1 0 0 0 1 0

找到单词的数字索引并查看相应的单词。

idxWordsToCheck =找到(idxWordsToCheck)
idxWordsToCheck =4×11 2 3 7
wordsToCheck =单词(idxWordsToCheck)
wordsToCheck =1×4弦"An" " example " "dccoument" " averyunusalword "

注意,单词“An”被标记为要检查的单词。这个单词被标记是因为词汇表不包含带有大写字母“A”的单词“An”。示例的后面部分将展示如何创建不区分大小写的拼写校正器。

找出最近的单词和它们之间的距离knnsearch功能与编辑距离搜索。

[idxNearestWords d] = knnsearch (eds wordsToCheck)
idxNearestWords =4×1165 1353 1152 NaN
d =4×11 1 2 Inf

如果在搜索器中没有找到任何单词,则该函数返回index随着距离的.单词“averyunusualword”在编辑距离2内没有匹配,因此该函数返回索引这个词。

找出具有正有限编辑距离的单词的索引。

idxMatches = ~ isnan (idxNearestWords)
idxMatches =4×1逻辑数组1 1 1 0

在搜索器中获取匹配词的索引,并查看词汇表中相应的修正词。

idxCorrectedWords = idxNearestWords (idxMatches)
idxCorrectedWords =3×1165 1353 1152
correctedWords = eds.Vocabulary (idxCorrectedWords)
correctedWords =1×3的字符串“一个”“例子”“文档”

用正确的单词替换拼写错误的单词。

idxToCorrect = idxWordsToCheck (idxMatches);单词(idxToCorrect) = correctedWords
话说=1×8字符串一个“例子”、“文件”、“打印错误”和“averyununusalword”。

要创建这些单词的标记文档,请使用tokenizedDocument功能和设置“TokenizedMethod”“没有”

文档= tokenizedDocument(话说,“TokenizeMethod”“没有”
document = tokenizedDocument: 8个令牌:一个带有拼写错误和averyunusualword的示例文档。

下一节将展示如何通过创建自定义拼写纠正函数并使用docfun

创建拼写校正功能

要一次纠正多个文档中的拼写,请使用前一节中的代码创建一个自定义函数,并将该函数与docfun函数。

创建一个函数,该函数将一个编辑距离搜索器、一个单词字符串数组和对应的令牌详细信息表作为输入和输出正确的单词。的用语函数,在示例的最后列出,使用相应的标记细节和编辑距离搜索器纠正单词字符串数组中的拼写。

将此函数与docfun函数,创建一个函数句柄,该句柄接受单词的字符串数组和对应的令牌详细信息表作为输入。

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

使用。修正标记化文档数组的拼写docfun使用函数句柄函数

str = [“这是一些写得很糟糕的文本。”“这里也有更多的错误。”];文件= tokenizedDocument (str);updatedDocuments = docfun(函数、文件)
updatedDocuments = 2×1 tokenizedDocument: 8 tokens:这是一些非常糟糕的文本。标志:这里也会出现更多的错误。

注意,可以将大写字符更正为不同的小写字符。例如,“Some”可以被纠正为“come”。如果编辑距离搜索词汇表中的多个单词与输入的编辑距离相同,那么该函数将输出它找到的第一个结果。例如,单词“come”和“some”与单词“some”的编辑距离都是1。

下一节将展示如何创建不区分大小写的拼写校正器。

创建不区分大小写的拼写校正器

为了防止与其他替换发生大小写冲突的差异,请使用小写词汇表创建一个编辑距离搜索器,并在使用编辑距离搜索器之前将文档转换为小写。

将词汇表转换为小写。这个操作可以引入重复的单词,通过只取唯一的值来删除它们。

vocabularyLower =低(词汇);vocabularyLower =独特(vocabularyLower);

使用与前面相同的选项,使用小写词汇表创建编辑距离搜索器。这可能需要几分钟来运行。

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

使用编辑距离搜索器纠正标记文档中单词的拼写。若要使用不区分大小写的拼写校正器,请将文档转换为小写。

documentsLower =低(文件);

使用与前面相同的步骤,使用新的编辑距离搜索器修正拼写。

func = @(words,tdetails) correctSpelling(eds,words,tdetails);documentsLower updatedDocuments = docfun(函数)
updatedDocuments = 2×1 tokenizedDocument: 8 tokens:这是一些非常糟糕的文本。标志:这里也有更多的错误。

在这里,原始文本中的“Some”在输入到拼写校正器之前被转换为“Some”。相应的单词“some”不受搜索者的影响,因为单词some出现在词汇表中。

拼写校正功能

用语函数使用相应的标记详细信息和编辑距离搜索器纠正单词字符串数组中的拼写。你可以使用这个函数docfun一次纠正多个文档的拼写。

函数用语词汇= (eds,话说,tdetails)%获取拼错单词的索引,忽略复杂的标记。idxVocabularyWords = ismember (tdetails.Token eds.Vocabulary);idxComplexTokens =...tdetails。类型~ =“字母”...tdetails。类型~ =“其他”;idxWordsToCheck =...~ idxVocabularyWords &...~ idxComplexTokens;%转换为数字索引。idxWordsToCheck =找到(idxWordsToCheck);找出最近的单词。wordsToCheck =单词(idxWordsToCheck);idxNearestWords = knnsearch (eds、wordsToCheck);找到匹配的单词。idxMatches = ~ isnan (idxNearestWords);改正单词。idxCorrectedWords = idxNearestWords (idxMatches);correctedWords = eds.Vocabulary (idxCorrectedWords);%正确单词。idxToCorrect = idxWordsToCheck (idxMatches);单词(idxToCorrect) = correctedWords;结束

另请参阅

||||||

相关的话题