如何更改正确单词的拼写错误?

时间:2018-06-17 13:57:43

标签: 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, CorrectWord),
    x(CorrectWord).

1 个答案:

答案 0 :(得分:0)

你需要一个单词的知识库:

SELECT CONTROL_NUMBER, 
       Min(case when tran_type = '961' then START_TRAN_TIME else null end) AS START_T, 
       Min(case when tran_type = '306' then START_TRAN_TIME else null end) AS PICK_T, 
       Min(case when tran_type = '340' then START_TRAN_TIME else null end) AS SHIP_T, 
FROM T_TRAN_LOG
WHERE  WH_ID = 'W376' 
Group by CONTROL_NUMBER

现在我们需要考虑您要解决的问题,您想知道word([c,o,m,p,u,t,e,r]). word([s,t,u,d,e,n,t]). Word是否包含完全相同的字母,但顺序不同。所以我建议在比较它们之前使订单相同:

CorrectWord

sort / 2是SWI-Prolog的内置函数,通过要求correct(Word, CorrectWord) :- word(CorrectWord), % Search through the knowledge base of words sort(Word, S), sort(CorrectWord, S). % Compare the two words 统一到同一个东西(即已排序的单词)来完成比较。这种方法的缺点是它不会向后运行,但你也不需要正确的\ 2和更改\ 2。它还允许您提出这样的问题:

S

对于新的示例案例?- correct([p, c, o, m, t, e, r, u], [c|T]). T = [o, m, p, u, t, e, r]. 并处理奇数额外字母,您可以使用像Jaccard Coefficient这样的相似性度量。 [o,o,n,p,u,t,e,r]intersection/3length/2都内置于SWI-Prolog。我正在使用append/3作为联盟。

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. 以便示例通过。 1需要完全匹配,根据您的要求调整它,或者您可以更新方法以找到最大的jaccard_coef以仅返回最相似的单词而不是选择相似的单词。