Prolog 如何更改正确单词的拼写错误?
如何正确更改单词的拼写: 示例1:Prolog 如何更改正确单词的拼写错误?,prolog,Prolog,如何正确更改单词的拼写: 示例1: ?-correct([p,c,o,m,t,e,r,u],X) X=[c,o,m,p,u,t,e,r] 示例2: ?-change([u,s,t,e,n,,t,d],X) Y=[ s,t,u,d,e,n,t] 它将如何工作?这就是我在第一个例子中所做的: x([c,o,m,p,u,t,e,r]). y([s,t,u,d,e,n,t]). correct(Word, CorrectWord) :- select(_, Word, CorrectWor
?-correct([p,c,o,m,t,e,r,u],X)
X=[c,o,m,p,u,t,e,r]
示例2:
?-change([u,s,t,e,n,,t,d],X)
Y=[ s,t,u,d,e,n,t]
它将如何工作?这就是我在第一个例子中所做的:
x([c,o,m,p,u,t,e,r]).
y([s,t,u,d,e,n,t]).
correct(Word, CorrectWord) :-
select(_, Word, CorrectWord),
x(CorrectWord).
您需要一个单词的知识库:
word([c,o,m,p,u,t,e,r]).
word([s,t,u,d,e,n,t]).
现在我们需要考虑您希望解决的问题,您想知道Word
和CorrectWord
是否包含完全相同的字母,但顺序不同。因此,我建议在比较之前,先确定相同的顺序:
correct(Word, CorrectWord) :-
word(CorrectWord), % Search through the knowledge base of words
sort(Word, S), sort(CorrectWord, S). % Compare the two words
sort/2是SWI Prolog的内置程序,比较是通过要求S
统一到同一事物,即已排序的单词来完成的。此方法的缺点是它不会向后运行,但也不需要更正\2和更改\2。它还允许您提出以下问题:
?- correct([p, c, o, m, t, e, r, u], [c|T]).
T = [o, m, p, u, t, e, r].
对于新的示例案例,[o,o,n,p,u,t,e,r]
要处理奇数的额外字母,可以使用类似于Jaccard系数的相似性度量<代码>交叉点/3,长度/2
,附加/3
都内置于SWI Prolog中。我使用append/3
作为联合
jaccard_coef(L1, L2, JC) :-
intersection(L1, L2, I),
length(I, LI),
append(L1, L2, U),
length(U, LU),
JC is LI/LU.
现在您的正确子句变成:
correct(Word, CorrectWord) :-
word(CorrectWord), % Search through the knowledge base of words
sort(Word, S), sort(CorrectWord, S). % Compare the two words
correct(Word, CorrectWord) :-.
word(CorrectWord),
jaccard_coef(Word, CorrectWord, JC),
JC > 0.4. % Where 0.4 is a number chosen as a threshold.
选择
0.4
,使示例通过。1将需要精确匹配,根据您要求的严格程度进行调整,或者您可以更新该方法以查找最大jaccard_coef,从而仅返回最相似的单词,而不是选择相似的单词。X(CorrectWord)。`是Prolog中的语法错误。不能有以大写字母开头的函子X=([c,o,m,p,u,t,e,r)]
(还包括印刷错误)和Y=[(s,t,u,d,e,n,t)]
在这种情况下也没有意义。它们是未终止的术语和语法错误。是的,我知道,我尝试过,但失败了。我只想用c,m,p,u,t,e,r,我想把它改成这个组件你真的应该先学习基本的,正确的Prolog语法,然后再尝试一个bug问题。我不确定你是否理解我说的话。假设我有“计算机”这个词。这是正确的词,如果我们说有像c,o,m,m,p,u,t,e,r这样的问题,n、 p,u,t,e,r或任何情况下,它可能会使这个单词不符合它应该是的样子,我想和你做比较,并会给我正确的单词。例如,单词或正确的单词有更多的字母。我想做错误的单词,o,m,p,u,r,e,r。这是一个比你在问题中所说的更大的问题。要完成此操作,您需要在correct/2
谓词中添加几个子句。在新的示例中,[o,o,n,p,u,t,e,r]
您需要使用一些度量(如Jaccard距离)来查找最接近的匹配正确单词。这不是小事。我不知道你是否明白我的意思,我想在任何情况下,将结果修正一个像o,o,n,p,u,t,e,r之类的词到这台计算机上,这是困难的?更先进?什么?更复杂,我已经更新了答案以包含一个解决方案。