主要内容

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

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

词元化与normalizeWords而且word2vec需要正确拼写的单词才能工作。若要轻松更正文本中单词的拼写,请使用用语函数。要了解如何使用编辑距离搜索器从头创建拼写更正函数,请使用此示例作为指导。

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

加载数据

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

folderName =“scowl-2019.10.06”;maxSize = 60;wordlist(文件夹名)“英语”,最大尺寸);

查看词汇表中的单词数。

numWords = numel(词汇表)
numWords = 98213

创建简单的拼写纠正器

使用导入的词汇表,创建一个最大距离为2的编辑距离搜索器。属性允许相邻的字素交换,以获得更好的结果“SwapCost”选项1。对于大型词汇表,这可能需要几分钟的时间。

maxDist = 2;= editDistanceSearcher(词汇表,maxDist,“SwapCost”1);

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

正确的拼写

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

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

str =“一份有错别字和异常字的文件示例。”;文档= tokenizedDocument(str)
document = tokenizedDocument: 8个token:一个带有错别字和异常单词的文档示例。

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

单词=字符串(文档)
话说=1×8字符串“一个”“例子”“文件”“有”“错别字”“和”“不寻常的词”“。”

找出需要改正的词语。要忽略拼写正确的单词,请找到词汇表中已经存在的单词的索引。要忽略标点符号和复杂的标记(如电子邮件地址),请查找不具有标记类型“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 10 0

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

idxWordsToCheck = find(idxWordsToCheck)
idxWordsToCheck =4×11 2 3 7
wordsToCheck = words(idxWordsToCheck)
wordsToCheck =1×4弦“一个”“例子”“文件”“每一个不寻常的词”

注意,单词“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);words(idxToCorrect) = correctedWords
话说=1×8字符串“一个”“例子”“文档”“有”“错别字”“和”“不寻常的字”“。”

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

文档= tokenizedDocument(单词,“TokenizeMethod”“没有”
document = tokenizedDocument: 8个token:一个有错别字和不寻常字的示例文档。

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

创建拼写纠正功能

若要同时更正多个文档中的拼写,请使用前一节中的代码创建一个自定义函数,并将此函数与docfun函数。

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

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

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

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

STR = [“这是一篇写得很糟糕的文章。”“这里还有更多的mitsake。”];documents = tokenizedDocument(str);updatedDocuments = docfun(func,documents)
updatedDocuments = 2×1 tokenizedDocument: 8个token:这里有一些写得很糟糕的文本。6代币:这里也会出现更多错误。

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

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

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

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

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

vocabularyLower =更低(词汇量);vocabularyLower =唯一的(vocabularyLower);

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

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

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

documentslow =低(文档);

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

func = @(words,tdetails) correctSpelling(eds,words,tdetails);updatedDocuments = docfun(func, documentslow)
updatedDocuments = 2×1 tokenizedDocument: 8个token:这里有一些写得很糟糕的文本。6个代币:这里还有一些错误。

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

拼写纠正功能

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

函数单词= correctSpelling(eds,words,tdetails)获取忽略复杂标记的拼写错误单词的索引。idxVocabularyWords = ismember(tdetails.Token,eds.Vocabulary);idxComplexTokens =...tdetails。类型~ =“字母”...tdetails。类型~ =“其他”;idxWordsToCheck =...~ idxVocabularyWords &...~ idxComplexTokens;转换为数值索引。idxWordsToCheck = find(idxWordsToCheck);找到最接近的单词。wordsToCheck = words(idxWordsToCheck);idxNearestWords = knnsearch(eds,wordsToCheck);找到有火柴的单词。idxMatches = ~isnan(idxNearestWords);使用正确的单词。idxCorrectedWords = idxNearestWords(idxMatches);correctedWords = eds.Vocabulary(idxCorrectedWords);正确的单词。idxToCorrect = idxWordsToCheck(idxMatches);words(idxToCorrect) =正确的单词;结束

另请参阅

||||||

相关的话题