HaskellとMecabで長門に関してのテキストをを判別してみた
前々からちょこちょこやっていたのがやっと一応の完成を見ました。
中身
- 作者: 高村大也,奥村学
- 出版社/メーカー: コロナ社
- 発売日: 2010/07
- メディア: 単行本
- 購入: 13人 クリック: 235回
- この商品を含むブログ (36件) を見る
動作
Windowsのコマンドプロンプト文字化けしたので外部ファイルから読み込むようになりましたけど……
一応全部学習用のデータとは別のテキストを放り込みました。
(艦これの長門)
(長門有希)
(戦艦長門、結果が間違って長門有希になってるけど)
Haskell触ってみる(2)
というわけで結構ヤバいのではと思いつつ触ってます。
正直言って寝起きなので変なこと書きまくってるかもしれない。
リポジトリはここでやってるのでツッコミをいただけるとありがたかったり。
haru2036/learnHaskell · GitHub
なんとかそれぞれの要素に対しての出現頻度を数えることができるようになりました。
ただなんか実行結果がfromListって関数が帰ってきてるようにしか見えないのでなんか違う感があったりする。
ソース:
import Data.List import Data.HashMap.Lazy searchAndCountWords :: String -> [String] -> Int getUnigramFrequency :: [String] -> HashMap String Int getUnigramFrequency sList = fromList [(a, searchAndCountWords a sList) | a <- nub sList] searchAndCountWords key items = length $ Data.List.filter (==key) items main = return $ getUnigramFrequency ["a", "a", "ba", "bb", "ab", "a"]
実行結果:
fromList [("bb",1),("ba",1),("ab",1),("a",3)]
HashMap使うためにはパッケージ追加でインストールしないといけないのねとか。
あと、Data.HashMap.LazyとData.HashMap.Strictってどっち使えばいいのかわからないし英語読めないので辛いし英語も勉強しないとヤバいのではってなってる
Haskellを触って見る続き
とりあえずさしあたっての目標に前のエントリに書いたようにラボユース成果物(haru2036/laboyouth · GitHub)をHaskellに移植することを設定したので、とりあえずモデルの生成部分からやっていこうと思ってます。まあいきなりtrigramの数え上げやったら死ぬと思ったので、さしあたりunigramの数え上げからやっていこうと思ってます。
そんなこんなでとりあえず一つの単語に付いて何回出現するかを調べる関数を作ったのですが、なんかよくわからんことに。
countUnigram :: String -> [String] -> Int countUnigram key items = length $ takeWhile (==key) items main = return $ countUnigram "a" ["a", "a", "ba", "bb", "ab", "a"]
こんなコードを書いて実行すると
2
とか出てきました。ひとつ足りなくね?と思って検索対象(一つ目の引数)を"ab"にしたところ0と……じゃあ存在しない場合どうするのよと思って"cc"をしても0が帰ってきます、どういうこっちゃ。takeWhileがそういう感じなのかそれとも……
(たぶん)つづきます
-
- 追記--
ありがたいことにTwitterですぐツッコミをもらったので。
@haru2036 takeWhile じゃなくて filter ?
— パスベルス (@pasberth) December 4, 2013
とのことでtakeWhileをfilterに置き換えたらうまくいきました。
当初参考にしていたページ
Haskell のリスト操作 : tnomuraのブログ
にもtakeWhileとfilter両方乗ってたけどうっかりfilterを見落として書いてしまってたみたいで。
そこをもう一度見たら
条件に合う要素をリストの先頭から取り出す。条件が合わなくなったところで処理は終了する。
Hugs> takeWhile (<4) [1,2,3,4,5]
てて書いてありました。さいしょのa2つの次にbaが入ってたのでそこで終了しちゃってたみたいな。
ありがとうございます!
つづきました