ruby-spacy adalah modul pembungkus untuk menggunakan spaCy dari bahasa pemrograman Ruby melalui PyCall. Modul ini bertujuan untuk memudahkan dan natural bagi programmer Ruby dalam menggunakan spaCy. Modul ini mencakup area fungsionalitas spaCy untuk menggunakan berbagai jenis model bahasanya, bukan untuk membangun model bahasa.
Fungsionalitas | |
---|---|
✅ | Tokenisasi, lemmatisasi, segmentasi kalimat |
✅ | Penandaan part-of-speech dan penguraian ketergantungan |
✅ | Pengakuan entitas bernama |
✅ | Visualisasi ketergantungan sintaksis |
✅ | Akses ke vektor kata terlatih |
✅ | Integrasi API Obrolan/Penyelesaian/Penyematan OpenAI |
Versi Saat Ini: 0.2.3
PENTING : Pastikan opsi enable-shared
diaktifkan di instalasi Python Anda. Anda dapat menggunakan pyenv untuk menginstal versi Python apa pun yang Anda suka. Instal Python 3.10.6, misalnya, menggunakan pyenv dengan enable-shared
sebagai berikut:
$ env CONFIGURE_OPTS= " --enable-shared " pyenv install 3.10.6
Ingatlah untuk membuatnya dapat diakses dari direktori kerja Anda. Disarankan agar Anda mengatur global
ke versi python yang baru saja Anda instal.
$ pyenv global 3.10.6
Kemudian, instal spaCy. Jika Anda menggunakan pip
, perintah berikut akan dilakukan:
$ pip install spacy
Instal model bahasa terlatih. Sebagai permulaan, en_core_web_sm
akan menjadi yang paling berguna untuk melakukan pemrosesan teks dasar dalam bahasa Inggris. Namun, jika Anda ingin menggunakan fitur lanjutan spaCy, seperti pengenalan entitas bernama atau penghitungan kesamaan dokumen, Anda juga harus menginstal model yang lebih besar seperti en_core_web_lg
.
$ python -m spacy download en_core_web_sm
$ python -m spacy download en_core_web_lg
Lihat Spacy: Model & Bahasa untuk model lain dalam berbagai bahasa. Untuk menginstal model bahasa Jepang misalnya, Anda dapat melakukannya sebagai berikut:
$ python -m spacy download ja_core_news_sm
$ python -m spacy download ja_core_news_lg
Tambahkan baris ini ke Gemfile aplikasi Anda:
gem 'ruby-spacy'
Dan kemudian jalankan:
$ bundle install
Atau instal sendiri sebagai:
$ gem install ruby-spacy
Lihat Contoh di bawah.
Banyak dari contoh berikut adalah terjemahan cuplikan kode Python-ke-Ruby di spaCy 101. Untuk contoh lainnya, lihat ke dalam direktori examples
.
→ spaCy: Tokenisasi
Kode rubi:
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
Keluaran:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|
Apel | adalah | melihat | pada | pembelian | Inggris | rintisan | untuk | $ | 1 | miliar |
→ spaCy: Tag dan dependensi part-of-speech
Kode rubi:
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
Keluaran:
teks | kata pengantar singkat | pos | menandai | dep |
---|---|---|---|---|
Apel | Apel | PROPN | NNP | nsubj |
adalah | menjadi | AUX | VBZ | tambahan |
melihat | Lihat | KATA KERJA | VBG | AKAR |
pada | pada | ADP | DI DALAM | persiapan |
pembelian | membeli | KATA KERJA | VBG | pcomp |
Inggris | Inggris | PROPN | NNP | dobj |
rintisan | rintisan | KATA BENDA | NN | advcl |
untuk | untuk | ADP | DI DALAM | persiapan |
$ | $ | SIM | $ | mod kuantitas |
1 | 1 | JUMLAH | CD | menggabungkan |
miliar | miliar | JUMLAH | CD | pobj |
Kode rubi:
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
Keluaran:
teks | kata pengantar singkat | pos | menandai | dep |
---|---|---|---|---|
天堂 | 天堂 | PROPN | 名詞-固有名詞-一般 | nsubj |
は | は | ADP | 助詞-係助詞 | kasus |
1983 | 1983 | JUMLAH | 名詞-数詞 | nummod |
年 | 年 | KATA BENDA | 名詞-普通名詞-助数詞可能 | obl |
に | に | ADP | 助詞-格助詞 | kasus |
ファミコン | ファミコン | KATA BENDA | 名詞-普通名詞-一般 | keberatan |
を | を | ADP | 助詞-格助詞 | kasus |
14.800 | 14.800 | JUMLAH | 名詞-数詞 | tetap |
円 | 円 | KATA BENDA | 名詞-普通名詞-助数詞可能 | obl |
で | で | ADP | 助詞-格助詞 | kasus |
発売 | 発売 | KATA KERJA | 名詞-普通名詞-サ変可能 | AKAR |
し | する | AUX | 動詞-非自立可能 | tambahan |
た | た | AUX | 助動詞 | tambahan |
。 | 。 | Tusuk | 補助記号-句点 | tusukan |
→ POS dan tag morfologi
Kode rubi:
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
Keluaran:
teks | membentuk | is_alpha | adalah_berhenti | morfologi |
---|---|---|---|---|
Apel | XXXXX | BENAR | PALSU | Tipe Kata Benda = Prop Angka = Bernyanyi |
adalah | xx | BENAR | BENAR | Suasana hati = Ind Angka = Bernyanyi Orang = 3 Tegang = Pres Bentuk Kata Kerja = Sirip |
melihat | xxxx | BENAR | PALSU | Aspek = Prog Tegang = Pres Bentuk Kata Kerja = Bagian |
pada | xx | BENAR | BENAR | |
pembelian | xxxx | BENAR | PALSU | Aspek = Prog Tegang = Pres Bentuk Kata Kerja = Bagian |
Inggris | XX | PALSU | PALSU | Tipe Kata Benda = Prop Angka = Bernyanyi |
rintisan | xxxx | BENAR | PALSU | Angka = Bernyanyi |
untuk | xxx | BENAR | BENAR | |
$ | $ | PALSU | PALSU | |
1 | D | PALSU | PALSU | NumType = Kartu |
miliar | xxxx | BENAR | PALSU | NumType = Kartu |
→ spaCy: Visualisator
Kode rubi:
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
Keluaran:
Kode rubi:
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
Keluaran:
→ spaCy: Entitas bernama
Kode rubi:
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
Keluaran:
teks | mulai_char | akhir_char | label |
---|---|---|---|
Apel | 0 | 5 | ORG |
Inggris | 27 | 31 | GPE |
$1 miliar | 44 | 54 | UANG |
Kode rubi:
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
Keluaran:
teks | awal | akhir | label |
---|---|---|---|
天堂 | 0 | 3 | ORG |
1983年 | 4 | 9 | TANGGAL |
ファミコン | 10 | 15 | PRODUK |
14,800円 | 16 | 23 | UANG |
→ spaCy: Vektor dan kesamaan kata
Kode rubi:
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
Keluaran:
teks | memiliki_vektor | vektor_norma | is_oov |
---|---|---|---|
anjing | BENAR | 7.0336733 | PALSU |
kucing | BENAR | 6.6808186 | PALSU |
pisang | BENAR | 6.700014 | PALSU |
afskfsd | PALSU | 0,0 | BENAR |
Kode rubi:
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 ) } "
Keluaran:
Doc 1: I like salty fries and hamburgers.
Doc 2: Fast food tastes very good.
Similarity: 0.7687607012190486
Kode rubi:
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 ) } "
Keluaran:
doc1: 今日は雨ばっかり降って、嫌な天気ですね。
doc2: あいにくの悪天候で残念です。
Similarity: 0.8684192637149641
Tokyo - Jepang + Prancis = Paris ?
Kode rubi:
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
Keluaran:
pangkat | teks | skor |
---|---|---|
1 | PERANCIS | 0.8346999883651733 |
2 | Perancis | 0.8346999883651733 |
3 | Perancis | 0.8346999883651733 |
4 | PARIS | 0,7703999876976013 |
5 | Paris | 0,7703999876976013 |
6 | Paris | 0,7703999876976013 |
7 | TOULOUSE | 0,6381999850273132 |
8 | Toulouse | 0,6381999850273132 |
9 | toulouse | 0,6381999850273132 |
10 | marseille | 0,6370999813079834 |
東京 - 日本 + フランス = パリ ?
Kode rubi:
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
Keluaran:
pangkat | teks | skor |
---|---|---|
1 | パリ | 0,7376999855041504 |
2 | フランス | 0,7221999764442444 |
3 | itu | 0,6697999835014343 |
4 | ストラスブール | 0,631600022315979 |
5 | リヨン | 0,5939000248908997 |
6 | Paris | 0,574400007724762 |
7 | ベルギー | 0,5683000087738037 |
8 | ニース | 0,5679000020027161 |
9 | アルザス | 0,5644999742507935 |
10 | 南仏 | 0,5547999739646912 |
️ Fitur ini masih bersifat eksperimental. Detailnya dapat berubah. Silakan merujuk ke referensi API OpenAI dan Ruby OpenAI untuk parameter yang tersedia (max_tokens
,temperature
, dll).
Manfaatkan model GPT dengan mudah dalam ruby-spacy menggunakan kunci API OpenAI. Saat membuat perintah untuk metode Doc::openai_query
, Anda dapat memasukkan properti token dokumen berikut. Properti ini diambil melalui pemanggilan fungsi (dibuat secara internal oleh GPT bila diperlukan) dan diintegrasikan secara mulus ke dalam perintah Anda. Perhatikan bahwa pemanggilan fungsi memerlukan gpt-4o-mini
atau lebih tinggi. Properti yang tersedia meliputi:
surface
lemma
tag
pos
(bagian dari pidato)dep
(ketergantungan)ent_type
(tipe entitas)morphology
Kode rubi:
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
Keluaran:
12 bulan yang lalu.
Kode rubi:
require "ruby-spacy"
api_key = ENV [ "OPENAI_API_KEY" ]
nlp = Spacy