我正在使用Gensim Doc2Vec模型,尝试集中部分客户支持对话.我的目标是为支持团队提供自动回复建议.
图1:显示了在下一个对话行中回答用户问题的示例对话,从而可以轻松提取数据:
在谈话期间,"你好"和"我们的办公室位于纽约市"应该被建议
图2:描述了问题和答案不同步的对话
在谈话期间,"你好"和"我们的办公室位于纽约市"应该被建议
图3:描述了一个对话,其中答案的上下文是随着时间的推移建立的,并且为了分类目的(我假设),一些行是冗余的.
在对话过程中,"这里是免费试用帐户的链接"应该被建议
每个会话行(简化)我有以下数据:
谁写了行(用户或代理),文本,时间戳
我正在使用以下代码来训练我的模型:
from gensim.models import Doc2Vec
from gensim.models.doc2vec import TaggedLineDocument
import datetime
print('Creating documents',datetime.datetime.now().time())
context = TaggedLineDocument('./test_data/context.csv')
print('Building model',datetime.datetime.now().time())
model = Doc2Vec(context,size = 200, window = 10, min_count = 10, workers=4)
print('Training...',datetime.datetime.now().time())
for epoch in range(10):
print('Run number :',epoch)
model.train(context)
model.save('./test_data/model')
Run Code Online (Sandbox Code Playgroud)
问:我应该如何构建我的训练数据以及可以应用哪些启发式方法从原始数据中提取它?
在Clojure中,您需要gensym使用在宏中创建内部使用的符号以保持其卫生.但是,有时您需要在嵌套语法引号中使用相同的符号.例如,如果我想将一个值绑定到符号let并在展开的循环中打印三次,我会这样做
`(let [x# 1]
~@(repeat 3
`(println x#)))
Run Code Online (Sandbox Code Playgroud)
但那会产生
(clojure.core/let [x__2__auto__ 1]
(clojure.core/println x__1__auto__)
(clojure.core/println x__1__auto__)
(clojure.core/println x__1__auto__))
Run Code Online (Sandbox Code Playgroud)
x#在let表单中生成一个不同于println嵌套在其中的表单中的符号- 因为它们是从不同的语法引号创建的.
为了解决这个问题,我可以预先生成符号并将其注入语法引号:
(let [x (gensym)]
`(let [~x 1]
~@(repeat 3
`(println ~x)))
)
Run Code Online (Sandbox Code Playgroud)
这将产生正确的结果,在任何地方需要相同的符号:
(clojure.core/let [G__7 1]
(clojure.core/println G__7)
(clojure.core/println G__7)
(clojure.core/println G__7))
Run Code Online (Sandbox Code Playgroud)
现在,虽然它确实产生了正确的结果,但代码本身看起来很丑陋且冗长.我不喜欢"声明"一个符号,注入语法使它看起来像是来自宏外部,或者在其中的某个地方计算.我希望能够使用auto-gensym语法,这清楚地表明这些是宏内部符号.
那么,有没有办法使用嵌套语法引号的auto-gensym并使它们产生相同的符号?
关于Common lisp,我无法理解.
假设我正在编写一个类似于此的宏:
(defmacro test-macro ()
(let ((result (gensym)))
`(let ((,result 1))
(print (incf ,result)))))
Run Code Online (Sandbox Code Playgroud)
比我能做的
> (test-macro)
2
2
Run Code Online (Sandbox Code Playgroud)
现在我想看看它是如何扩展的
> (macroexpand-1 '(test-macro))
(LET ((#:G4315 1)) (PRINT (INCF #:G4315))) ;
T
Run Code Online (Sandbox Code Playgroud)
好.使用gensym生成的唯一符号打印为uninterned.
因此,据我所知,未分隔符号是评估者不在内部创建符号数据绑定的符号.
所以,如果我们宏扩展到那个形式,那么应该有一个错误(incf#:G4315).为了测试这个,我们可以在REPL中评估该表单:
> (LET ((#:G4315 1)) (PRINT (INCF #:G4315)))
*** - SETQ: variable #:G4315 has no value
Run Code Online (Sandbox Code Playgroud)
那么为什么扩展到这个字符串的宏工作得很好而表单本身没有呢?
我想测试一个使用gensyms的宏.例如,如果我想测试这个:
(defmacro m1
[x f]
`(let [x# ~x]
(~f x#)))
Run Code Online (Sandbox Code Playgroud)
我可以用宏扩展......
(macroexpand-1 '(m1 2 inc))
Run Code Online (Sandbox Code Playgroud)
...要得到...
(clojure.core/let [x__3289__auto__ 2] (inc x__3289__auto__))
Run Code Online (Sandbox Code Playgroud)
这对于一个人来说很容易验证是正确的.
但是,我如何以实用,干净的自动化方式对其进行测试?gensym不稳定.
(是的,我知道特定的宏观例子并不引人注目,但问题仍然是公平的.)
我意识到Clojure表达式可以被视为数据(它是一种同性语言),所以我可以像这样分开结果:
(let [result (macroexpand-1 '(m1 2 inc))]
(nth result 0) ; clojure.core/let
(nth result 1) ; [x__3289__auto__ 2]
((nth result 1) 0) ; x__3289__auto__
((nth result 1) 0) ; 2
(nth result 2) ; (inc x__3289__auto__)
(nth (nth result 2) 0) ; inc
(nth (nth result 2) 1) ; x__3289__auto__
)
Run Code Online (Sandbox Code Playgroud)
但这很笨拙.还有更好的方法吗?也许有数据结构'验证'库可以派上用场?也许解构会让这更容易?逻辑编程?
更新/评论: …
我正在通过Practical Common Lisp阅读/工作.我在关于在Lisp中构建测试框架的章节.
我的功能"test- +"实现如下,它的工作原理如下:
(defun test-+ ()
(check
(= (+ 1 2) 3)
(= (+ 5 6) 11)
(= (+ -1 -6) -7)))
Run Code Online (Sandbox Code Playgroud)
记住,我说,它有效,这就是为什么接下来是如此令人费解......
以下是"test- +"所指的一些代码:
(defmacro check (&body forms)
`(combine-results
,@(loop for f in forms collect `(report-result ,f ',f))))
(defmacro combine-results (&body forms)
(with-gensyms (result)
`(let ((,result t))
,@(loop for f in forms collect `(unless ,f (setf ,result nil)))
,result)))
(defmacro with-gensyms ((&rest names) &body body)
`(let ,(loop for n in names collect `(,n (gensym)))
,@body)) …Run Code Online (Sandbox Code Playgroud) 上下文化:我一直在做一个大学项目,我必须为正则表达式编写一个解析器并构建相应的 epsilon-NFA。我必须在 Prolog 和 Lisp 中做到这一点。我不知道这样的问题是否允许,如果不允许,我道歉。
我听到了我的一些同学谈论他们如何使用该函数gensym,我问他们有什么它做,甚至检查了在线,但我真的不明白这是什么功能呢既不为什么或者是最好的时候使用它。
特别是,我更感兴趣的是它在 Lisp 中的作用。谢谢你们。
gensym ×6
common-lisp ×3
lisp ×3
clojure ×2
macros ×2
doc2vec ×1
python ×1
symbols ×1
testing ×1
text-mining ×1