【发布时间】:2016-03-01 00:55:35
【问题描述】:
我是 clojure 的新手,所以请原谅下面的愚蠢......但我正在尝试在空格上拆分字符串向量,然后从向量的整个结果向量中获取所有唯一字符串单个序列(我对序列的类型并不挑剔)。这是我尝试过的代码。
(require '[clojure.string :as str])
(require '[clojure.set :as set])
(def documents ["this is a cat" "this is a dog" "woof and a meow"])
(apply set/union (map #(str/split % #" ") documents))
我本来希望这会返回一组独特的单词,即,
#{"woof" "and" "a" "meow" "this" "is" "cat" "dog"}
但它返回一个非唯一词的向量,即,
["woof" "and" "a" "meow" "this" "is" "a" "cat" "this" "is" "a" "dog"]
最终,我只是将它包装在一个集合调用中,即,
(set (apply set/union (map #(str/split % #" ") documents)))
得到了我想要的:
#{"dog" "this" "is" "a" "woof" "and" "meow" "cat"}
但我不太明白为什么会这样。根据docs,联合函数返回一个集合。那我为什么要得到一个向量呢?
第二个问题:另一种方法就是
(distinct (apply concat (map #(str/split % #" ") documents)))
它也返回我想要的,尽管是列表形式而不是集合形式。但是on this prior SO 的一些讨论表明 concat 异常缓慢,可能比 set 操作 (?) 慢。
是这样吗...还有其他理由更喜欢其中一种方法(或第三种方法)吗?
我并不真正关心我是从另一端得到一个向量还是一个集合,但最终会关心性能方面的考虑。我正在尝试通过实际生成对我的文本挖掘习惯有用的东西来学习 Clojure,因此最终这段代码将成为有效处理大量文本数据的工作流程的一部分……是时候获得它了是的,就性能而言,而且只是一般的不愚蠢,就是现在。
谢谢!
【问题讨论】: