Ruby-spacyは、PyCall を介して Ruby プログラミング言語から spaCy を使用するためのラッパー モジュールです。このモジュールは、Ruby プログラマーが spaCy を簡単かつ自然に使用できるようにすることを目的としています。このモジュールは、言語モデルの構築ではなく、さまざまな言語モデルを使用するための spaCy 機能の領域をカバーします。
機能性 | |
---|---|
✅ | トークン化、見出し語化、文の分割 |
✅ | 品詞のタグ付けと依存関係の解析 |
✅ | 固有表現の認識 |
✅ | 構文的な依存関係の視覚化 |
✅ | 事前トレーニングされた単語ベクトルへのアクセス |
✅ | OpenAI チャット/補完/埋め込み API の統合 |
現在のバージョン: 0.2.3
重要: Python インストールでenable-shared
オプションが有効になっていることを確認してください。 pyenv を使用して、任意のバージョンの Python をインストールできます。たとえば、次のように、 enable-shared
指定した pyenv を使用して、Python 3.10.6 をインストールします。
$ env CONFIGURE_OPTS= " --enable-shared " pyenv install 3.10.6
作業ディレクトリからアクセスできるようにしてください。 global
、インストールしたばかりの Python のバージョンに設定することをお勧めします。
$ pyenv global 3.10.6
次にspaCyをインストールします。 pip
使用する場合は、次のコマンドが実行されます。
$ pip install spacy
トレーニングされた言語モデルをインストールします。まず、英語で基本的なテキスト処理を行うには、 en_core_web_sm
最も役立ちます。ただし、固有表現認識や文書類似性計算などの spaCy の高度な機能を使用したい場合は、 en_core_web_lg
などのより大きなモデルもインストールする必要があります。
$ python -m spacy download en_core_web_sm
$ python -m spacy download en_core_web_lg
さまざまな言語の他のモデルについては、「Spacy: モデルと言語」を参照してください。たとえば、日本語用のモデルをインストールするには、次のように実行できます。
$ python -m spacy download ja_core_news_sm
$ python -m spacy download ja_core_news_lg
次の行をアプリケーションの Gemfile に追加します。
gem 'ruby-spacy'
そして、以下を実行します。
$ bundle install
または、次のように自分でインストールします。
$ gem install ruby-spacy
以下の例を参照してください。
次の例の多くは、spaCy 101 のコード スニペットを Python から Ruby に変換したものです。その他の例については、 examples
ディレクトリ内を参照してください。
→ spaCy: トークン化
Rubyコード:
require "ruby-spacy"
require "terminal-table"
nlp = Spacy :: Language . new ( "en_core_web_sm" )
doc = nlp . read ( "Apple is looking at buying U.K. startup for $1 billion" )
row = [ ]
doc . each do | token |
row << token . text
end
headings = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
table = Terminal :: Table . new rows : [ row ] , headings : headings
puts table
出力:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|
りんご | は | 探している | で | 買う | イギリス | 起動する | のために | $ | 1 | 十億 |
→ spaCy: 品詞タグと依存関係
Rubyコード:
require "ruby-spacy"
require "terminal-table"
nlp = Spacy :: Language . new ( "en_core_web_sm" )
doc = nlp . read ( "Apple is looking at buying U.K. startup for $1 billion" )
headings = [ "text" , "lemma" , "pos" , "tag" , "dep" ]
rows = [ ]
doc . each do | token |
rows << [ token . text , token . lemma , token . pos , token . tag , token . dep ]
end
table = Terminal :: Table . new rows : rows , headings : headings
puts table
出力:
文章 | 補題 | 位置 | タグ | 出発 |
---|---|---|---|---|
りんご | りんご | プロパン | NNP | nsubj |
は | なれ | AUX | VBZ | 補助 |
探している | 見て | 動詞 | VBG | 根 |
で | で | ADP | で | 準備 |
買う | 買う | 動詞 | VBG | pcomp |
イギリス | イギリス | プロパン | NNP | ドブジ |
起動する | 起動する | 名詞 | NN | advcl |
のために | のために | ADP | で | 準備 |
$ | $ | SYM | $ | 量子化法 |
1 | 1 | 番号 | CD | 化合物 |
十億 | 十億 | 番号 | CD | ポルノ |
Rubyコード:
require "ruby-spacy"
require "terminal-table"
nlp = Spacy :: Language . new ( "ja_core_news_lg" )
doc = nlp . read ( "任天堂は1983年にファミコンを14,800円で発売した。" )
headings = [ "text" , "lemma" , "pos" , "tag" , "dep" ]
rows = [ ]
doc . each do | token |
rows << [ token . text , token . lemma , token . pos , token . tag , token . dep ]
end
table = Terminal :: Table . new rows : rows , headings : headings
puts table
出力:
文章 | 補題 | 位置 | タグ | 出発 |
---|---|---|---|---|
任天堂 | 任天堂 | プロパン | 名詞-固有名詞-一般 | nsubj |
は | は | ADP | 助詞-係助詞 | 場合 |
1983年 | 1983年 | 番号 | 名詞-数詞 | nummod |
年 | 年 | 名詞 | 名詞-普通名詞-助数詞可能 | オブリ |
に | に | ADP | 助詞-格助詞 | 場合 |
勝負 | 勝負 | 名詞 | 名詞-普通名詞-一般 | オブジェクト |
を | を | ADP | 助詞-格助詞 | 場合 |
14,800 | 14,800 | 番号 | 名詞-数詞 | 修理済み |
円 | 円 | 名詞 | 名詞-普通名詞-助数詞可能 | オブリ |
で | で | ADP | 助詞-格助詞 | 場合 |
火曜日 | 火曜日 | 動詞 | 名詞-普通名詞-サ変可能 | 根 |
し | する | AUX | 動詞-非自立可能 | 補助 |
た | た | AUX | 助動詞 | 補助 |
。 | 。 | パンクト | 補助記号点句 | パンク |
→ POS および形態タグ
Rubyコード:
require "ruby-spacy"
require "terminal-table"
nlp = Spacy :: Language . new ( "en_core_web_sm" )
doc = nlp . read ( "Apple is looking at buying U.K. startup for $1 billion" )
headings = [ "text" , "shape" , "is_alpha" , "is_stop" , "morphology" ]
rows = [ ]
doc . each do | token |
morph = token . morphology . map do | k , v |
" #{ k } = #{ v } "
end . join ( " n " )
rows << [ token . text , token . shape , token . is_alpha , token . is_stop , morph ]
end
table = Terminal :: Table . new rows : rows , headings : headings
puts table
出力:
文章 | 形 | is_alpha | is_stop | 形態学 |
---|---|---|---|---|
りんご | XXXX | 真実 | 間違い | 名詞タイプ = プロップ 数字 = 歌う |
は | xx | 真実 | 真実 | 気分 = インド 数字 = 歌う 人 = 3 時制 = プレス 動詞形式 = フィン |
探している | xxxx | 真実 | 間違い | アスペクト=プログレ 時制 = プレス 動詞形式 = 部分 |
で | xx | 真実 | 真実 | |
買う | xxxx | 真実 | 間違い | アスペクト=プログレ 時制 = プレス 動詞形式 = 部分 |
イギリス | XX | 間違い | 間違い | 名詞タイプ = プロップ 数字 = 歌う |
起動する | xxxx | 真実 | 間違い | 数字 = 歌う |
のために | xxx | 真実 | 真実 | |
$ | $ | 間違い | 間違い | |
1 | d | 間違い | 間違い | NumType = カード |
十億 | xxxx | 真実 | 間違い | NumType = カード |
→ spaCy:ビジュアライザー
Rubyコード:
require "ruby-spacy"
nlp = Spacy :: Language . new ( "en_core_web_sm" )
sentence = "Autonomous cars shift insurance liability toward manufacturers"
doc = nlp . read ( sentence )
dep_svg = doc . displacy ( style : "dep" , compact : false )
File . open ( File . join ( "test_dep.svg" ) , "w" ) do | file |
file . write ( dep_svg )
end
出力:
Rubyコード:
require "ruby-spacy"
nlp = Spacy :: Language . new ( "en_core_web_sm" )
sentence = "Autonomous cars shift insurance liability toward manufacturers"
doc = nlp . read ( sentence )
dep_svg = doc . displacy ( style : "dep" , compact : true )
File . open ( File . join ( "test_dep_compact.svg" ) , "w" ) do | file |
file . write ( dep_svg )
end
出力:
→ spaCy: 名前付きエンティティ
Rubyコード:
require "ruby-spacy"
require "terminal-table"
nlp = Spacy :: Language . new ( "en_core_web_sm" )
doc = nlp . read ( "Apple is looking at buying U.K. startup for $1 billion" )
rows = [ ]
doc . ents . each do | ent |
rows << [ ent . text , ent . start_char , ent . end_char , ent . label ]
end
headings = [ "text" , "start_char" , "end_char" , "label" ]
table = Terminal :: Table . new rows : rows , headings : headings
puts table
出力:
文章 | 開始文字 | end_char | ラベル |
---|---|---|---|
りんご | 0 | 5 | 組織 |
イギリス | 27 | 31 | GPE |
10億ドル | 44 | 54 | お金 |
Rubyコード:
require ( "ruby-spacy" )
require "terminal-table"
nlp = Spacy :: Language . new ( "ja_core_news_lg" )
sentence = "任天堂は1983年にファミコンを14,800円で発売した。"
doc = nlp . read ( sentence )
rows = [ ]
doc . ents . each do | ent |
rows << [ ent . text , ent . start_char , ent . end_char , ent . label ]
end
headings = [ "text" , "start" , "end" , "label" ]
table = Terminal :: Table . new rows : rows , headings : headings
print table
出力:
文章 | 始める | 終わり | ラベル |
---|---|---|---|
任天堂 | 0 | 3 | 組織 |
1983年 | 4 | 9 | 日付 |
勝負 | 10 | 15 | 製品 |
14,800円 | 16 | 23 | お金 |
→ spaCy: 単語ベクトルと類似度
Rubyコード:
require "ruby-spacy"
require "terminal-table"
nlp = Spacy :: Language . new ( "en_core_web_lg" )
doc = nlp . read ( "dog cat banana afskfsd" )
rows = [ ]
doc . each do | token |
rows << [ token . text , token . has_vector , token . vector_norm , token . is_oov ]
end
headings = [ "text" , "has_vector" , "vector_norm" , "is_oov" ]
table = Terminal :: Table . new rows : rows , headings : headings
puts table
出力:
文章 | has_vector | ベクトルノルム | is_oov |
---|---|---|---|
犬 | 真実 | 7.0336733 | 間違い |
猫 | 真実 | 6.6808186 | 間違い |
バナナ | 真実 | 6.700014 | 間違い |
afskfsd | 間違い | 0.0 | 真実 |
Rubyコード:
require "ruby-spacy"
nlp = Spacy :: Language . new ( "en_core_web_lg" )
doc1 = nlp . read ( "I like salty fries and hamburgers." )
doc2 = nlp . read ( "Fast food tastes very good." )
puts "Doc 1: " + doc1 . text
puts "Doc 2: " + doc2 . text
puts "Similarity: #{ doc1 . similarity ( doc2 ) } "
出力:
Doc 1: I like salty fries and hamburgers.
Doc 2: Fast food tastes very good.
Similarity: 0.7687607012190486
Rubyコード:
require "ruby-spacy"
nlp = Spacy :: Language . new ( "ja_core_news_lg" )
ja_doc1 = nlp . read ( "今日は雨ばっかり降って、嫌な天気ですね。" )
puts "doc1: #{ ja_doc1 . text } "
ja_doc2 = nlp . read ( "あいにくの悪天候で残念です。" )
puts "doc2: #{ ja_doc2 . text } "
puts "Similarity: #{ ja_doc1 . similarity ( ja_doc2 ) } "
出力:
doc1: 今日は雨ばっかり降って、嫌な天気ですね。
doc2: あいにくの悪天候で残念です。
Similarity: 0.8684192637149641
東京 - 日本 + フランス = パリ ?
Rubyコード:
require "ruby-spacy"
require "terminal-table"
nlp = Spacy :: Language . new ( "en_core_web_lg" )
tokyo = nlp . get_lexeme ( "Tokyo" )
japan = nlp . get_lexeme ( "Japan" )
france = nlp . get_lexeme ( "France" )
query = tokyo . vector - japan . vector + france . vector
headings = [ "rank" , "text" , "score" ]
rows = [ ]
results = nlp . most_similar ( query , 10 )
results . each_with_index do | lexeme , i |
index = ( i + 1 ) . to_s
rows << [ index , lexeme . text , lexeme . score ]
end
table = Terminal :: Table . new rows : rows , headings : headings
puts table
出力:
ランク | 文章 | スコア |
---|---|---|
1 | フランス | 0.8346999883651733 |
2 | フランス | 0.8346999883651733 |
3 | フランス | 0.8346999883651733 |
4 | パリ | 0.7703999876976013 |
5 | パリ | 0.7703999876976013 |
6 | パリ | 0.7703999876976013 |
7 | トゥールーズ | 0.6381999850273132 |
8 | トゥールーズ | 0.6381999850273132 |
9 | トゥールーズ | 0.6381999850273132 |
10 | マルセイユ | 0.6370999813079834 |
東京 - 日本 + フランス = パリ ?
Rubyコード:
require "ruby-spacy"
require "terminal-table"
nlp = Spacy :: Language . new ( "ja_core_news_lg" )
tokyo = nlp . get_lexeme ( "東京" )
japan = nlp . get_lexeme ( "日本" )
france = nlp . get_lexeme ( "フランス" )
query = tokyo . vector - japan . vector + france . vector
headings = [ "rank" , "text" , "score" ]
rows = [ ]
results = nlp . most_similar ( query , 10 )
results . each_with_index do | lexeme , i |
index = ( i + 1 ) . to_s
rows << [ index , lexeme . text , lexeme . score ]
end
table = Terminal :: Table . new rows : rows , headings : headings
puts table
出力:
ランク | 文章 | スコア |
---|---|---|
1 | パリ | 0.7376999855041504 |
2 | フランス | 0.7221999764442444 |
3 | 東京 | 0.6697999835014343 |
4 | ストラスブール | 0.631600022315979 |
5 | リヨン | 0.5939000248908997 |
6 | パリ | 0.574400007724762 |
7 | ベルギー | 0.5683000087738037 |
8 | ニース | 0.5679000020027161 |
9 | アルザス | 0.5644999742507935 |
10 | 南仏 | 0.5547999739646912 |
️ この機能は現在実験中です。詳細は変更される場合があります。利用可能なパラメータ (max_tokens
、temperature
など) については、OpenAI の API リファレンスと Ruby OpenAI を参照してください。
OpenAI API キーを使用して、ruby-spatiy 内で GPT モデルを簡単に活用できます。 Doc::openai_query
メソッドのプロンプトを作成する場合、ドキュメントの次のトークン プロパティを組み込むことができます。これらのプロパティは、関数呼び出し (必要に応じて GPT によって内部的に行われます) を通じて取得され、プロンプトにシームレスに統合されます。関数呼び出しにはgpt-4o-mini
以降が必要であることに注意してください。使用可能なプロパティには次のものがあります。
surface
lemma
tag
pos
(品詞)dep
(依存関係)ent_type
(エンティティタイプ)morphology
Rubyコード:
require "ruby-spacy"
api_key = ENV [ "OPENAI_API_KEY" ]
nlp = Spacy :: Language . new ( "en_core_web_sm" )
doc = nlp . read ( "The Beatles released 12 studio albums" )
# default parameter values
# max_tokens: 1000
# temperature: 0.7
# model: "gpt-4o-mini"
res1 = doc . openai_query (
access_token : api_key ,
prompt : "Translate the text to Japanese."
)
puts res1
出力:
ビートルズは12枚のスタジオアルバムをリリースしました。
Rubyコード:
require "ruby-spacy"
api_key = ENV [ "OPENAI_API_KEY" ]
nlp = Spacy