主要内容

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

此示例显示了如何使用编辑距离搜索者和已知单词的词汇进行校正拼写。

lemmat化正常化字Word2vec.需要正确拼写的单词来工作。要轻松纠正文本中的单词拼写,请使用矫正力功能。要了解如何使用编辑距离搜索器从头开始创建拼写校正功能,请使用此示例作为指南。

如果您在文本集合中拼错了单词,那么您可以使用编辑距离搜索者查找最接近的正确拼写的单词给给定的词汇表。要更正文档中拼写错误的单词拼写,请将其替换为词汇中最近的邻居。使用编辑距离搜索者根据编辑距离查找最近的正确拼写拼写单词。例如,相邻的石墨圈和石墨段插入,缺失和替换的数量。

加载数据

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

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

查看词汇表中的单词数。

numwords = numel(词汇)
numwords = 98213.

创建简单的拼写校正器

使用导入的词汇表,创建一个具有最大距离的编辑距离搜索器2.为了更好的结果,允许通过设置相邻的图形互相互换'swapcost'选项1。对于较大的词汇量,这可能需要几分钟。

maxDist = 2;EDS = EditDistanceSearcher(词汇,MaxDist,'swapcost',1);

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

正确的拼写

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

创建包含拼写错误和拼写错误的令牌化文档对象。

str =“带有拼写错误和Averyunusualword的Exmaple Dccoument。”;Document = tokenizeddocument(str)
document = tokenizedDocument: 8 tokens:一个带有拼写错误和averyunusalword的例子。

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

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

找到需要更正的单词。要忽略正确拼写的单词,请在词汇中找到已有的单词的指标。要忽略标点符号和复杂的令牌,如电子邮件地址,请找到没有令牌类型“字母”或“其他”的单词的指标。使用文件中获取令牌详细信息令敬当功能。

tdetails = tokendetails(文件);idxvocabularywords = ismember(tdetails.token,eds.vocabulary);Idxcomplextokens =.......tdetails.type〜=“字母”......tdetails.type〜=“其他”;idxwordstocheck =.......〜idxvocabularywords&......〜idxcomplextopens.
idxwordstocheck =.8×1逻辑阵列1 1 1 0 0 0 1 0

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

idxwordstocheck = find(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)
idxcorrectwords =3×1165 1353 1152
纠正词= eds.vocabulary(idxcorrectwords)
纠正词=1×3字符串“”示例“”文件“

替换与纠正单词匹配的拼写错误的单词。

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

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

文档= tokenizeddocument(单词,'tokenizemethod''没有任何'的)
Document = tokenizeddocument:8个令牌:一个用typos和averyunusualword的示例文档。

下一节通过创建自定义拼写校正功能并使用时,如何一次性地纠正多个文档的拼写docfun

创建拼写校正功能

要立即更正多个文档中的拼写,请使用上一节中的代码创建自定义函数,并使用此功能docfun功能。

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

将此函数与docfun函数,创建一个函数句柄,将字符串数组和相应的令牌细节表作为输入。

func = @(单词,tdetails)矫正力强制(eds,单词,tdetails);

纠正使用数组令牌化文件的拼写docfun使用功能手柄fun

str = [“这是一些真是太棒了扭曲的texct。”“有些莫妮也介于这里。”];文档=令授权鳕(str);updateddocuments = docfun(func,documents)
UpdatedDocuments = 2×1令授权Document:8个令牌:这里有一些非常糟糕的文字。6令牌:也会在这里犯多误。

请注意,大写字符可以更正为不同的小写字符。例如,“有些”这个词可以被纠正为“来”。如果编辑距离搜索器词汇中的多个单词与输入具有相同的编辑距离,则该功能输出找到的第一个结果。例如,单词“来”和“一些”都有“一些”单词编辑距离1。

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

创建不敏感的拼写校正器

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

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

Vocabularylower =较低(词汇);Vocabularylower =独特(Vocabularylow);

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

maxDist = 2;eds = editDistanceSearcher (vocabularyLower maxDist,'swapcost',1);

使用编辑距离搜索器纠正令牌化文档中单词的拼写。要使用不敏感的拼写校正器,将文档转换为小写。

domecodationlower =较低(文件);

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

func = @(单词,tdetails)矫正力强制(eds,单词,tdetails);UpdatedDocuments = Docfun(Func,DeporyLower)
UpdatedDocuments = 2×1令授权Document:8个令牌:这里有一些非常糟糕的文字。6个令牌:这里也有更多的错误。

在这里,原始文本中的“一些”在输入到拼写校正器之前将“有些”转换为“一些”。相应的单词“有些”不受搜索者的影响,因为一些词在词汇表中发生。

拼写校正功能

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

函数单词=纠正率(EDS,单词,Tdetails)%获取忽略复杂令牌的拼写错误的指数。idxvocabularywords = ismember(tdetails.token,eds.vocabulary);Idxcomplextokens =.......tdetails.type〜=“字母”......tdetails.type〜=“其他”;idxwordstocheck =.......〜idxvocabularywords&......〜idxcomplextopens;%转换为数字索引。idxwordstocheck = find(idxwordstocheck);%找到最近的单词。WordStocheck =单词(idxwordstocheck);idxnearestwords = knnsearch(eds,wordstocheck);%找到了匹配的单词。idxmatches =〜isnan(idxnearestwords);%得到纠正的单词。idxCorrectedWords = idxNearestWords (idxMatches);correctedWords = eds.Vocabulary (idxCorrectedWords);%正确的单词。idxToCorrect = idxWordsToCheck (idxMatches);单词(idxToCorrect) = correctedWords;结尾

也可以看看

||||||

相关的话题