コーパス内のNGramの頻度を数えるプログラムを書く。どうすればよいコンジット:複数のストリームコンシューマ
tokens --- trigrams --- countFreq
:私はちょうど1つのストリームの消費者は、ストリームソースに接続することができます現時点で
ngram :: Monad m => Int -> Conduit t m [t]
trigrams = ngram 3
countFreq :: (Ord t, Monad m) => Consumer [t] m (Map [t] Int)
:私はすでにトークンのストリームを消費し、1つの注文のNGramsを生産する機能を持っています複数のストリームコンシューマを同じストリームソースに接続しますか? 私はこのような何かがしたい:
.--- unigrams --- countFreq
|--- bigrams --- countFreq
tokens ----|--- trigrams --- countFreq
'--- ... --- countFreq
Aを加えたパラレル
EDIT内の各消費者を実行するために、次のようになります。私は、このソリューション
spawnMultiple orders = do
chan <- atomically newBroadcastTMChan
results <- forM orders $ \_ -> newEmptyMVar
threads <- forM (zip results orders) $
forkIO . uncurry (sink chan)
forkIO . runResourceT $ sourceFile "test.txt"
$$ javascriptTokenizer
=$ sinkTMChan chan
forM results readMVar
where
sink chan result n = do
chan' <- atomically $ dupTMChan chan
freqs <- runResourceT $ sourceTMChan chan'
$$ ngram n
=$ frequencies
putMVar result freqs
を思い付いたペトルに 感謝
'tokens'が値を返すとき、あなたの' ... grams 'はすべてそれを受け取ることを望みますか? –