Clojure字符串替换在地图矢量与文本

时间:2014-10-12 13:47:51

标签: algorithm clojure

我想替换地图矢量中的一些字符,其中包含文字。

这应该是一个更大的程序的一部分,它计算文本列表中的所有单词。

输入向量如下所示:

[{:text "bla. Bla! Blabla, foo"}
   {:text "hello foo? bla Foo, blabla"}
   {:text "bla blub Foo Bla blub"}]

输出应如下所示,并应按以下值排序:

{:bla 3 :Bla 2 :blub 2 :foo 2 :Foo 2 ... } 

但首先我想要一些角色的字符串太干净了。

我用地图试了但是我不明白为什么这段代码不能正常工作:

(defn clean-texts []
  (map (fn [x] (clojure.string/replace x #"[.,]" "")) (:text texts)))

整个代码如下所示:

(ns keyword-finder.core
  (:gen-class))

(def texts
  [{:text "bla. Bla! Blabla, foo"}
   {:text "hello foo? bla Foo, blabla"}
   {:text "bla blub Foo Bla blub"}])

(defn clean-texts []
  (map (fn [x] (clojure.string/replace x #"[.,]" "")) (:text texts))
)

2 个答案:

答案 0 :(得分:4)

你想要的是这样的:

(defn tokenize [s]
  (-> s
    (.replaceAll "[^a-zA-Z\\s]" "")
    (clojure.string/split #" ")))

这将从字符串中删除所有非字母,因此在应用于" bla时。等等,等等#34;它会给你" bla blah blah"

(defn word-counts [texts]
  (let [tokens
    (->> texts
        (map (comp tokenize :text))
        (apply concat)
        (map keyword))]
   (frequencies tokens)))

此函数从地图中提取键:文本的值,将tokenize应用于所有结果字符串,将它们连接成单词列表,将它们转换为关键字,最后使用构建返回关键字计数-in function frequencies

(word-counts texts)

产生{:bla 3,:Bla 2,:Blabla 1,:foo 2,:hello 1,:Foo 2,:blabla 1,:blub 2}

答案 1 :(得分:3)

您正在将map应用于错误的序列:

(:text texts)

返回nil,因为:text已应用于整个texts列表。

您可能想要做的是map整个texts列表中的内部函数,同时为每个元素提取:text

(defn clean-texts []
     (map (fn [x] (clojure.string/replace (:text x) #"[.,]" "")) texts))