如何正确更改单词的拼写:
示例使用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).
答案 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/3
,length/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以仅返回最相似的单词而不是选择相似的单词。