ruby-spacy est un module wrapper permettant d'utiliser spaCy du langage de programmation Ruby via PyCall. Ce module vise à rendre l'utilisation de spaCy facile et naturelle pour les programmeurs Ruby. Ce module couvre les domaines de fonctionnalités de spaCy pour utiliser de nombreuses variétés de ses modèles de langage, et non pour en créer .
Fonctionnalité | |
---|---|
✅ | Tokenisation, lemmatisation, segmentation de phrases |
✅ | Marquage de parties du discours et analyse des dépendances |
✅ | Reconnaissance d'entité nommée |
✅ | Visualisation des dépendances syntaxiques |
✅ | Accès à des vecteurs de mots pré-entraînés |
✅ | Intégration de l'API OpenAI Chat/Complétion/Embeddings |
Version actuelle : 0.2.3
IMPORTANT : assurez-vous que l'option enable-shared
est activée dans votre installation Python. Vous pouvez utiliser pyenv pour installer n'importe quelle version de Python que vous aimez. Installez Python 3.10.6, par exemple, en utilisant pyenv avec enable-shared
comme suit :
$ env CONFIGURE_OPTS= " --enable-shared " pyenv install 3.10.6
Pensez à le rendre accessible depuis votre répertoire de travail. Il est recommandé de définir global
sur la version de Python que vous venez d'installer.
$ pyenv global 3.10.6
Ensuite, installez spaCy. Si vous utilisez pip
, la commande suivante fera l'affaire :
$ pip install spacy
Installez des modèles de langage formés. Pour commencer, en_core_web_sm
sera le plus utile pour effectuer un traitement de texte de base en anglais. Cependant, si vous souhaitez utiliser les fonctionnalités avancées de spaCy, telles que la reconnaissance d'entités nommées ou le calcul de similarité de documents, vous devez également installer un modèle plus grand comme en_core_web_lg
.
$ python -m spacy download en_core_web_sm
$ python -m spacy download en_core_web_lg
Voir Spacy : Modèles et langues pour d'autres modèles dans différentes langues. Pour installer des modèles pour la langue japonaise, par exemple, vous pouvez procéder comme suit :
$ python -m spacy download ja_core_news_sm
$ python -m spacy download ja_core_news_lg
Ajoutez cette ligne au Gemfile de votre application :
gem 'ruby-spacy'
Et puis exécutez :
$ bundle install
Ou installez-le vous-même en tant que :
$ gem install ruby-spacy
Voir les exemples ci-dessous.
La plupart des exemples suivants sont des traductions Python vers Ruby d'extraits de code dans spaCy 101. Pour plus d'exemples, consultez le répertoire examples
.
→ spaCy : tokenisation
Code 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
Sortir:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|
Pomme | est | regarder | à | achat | ROYAUME-UNI | démarrer | pour | $ | 1 | milliard |
→ spaCy : balises de partie du discours et dépendances
Code 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
Sortir:
texte | lemme | position | étiqueter | dépôt |
---|---|---|---|---|
Pomme | Pomme | PROPN | PNN | nsubj |
est | être | AUX | VBZ | aux |
regarder | regarder | VERBE | VBG | RACINE |
à | à | ADP | DANS | préparation |
achat | acheter | VERBE | VBG | pcomp |
ROYAUME-UNI | ROYAUME-UNI | PROPN | PNN | dobj |
démarrer | démarrer | NOM | N.N. | advcl |
pour | pour | ADP | DANS | préparation |
$ | $ | SYM | $ | quantmod |
1 | 1 | NUMÉRO | CD | composé |
milliard | milliard | NUMÉRO | CD | pobj |
Code 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
Sortir:
texte | lemme | position | étiqueter | dépôt |
---|---|---|---|---|
任天堂 | 任天堂 | PROPN | 名詞-固有名詞-一般 | nsubj |
は | は | ADP | 助詞-係助詞 | cas |
1983 | 1983 | NUMÉRO | 名詞-数詞 | nummod |
年 | 年 | NOM | 名詞-普通名詞-助数詞可能 | obl |
に | に | ADP | 助詞-格助詞 | cas |
ファミコン | ファミコン | NOM | 名詞-普通名詞-一般 | obj |
を | を | ADP | 助詞-格助詞 | cas |
14 800 | 14 800 | NUMÉRO | 名詞-数詞 | fixé |
円 | 円 | NOM | 名詞-普通名詞-助数詞可能 | obl |
で | で | ADP | 助詞-格助詞 | cas |
発売 | 発売 | VERBE | 名詞-普通名詞-サ変可能 | RACINE |
し | する | AUX | 動詞-非自立可能 | aux |
た | た | AUX | 助動詞 | aux |
。 | 。 | PONCTIF | 補助記号-句点 | ponctuel |
→ Tags PLV et morphologie
Code 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
Sortir:
texte | forme | est_alpha | est_stop | morphologie |
---|---|---|---|---|
Pomme | Xxxxx | vrai | FAUX | NomType = Prop Nombre = Chanter |
est | xx | vrai | vrai | Humeur = Ind Nombre = Chanter Personne = 3 Tendu = Prés Forme Verbe = Fin |
regarder | xxxx | vrai | FAUX | Aspect = Prog Tendu = Prés Forme Verbe = Partie |
à | xx | vrai | vrai | |
achat | xxxx | vrai | FAUX | Aspect = Prog Tendu = Prés Forme Verbe = Partie |
ROYAUME-UNI | XX | FAUX | FAUX | NomType = Prop Nombre = Chanter |
démarrer | xxxx | vrai | FAUX | Nombre = Chanter |
pour | xxx | vrai | vrai | |
$ | $ | FAUX | FAUX | |
1 | d | FAUX | FAUX | NumType = Carte |
milliard | xxxx | vrai | FAUX | NumType = Carte |
→ spaCy : Visualiseurs
Code 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
Sortir:
Code 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
Sortir:
→ spaCy : Entités nommées
Code 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
Sortir:
texte | start_char | fin_char | étiquette |
---|---|---|---|
Pomme | 0 | 5 | ORG |
ROYAUME-UNI | 27 | 31 | PME |
1 milliard de dollars | 44 | 54 | ARGENT |
Code 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
Sortir:
texte | commencer | fin | étiquette |
---|---|---|---|
任天堂 | 0 | 3 | ORG |
1983 | 4 | 9 | DATE |
ファミコン | 10 | 15 | PRODUIT |
14 800 € | 16 | 23 | ARGENT |
→ spaCy : vecteurs de mots et similarité
Code 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
Sortir:
texte | has_vecteur | vecteur_norme | est_oov |
---|---|---|---|
chien | vrai | 7.0336733 | FAUX |
chat | vrai | 6.6808186 | FAUX |
banane | vrai | 6.700014 | FAUX |
afskfsd | FAUX | 0,0 | vrai |
Code 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 ) } "
Sortir:
Doc 1: I like salty fries and hamburgers.
Doc 2: Fast food tastes very good.
Similarity: 0.7687607012190486
Code 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 ) } "
Sortir:
doc1: 今日は雨ばっかり降って、嫌な天気ですね。
doc2: あいにくの悪天候で残念です。
Similarity: 0.8684192637149641
Tokyo - Japon + France = Paris ?
Code 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
Sortir:
rang | texte | score |
---|---|---|
1 | FRANCE | 0.8346999883651733 |
2 | France | 0.8346999883651733 |
3 | France | 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 |
東京 - 日本 + フランス = パリ ?
Code 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
Sortir:
rang | texte | score |
---|---|---|
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 |
️ Cette fonctionnalité est actuellement expérimentale. Les détails sont sujets à changement. Veuillez vous référer à la référence API d'OpenAI et à Ruby OpenAI pour connaître les paramètres disponibles (max_tokens
,temperature
, etc.).
Exploitez facilement les modèles GPT dans Ruby-Spacy en utilisant une clé API OpenAI. Lors de la création d'invites pour la méthode Doc::openai_query
, vous pouvez incorporer les propriétés de jeton suivantes du document. Ces propriétés sont récupérées via des appels de fonction (effectués en interne par GPT si nécessaire) et intégrées de manière transparente dans votre invite. Notez que les appels de fonction nécessitent gpt-4o-mini
ou supérieur. Les propriétés disponibles incluent :
surface
lemma
tag
pos
(partie du discours)dep
(dépendance)ent_type
(type d'entité)morphology
Code 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
Sortir:
ビートルズは12枚のスタジオアルバムをリリースしました。
Code Ruby :
require "ruby-spacy"
api_key = ENV [ "OPENAI_API_KEY" ]
nlp = Spacy