Lisp中基于字符匹配的排序表

Lisp中基于字符匹配的排序表,lisp,common-lisp,Lisp,Common Lisp,根据候选字符的常用拼写字符计算并返回候选字符列表 比如说,, 如果列表是:(比他们年轻的团队,然后是时代城) 在函数(“thim”)中提供参数 然后,它应该根据列表中常见字符的相似性对列表进行排序。 它应该会回来:(他们的时间团队比城市青少年) 因为它们与“thim”有更多的共同特征,所以它首先出现,以此类推 我的尝试: (defun correctSX_SIM(word) (setf w (correctSX word)) ; w is list of wor

根据候选字符的常用拼写字符计算并返回候选字符列表

比如说,, 如果列表是:(比他们年轻的团队,然后是时代城) 在函数(“thim”)中提供参数 然后,它应该根据列表中常见字符的相似性对列表进行排序。 它应该会回来:(他们的时间团队比城市青少年) 因为它们与“thim”有更多的共同特征,所以它首先出现,以此类推

我的尝试:

       (defun correctSX_SIM(word)

        (setf w (correctSX word))  ; w is list of words.
        (sort w #'eq :key #'car)

       )

我知道我的答案太离谱了。但是我需要有关LISP的帮助,因为我不知道LISP的所有内置功能。

首先,为已知单词列表定义一个特殊变量:

(defparameter *dictionary* '(TEAM TEEN THAN THEM THEN TIME TOWN))
必须为符合要求的单词定义距离函数。如果我没有弄错的话,以下几点应该是有效的:

(defun distance (u v)
  (- (length (intersection (coerce u 'list)
                           (coerce v 'list)))))
我们查看两个字符串中共同的元素数量,并将其取反,因此共享最大元素数量的元素得分最低。我不知道这是否重要,但长的相同字符串比短的相同字符串的分数低


根据您的需求,您需要执行稳定排序,以便与所选单词保持相同距离的单词保持其相对顺序。这也是为什么我使用严格的
#“首先,为已知单词列表定义一个特殊变量:

(defparameter *dictionary* '(TEAM TEEN THAN THEM THEN TIME TOWN))
必须为符合要求的单词定义距离函数。如果我没有弄错的话,以下几点应该是有效的:

(defun distance (u v)
  (- (length (intersection (coerce u 'list)
                           (coerce v 'list)))))
我们查看两个字符串中共同的元素数量,并将其取反,因此共享最大元素数量的元素得分最低。我不知道这是否重要,但长的相同字符串比短的相同字符串的分数低


根据您的需求,您需要执行稳定排序,以便与所选单词保持相同距离的单词保持其相对顺序。这也是为什么我使用严格的
#“有一种算法可以测量两个单词之间的差异。您可以找到CommonLisp的完整实现。此外,显示两个字符串之间差异的更简单方法是设置差异的函数,如图所示。

有一种算法可用于测量两个单词之间的差异。您可以找到CommonLisp的完整实现。另外,显示两个字符串之间差异的更简单方法是
set difference
函数,如图所示。

您不应该使用
levenshtein:distance
as:KEY,因为每次
sort
进行比较时都会调用KEY函数(我想它取决于实现,但在这种情况下,它会被调用19次). 最好将列表映射到具有距离的conse中,然后使用
#car
as:KEY。@jkiiski看起来好像CLHS没有规定如何调用KEY函数,因此“一次记住”或“每次”都是完全有效的。但是,在执行映射过程时,返回
(cons(key element)element)
,然后使用
:key#car
进行排序,最后使用
(mapcar#cdr…
结束,保证每个元素只调用一次(昂贵的)键。顺便说一句,该模式(修饰、排序、取消修饰)有一个名称:Schwartzian transform.Coredump,你能告诉我在sored字典函数中应该传递什么作为距离吗?谢谢距离参数应该是两个字符串参数的函数。我不知道该怎么计算,因为我真的不明白你排序单词的标准是什么。如果您能详细介绍一下比较算法,那会有所帮助。您不应该使用
levenshtein:distance
as:KEY,因为每次
sort
进行比较时都会调用KEY函数(我想它取决于实现,但在本例中,它会被调用19次)。最好将列表映射到具有距离的conse中,然后使用
#car
as:KEY。@jkiiski看起来好像CLHS没有规定如何调用KEY函数,因此“一次记住”或“每次”都是完全有效的。但是,在执行映射过程时,返回
(cons(key element)element)
,然后使用
:key#car
进行排序,最后使用
(mapcar#cdr…
结束,保证每个元素只调用一次(昂贵的)键。顺便说一句,该模式(修饰、排序、取消修饰)有一个名称:Schwartzian transform.Coredump,你能告诉我在sored字典函数中应该传递什么作为距离吗?谢谢距离参数应该是两个字符串参数的函数。我不知道该怎么计算,因为我真的不明白你排序单词的标准是什么。如果你能详细介绍一下比较算法,那会有帮助的。
(defun sorted-dictionary (input-word)
  (let ((list
          (stable-sort
            (loop for word in *dictionary*
                  collect (cons 
                            (distance input-word (string word))
                            word))
             #'<
             :key #'car)))
    (map-into list #'cdr list)))