gpt4 book ai didi

lisp - Common Lisp 中 langutil 的问题 - 如何标记文件

转载 作者:太空宇宙 更新时间:2023-11-03 19:00:43 27 4
gpt4 key购买 nike

我一直在尝试使用 langutils 库(我使用 Quicklisp 下载)对字符串进行标记化,并且我使用的是 SBCL,但遇到了一些问题。我一直在尝试使用以下代码:

(cl-utilities:split-sequence #\Space (multiple-value-call #'(lambda (a b c d) c) (tokenize-stream (open "hello.txt"))))

输出

(“你好”“,”“”“什么”"is"“你的”“名字”。“我的”“名字”"is"“John”“Doe”。)

我的问题是:为什么 langutils 标记空格,为什么不标记句点?

顺便说一句,如果 langutils 有问题,我可以使用 Common Lisp 中的任何其他替代库吗?我尝试使用 (tokenize-file),但效果不佳 - 使用 (tokenize-file "hello.txt") 返回

函数 LANGUTILS-TOKENIZE:TOKENIZE-FILE 未定义。

并使用(标签“字符串”)返回

值 NIL 不是 HASH-TABLE 类型。

最佳答案

好的,让我们看看,排名不分先后:


是的,langutils 似乎有问题。看看它的来源,很多东西仍然被标记为“(尚未实现)”。你想用它做什么?具体来说,您希望 (tag "string")tokenize-file 做什么(docstring 不是特别清楚)?

如果您要尝试解析 Lisp 表达式,可以使用内置的 read。如果您要尝试使用自己的语法规则解析任意文件(并且正在使用 SBCL),请查看 esrap .它是 Common Lisp 中的 PEG 解析器实现。 github有一些例子。


如果你想从 split-sequence 中省略空序列,你可以给它传递额外的 :remove-empty-subseqs 关键字参数。我不完全确定为什么这不是默认设置,因为我从来没有在没有此选项的情况下调用该函数,但它可能在任何主要用例中都有意义。

你的电话应该是这样的

(cl-utilities:split-sequence 
#\Space (multiple-value-call #'(lambda (a b c d) c)
(tokenize-stream (open "hello.txt")))
:remove-empty-subseqs t)

tokenize-stream 似乎返回文件的文本内容,以及一些关于它的元数据。如果这就是您想要的,您可以很容易地编写自己的代码,而无需求助于 multiple-value-call。查看Files and Directories section of the CL Cookbook


我认为通过执行 (tokenize-stream (open "hello.txt")),您将留下一个文件句柄悬空(因为您之后没有关闭它)。这里典型的做法是调用 with-open-file

(with-open-file (s "hello.txt")
(tokenize-stream s))

关于lisp - Common Lisp 中 langutil 的问题 - 如何标记文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26196695/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com