コーパス内の NGram の頻度をカウントするプログラムを作成します。トークンのストリームを消費し、1 つのオーダーの NGrams を生成する関数が既にあります。
ngram :: Monad m => Int -> Conduit t m [t]
trigrams = ngram 3
countFreq :: (Ord t, Monad m) => Consumer [t] m (Map [t] Int)
現時点では、1 つのストリーム コンシューマーをストリーム ソースに接続できます。
tokens --- trigrams --- countFreq
複数のストリーム コンシューマーを同じストリーム ソースに接続するにはどうすればよいですか? 私はこのようなものが欲しいです:
.--- unigrams --- countFreq
|--- bigrams --- countFreq
tokens ----|--- trigrams --- countFreq
'--- ... --- countFreq
プラスは、各コンシューマーを並行して実行することです
編集: Petrのおかげで、この解決策を思いつきました
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