我想替换地图矢量中的一些字符,其中包含文字。
这应该是一个更大的程序的一部分,它计算文本列表中的所有单词。
输入向量如下所示:
[{: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))
)
答案 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))