Stanford corenlp:top K ngrams with count
Stanford corenlp: top K ngrams with count
如何使用 stanford corenlp 获取前 K 个 ngram 及其计数?我知道我可以使用 HashMap 或 Trai 编写此代码,但我的语料库非常大(20 万篇文章,每篇平均大小为 30KB),我需要 5 克,因此内存需求会很大。因此我想知道我是否可以为此目的使用 corenlp。
因此,给定一个语料库,它应该 return 只有这种格式的前 K 个 ngram:
word1 word2 word3 word4 word5:频率
我不需要任何概率模型。
CoreNLP 没有任何东西可以帮助您有效地存储 ngram。在这里它能帮助你的只是将文本标记化(如果你关心的话,还可能将文本分割成句子)。
如果你的语料库足够大以至于你不能只使用散列 table 来保持 n-gram 计数,你将不得不使用更 space 高效的替代方法表示(例如前缀特里)。
例如,我刚刚在 Clojure 中做了一个快速测试,我计算了 Gutenberg King James V Bible 中的 5 克。使用哈希图存储 752K 个不同的 5 克的计数使用了 248 MB 的堆。使用前缀 trie 存储使用 57 MB 的计数——减少 77%。
作为参考,下面是使用前缀尝试的完整 Clojure 程序:
(ns nlp.core
(:require [clojure.string :as string]))
(defn tokenize
"Very simplistic tokenizer."
[text]
(string/split text #"[\s\:_\-\.\!\,\;]+"))
(defn get-bible-kjv-tokens []
(tokenize (slurp "/Users/wiseman/nltk_data/corpora/gutenberg/bible-kjv.txt")))
(defn ngrams [n tokens]
(partition n 1 tokens))
(defn build-ngram-trie [n tokens]
(->> tokens
(ngrams n)
(reduce (fn [trie ngram]
(update-in trie ngram #(if % (inc %) 1)))
{})))
(defn enumerate-trie [trie]
(if (not (map? trie))
(list (list trie))
(apply concat
(for [[k v] trie]
(map #(cons k %)
(enumerate-trie v))))))
(defn print-trie [trie]
(doseq [path (enumerate-trie trie)]
(println (string/join " " (butlast path)) ":" (last path))))
(defn -main []
(let [ngram-counts (->> (get-bible-kjv-tokens)
(build-ngram-trie 5))]
(print-trie ngram-counts)))
以及詹姆士五世圣经的输出:
$ lein run -m nlp.core | sort -r -k7,7 -n ngrams.txt | head
And it came to pass : 383
the house of the LORD : 233
the word of the LORD : 219
of the children of Israel : 162
it came to pass when : 142
the tabernacle of the congregation : 131
saith the LORD of hosts : 123
it shall come to pass : 119
And the LORD said unto : 114
And the LORD spake unto : 107
关于获得更高效率的一些指示,以下论文讨论了大型语料库的高效 n-gram 存储:
ADtrees for Sequential Data and N-gram Counting - 使用自定义数据结构。
Faster and Smaller N-Gram Language Models - "Our most compact representation can store all 4 billion n-grams and associated counts for the Google n-gram corpus in 23 bits per n-gram, the most compact lossless representation to date"
如何使用 stanford corenlp 获取前 K 个 ngram 及其计数?我知道我可以使用 HashMap 或 Trai 编写此代码,但我的语料库非常大(20 万篇文章,每篇平均大小为 30KB),我需要 5 克,因此内存需求会很大。因此我想知道我是否可以为此目的使用 corenlp。 因此,给定一个语料库,它应该 return 只有这种格式的前 K 个 ngram:
word1 word2 word3 word4 word5:频率
我不需要任何概率模型。
CoreNLP 没有任何东西可以帮助您有效地存储 ngram。在这里它能帮助你的只是将文本标记化(如果你关心的话,还可能将文本分割成句子)。
如果你的语料库足够大以至于你不能只使用散列 table 来保持 n-gram 计数,你将不得不使用更 space 高效的替代方法表示(例如前缀特里)。
例如,我刚刚在 Clojure 中做了一个快速测试,我计算了 Gutenberg King James V Bible 中的 5 克。使用哈希图存储 752K 个不同的 5 克的计数使用了 248 MB 的堆。使用前缀 trie 存储使用 57 MB 的计数——减少 77%。
作为参考,下面是使用前缀尝试的完整 Clojure 程序:
(ns nlp.core
(:require [clojure.string :as string]))
(defn tokenize
"Very simplistic tokenizer."
[text]
(string/split text #"[\s\:_\-\.\!\,\;]+"))
(defn get-bible-kjv-tokens []
(tokenize (slurp "/Users/wiseman/nltk_data/corpora/gutenberg/bible-kjv.txt")))
(defn ngrams [n tokens]
(partition n 1 tokens))
(defn build-ngram-trie [n tokens]
(->> tokens
(ngrams n)
(reduce (fn [trie ngram]
(update-in trie ngram #(if % (inc %) 1)))
{})))
(defn enumerate-trie [trie]
(if (not (map? trie))
(list (list trie))
(apply concat
(for [[k v] trie]
(map #(cons k %)
(enumerate-trie v))))))
(defn print-trie [trie]
(doseq [path (enumerate-trie trie)]
(println (string/join " " (butlast path)) ":" (last path))))
(defn -main []
(let [ngram-counts (->> (get-bible-kjv-tokens)
(build-ngram-trie 5))]
(print-trie ngram-counts)))
以及詹姆士五世圣经的输出:
$ lein run -m nlp.core | sort -r -k7,7 -n ngrams.txt | head
And it came to pass : 383
the house of the LORD : 233
the word of the LORD : 219
of the children of Israel : 162
it came to pass when : 142
the tabernacle of the congregation : 131
saith the LORD of hosts : 123
it shall come to pass : 119
And the LORD said unto : 114
And the LORD spake unto : 107
关于获得更高效率的一些指示,以下论文讨论了大型语料库的高效 n-gram 存储:
ADtrees for Sequential Data and N-gram Counting - 使用自定义数据结构。
Faster and Smaller N-Gram Language Models - "Our most compact representation can store all 4 billion n-grams and associated counts for the Google n-gram corpus in 23 bits per n-gram, the most compact lossless representation to date"