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

Common Lisp中langutil的问题-如何标记文件,lisp,nlp,common-lisp,tokenize,Lisp,Nlp,Common Lisp,Tokenize,我一直在尝试使用langutils库(我使用Quicklisp下载了该库)对字符串进行标记,我正在使用SBCL,但我遇到了一些问题。我一直在尝试使用以下代码: (cl实用程序:拆分序列#\Space(多值调用#')(lambda(a b c d)c)(标记化流(打开“hello.txt”))) 与输出 (“你好”,“你的名字”是什么。“我的名字”是“约翰·多伊”) 我的问题是:为什么langutils标记一个空格,为什么它不标记句点 另外,如果langutils有缺陷,那么在CommonLisp

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

(cl实用程序:拆分序列#\Space(多值调用#')(lambda(a b c d)c)(标记化流(打开“hello.txt”)))

与输出

(“你好”,“你的名字”是什么。“我的名字”是“约翰·多伊”)

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

另外,如果langutils有缺陷,那么在CommonLisp中还有其他库可以使用吗?我尝试过使用(tokenize文件),但效果不太好-使用(tokenize文件“hello.txt”)返回

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

并使用(标记“string”)返回


值NIL不是HASH-TABLE类型。

好的,让我们看看,没有特定顺序:


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

如果要解析Lisp表达式,可以使用内置的
read
。如果您打算用任意文件自己的语法规则(并且使用SBCL)解析任意文件,请看一看。它是公共Lisp中的PEG解析器实现。这本书有一些例子


如果要从
拆分序列
中省略空序列,可以将附加的
:remove empty subseq
关键字参数传递给它。我不完全确定为什么这不是默认值,因为我从来没有在没有这个选项的情况下调用过这个函数,但是它可能在任何主要用例中都是有意义的

你的电话应该是

(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
似乎返回文件的文本内容,以及一些关于该文件的元数据。如果这就是您想要的,那么编写自己的代码就很容易了,无需求助于
多值调用
。见


我认为通过执行
(tokenize stream(打开“hello.txt”)
,您将使一个文件句柄悬而未决(因为您之后不会关闭它)。这里要做的典型事情是用打开的文件调用

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

为了回答您的第一个问题,我希望(标记“string”)返回字符串的词性标记。接下来,tokenize stream实际应该做的是标记文件的文本内容——例如,在一句话“我有一个appt,但你没有”中,正确的标记是(“我有一个appt,但你没有”)。话虽如此,我想我还是试着自己实现它,而且我认为使用remove empty subsq和remove non-字母数字字符(在某些情况下除了句点)应该是可行的。@user124577-如果这是您想要从
标记中得到的,您可以查看数据库。可能还有更全面的数据集,但这是我以前经常使用的数据集。在使用
langutils:tag
之前,请尝试调用
(langutils:init langutils)
(第n个值2(标记化…)
是编写
多值调用的一种稍微简单的方法。