ruby-spacy é um módulo wrapper para usar spaCy da linguagem de programação Ruby via PyCall. Este módulo tem como objetivo tornar o spaCy fácil e natural para os programadores Ruby. Este módulo cobre as áreas de funcionalidade do spaCy para usar muitas variedades de seus modelos de linguagem, não para construí- los.
Funcionalidade | |
---|---|
✅ | Tokenização, lematização, segmentação de frases |
✅ | Marcação de classe gramatical e análise de dependência |
✅ | Reconhecimento de entidade nomeada |
✅ | Visualização de dependência sintática |
✅ | Acesso a vetores de palavras pré-treinados |
✅ | Integração de API de bate-papo/conclusão/embeddings OpenAI |
Versão Atual: 0.2.3
IMPORTANTE : Certifique-se de que a opção enable-shared
esteja habilitada em sua instalação do Python. Você pode usar o pyenv para instalar qualquer versão do Python que desejar. Instale o Python 3.10.6, por exemplo, usando pyenv com enable-shared
da seguinte forma:
$ env CONFIGURE_OPTS= " --enable-shared " pyenv install 3.10.6
Lembre-se de torná-lo acessível em seu diretório de trabalho. É recomendado que você defina global
para a versão do python que acabou de instalar.
$ pyenv global 3.10.6
Em seguida, instale o spaCy. Se você usar pip
, o seguinte comando servirá:
$ pip install spacy
Instale modelos de linguagem treinados. Para começar, en_core_web_sm
será o mais útil para conduzir o processamento básico de texto em inglês. No entanto, se quiser usar recursos avançados do spaCy, como reconhecimento de entidade nomeada ou cálculo de similaridade de documentos, você também deve instalar um modelo maior como en_core_web_lg
.
$ python -m spacy download en_core_web_sm
$ python -m spacy download en_core_web_lg
Consulte Spacy: Modelos e Idiomas para outros modelos em vários idiomas. Para instalar modelos para o idioma japonês, por exemplo, você pode fazer da seguinte forma:
$ python -m spacy download ja_core_news_sm
$ python -m spacy download ja_core_news_lg
Adicione esta linha ao Gemfile da sua aplicação:
gem 'ruby-spacy'
E então execute:
$ bundle install
Ou instale você mesmo como:
$ gem install ruby-spacy
Veja exemplos abaixo.
Muitos dos exemplos a seguir são traduções de trechos de código de Python para Ruby em spaCy 101. Para obter mais exemplos, consulte o diretório examples
.
→ spaCy: Tokenização
Código 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
Saída:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|
Maçã | é | olhando | no | comprando | Reino Unido | comece | para | $ | 1 | bilhão |
→ spaCy: tags e dependências de classes gramaticais
Código 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
Saída:
texto | lema | posição | marcação | dependência |
---|---|---|---|---|
Maçã | Maçã | PROPN | PNN | nsubj |
é | ser | Auxiliar | VBZ | auxiliar |
olhando | olhar | VERBO | VBG | RAIZ |
no | no | ADP | EM | preparação |
comprando | comprar | VERBO | VBG | ppcomp |
Reino Unido | Reino Unido | PROPN | PNN | dobj |
comece | comece | SUBSTANTIVO | NN | advcl |
para | para | ADP | EM | preparação |
$ | $ | SIM | $ | mod quântico |
1 | 1 | NUM | CD | composto |
bilhão | bilhão | NUM | CD | pobj |
Código 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
Saída:
texto | lema | posição | marcação | dependência |
---|---|---|---|---|
任天堂 | 任天堂 | PROPN | 名詞-固有名詞-一般 | nsubj |
は | は | ADP | 助詞-係助詞 | caso |
1983 | 1983 | NUM | 名詞-数詞 | nummod |
年 | 年 | SUBSTANTIVO | 名詞-普通名詞-助数詞可能 | obg |
に | に | ADP | 助詞-格助詞 | caso |
ファミコン | ファミコン | SUBSTANTIVO | 名詞-普通名詞-一般 | obj |
を | を | ADP | 助詞-格助詞 | caso |
14.800 | 14.800 | NUM | 名詞-数詞 | fixo |
円 | 円 | SUBSTANTIVO | 名詞-普通名詞-助数詞可能 | obg |
で | で | ADP | 助詞-格助詞 | caso |
発売 | 発売 | VERBO | 名詞-普通名詞-サ変可能 | RAIZ |
し | する | Auxiliar | 動詞-非自立可能 | auxiliar |
た | た | Auxiliar | 助動詞 | auxiliar |
。 | 。 | PONTO | 補助記号-句点 | ponto |
→ Tags POS e morfologia
Código 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
Saída:
texto | forma | é_alfa | é_parar | morfologia |
---|---|---|---|---|
Maçã | Xxxx | verdadeiro | falso | Substantivo = Prop Número = cantar |
é | xx | verdadeiro | verdadeiro | Humor = Ind Número = cantar Pessoa = 3 Tempo = Pres VerboForm = Fin |
olhando | xxxx | verdadeiro | falso | Aspecto = Programa Tempo = Pres VerbForm = Parte |
no | xx | verdadeiro | verdadeiro | |
comprando | xxxx | verdadeiro | falso | Aspecto = Programa Tempo = Pres VerbForm = Parte |
Reino Unido | XX | falso | falso | Substantivo = Prop Número = cantar |
comece | xxxx | verdadeiro | falso | Número = cantar |
para | xxx | verdadeiro | verdadeiro | |
$ | $ | falso | falso | |
1 | d | falso | falso | NumType = Cartão |
bilhão | xxxx | verdadeiro | falso | NumType = Cartão |
→ spaCy: visualizadores
Código 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
Saída:
Código 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
Saída:
→ spaCy: entidades nomeadas
Código 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
Saída:
texto | start_char | fim_char | rótulo |
---|---|---|---|
Maçã | 0 | 5 | ORGANIZAÇÃO |
Reino Unido | 27 | 31 | GPE |
US$ 1 bilhão | 44 | 54 | DINHEIRO |
Código 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
Saída:
texto | começar | fim | rótulo |
---|---|---|---|
任天堂 | 0 | 3 | ORGANIZAÇÃO |
Ano de 1983 | 4 | 9 | DATA |
ファミコン | 10 | 15 | PRODUTO |
14.800円 | 16 | 23 | DINHEIRO |
→ spaCy: vetores de palavras e similaridade
Código 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
Saída:
texto | tem_vetor | norma_vetorial | é_oov |
---|---|---|---|
cachorro | verdadeiro | 7.0336733 | falso |
gato | verdadeiro | 6.6808186 | falso |
banana | verdadeiro | 6.700014 | falso |
afskfsd | falso | 0,0 | verdadeiro |
Código 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 ) } "
Saída:
Doc 1: I like salty fries and hamburgers.
Doc 2: Fast food tastes very good.
Similarity: 0.7687607012190486
Código 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 ) } "
Saída:
doc1: 今日は雨ばっかり降って、嫌な天気ですね。
doc2: あいにくの悪天候で残念です。
Similarity: 0.8684192637149641
Tóquio - Japão + França = Paris?
Código 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
Saída:
classificação | texto | pontuação |
---|---|---|
1 | FRANÇA | 0,8346999883651733 |
2 | França | 0,8346999883651733 |
3 | França | 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 | Marselha | 0,6370999813079834 |
東京 - 日本 + フランス = パリ ?
Código 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
Saída:
classificação | texto | pontuação |
---|---|---|
1 | パリ | 0,7376999855041504 |
2 | フランス | 0,7221999764442444 |
3 | 東京 | 0,6697999835014343 |
4 | ストラスブール | 0,631600022315979 |
5 | リヨン | 0,5939000248908997 |
6 | Paris | 0,574400007724762 |
7 | ベルギー | 0,5683000087738037 |
8 | ニース | 0,5679000020027161 |
9 | アルザス | 0,5644999742507935 |
10 | 南仏 | 0,5547999739646912 |
️ Este recurso é atualmente experimental. Os detalhes estão sujeitos a alterações. Consulte a referência da API OpenAI e Ruby OpenAI para parâmetros disponíveis (max_tokens
,temperature
, etc).
Aproveite facilmente os modelos GPT no Ruby-spacy usando uma chave de API OpenAI. Ao construir prompts para o método Doc::openai_query
, você pode incorporar as seguintes propriedades de token do documento. Essas propriedades são recuperadas por meio de chamadas de função (feitas internamente pela GPT quando necessário) e integradas perfeitamente ao seu prompt. Observe que as chamadas de função precisam de gpt-4o-mini
ou superior. As propriedades disponíveis incluem:
surface
lemma
tag
pos
(parte gramatical)dep
(dependência)ent_type
(tipo de entidade)morphology
Código 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
Saída:
ビートルズは12枚のスタジオアルバムをリリースしました。
Código Ruby:
require "ruby-spacy"
api_key = ENV [ "OPENAI_API_KEY" ]
nlp = Spacy