- 更新日: 2015年1月14日
- Ruby
英単語の原形を取得するRuby Lemmatizerの使い方
英語の単語において、活用形の動詞を原形に戻したり、複数形の名詞を単数形に戻したりできる gem ライブラリ、Ruby Lemmatizer を使ってみました。
要するに、名詞複数形の -s を取ったり、動詞過去形の -ed を取ったりして、語の「原形」を出力するのだ。もちろん不規則変化形にも対応している。
https://github.com/yohasebe/lemmatizer
Ruby Lemmatizer の動作確認
Gemfile に lemmatizer を追加して、bundle install。
Gemfile
1 |
gem 'lemmatizer' |
1 2 3 |
$ bundle install |
Rails プロジェクトでインストールしたので、rails c で pry を起動して ruby-lemmatizer の動作確認を行いました。
1 2 3 |
$ bundle exec rails c |
まずは lemmatizer を require して、Lemmatizer オブジェクトを生成。
1 2 3 4 5 6 7 8 9 10 11 12 |
pry(main)> require "lemmatizer" => false pry(main)> lem = Lemmatizer.new => #<Lemmatizer::Lemmatizer:0x007f83ba321988 @exceptions= {:noun=> {"aardwolves"=>["aardwolf"], "abaci"=>["abacus"], "aboideaux"=>["aboideau"], ... |
Rails 環境の pry なので、すでに lemmatizer が読み込まれており require は false を返しています。必要に応じて1行目の require “lemmatizer” を実行する。
品詞を指定して単語の原形を取得
任意の単語において、noun(名詞)、verb(動詞)、adj(adjective/形容詞)、adv(adverb/副詞)としての原形を取得します。Lemmatizer#lemma メソッドの第一引数に対象の単語、第二引数に品詞を渡す。Readme を参考。
1 2 3 4 5 6 7 8 9 10 |
pry(main)> lem.lemma("dogs", :noun) => "dog" pry(main)> lem.lemma("hired", :verb) => "hire" pry(main)> lem.lemma("hotter", :adj) => "hot" pry(main)> lem.lemma("better", :adv) => "well" |
swimming という英単語で試してみます。swimming は名詞としては「水泳」という意味であり、動詞としては swim「泳ぐ」の進行形(ing形)です。
1 2 3 4 5 6 |
pry(main)> lem.lemma("swimming", :noun) => "swimming" pry(main)> lem.lemma("swimming", :verb) => "swim" |
verb(動詞)を指定すると、ちゃんと動詞の原形 swim が取得できていますね。素晴らしい。
品詞の指定を省略して原形取得
第二引数の品詞指定を省略してもOK。
1 2 3 4 5 6 |
pry(main)> lem.lemma("fired") => "fire" pry(main)> lem.lemma("slow") => "slow" |
この場合…
# when part-of-speech symbol is not specified as the second argument,
# lemmatizer tries :verb, :noun, :adj, and :adv one by one in this order.
と Readme にありますので、動詞→名詞→形容詞→副詞の順に原形を検索して、最初に見つかったものを返す。
不規則変化の単語の場合
不規則変化の動詞 write(過去形 wrote / 過去分詞 written) でもOK。
1 2 3 4 |
pry(main)> lem.lemma("written") => "write" |
次は leaves を試す。leaves は、動詞としては leave(去る)の三人称単数現在の活用形、名詞としては leaf(葉っぱ)の不規則変化での複数形です。
1 2 3 4 |
pry(main)> lem.lemma("leaves", :verb) => "leave" |
:verb(動詞)を指定すると、ちゃんと動詞の原形に戻った!
1 2 3 4 |
pry(main)> lem.lemma("leaves", :noun) => "leaf" |
:noun(名詞)を指定したら、こちらもしっかりと単数形の leaf が取得できています。
品詞の指定を省略すると…
1 2 3 4 |
pry(main)> lem.lemma("leaves") => "leave" |
上述通り、動詞の原形が優先されます。
辞書インデックスにない単語などその他
固有名詞など辞書インデックスに含まれない単語は、そのまま返される。
1 2 3 4 |
pry(main)> lem.lemma("MacBooks", :noun) => "MacBooks" |
lemma(原形)として辞書インデックスに含まれる単語は、そのまま返される。
1 2 3 4 5 6 |
pry(main)> lem.lemma("higher", :adj) => "higher" pry(main)> lem.lemma("higher") => "higher" |
higher(highの比較級)は、lemma(原形)として辞書インデックスに登録されているので、そのまま higher が返されます。
highest(highの最上級)で試す。
1 2 3 4 |
pry(main)> lem.lemma("highest") => "high" |
highest の場合は、lemma(原形)としては辞書インデックスに登録されておらず、原形(high)を返すようです。
Ruby Lemmatizer、使い方も簡単ですしかなり良い感じです。
- Ruby の関連記事
- Gemの作り方(Ruby Gem)
- ローカル開発中のgemをGemfileに書いてインストール
- 熊本地震の余震が夜に多いのは本当か?Rubyプログラムで検証してみた
- El Capitanでgemのnative extensionビルド失敗に対応
- Rubyで親クラスから子クラスの定数を参照
- MacabをRubyで使う
- rbenv/ruby-buildでRuby最新バージョンをインストール
- Rubyでクラスインスタンス変数にインスタンスメソッドからアクセス
- 距離1kmあたりの緯度・経度の度数を計算(日本・北緯35度)
- Google Maps Geocoding APIで住所から緯度・経度を取得するRubyコード
Leave Your Message!