ruby-spacy es un módulo contenedor para usar spaCy del lenguaje de programación Ruby a través de PyCall. Este módulo tiene como objetivo hacer que el uso de spaCy sea fácil y natural para los programadores de Ruby. Este módulo cubre las áreas de funcionalidad de spaCy para usar muchas variedades de sus modelos de lenguaje, no para construirlos .
Funcionalidad | |
---|---|
✅ | Tokenización, lematización, segmentación de oraciones. |
✅ | Etiquetado de parte del discurso y análisis de dependencias |
✅ | Reconocimiento de entidad nombrada |
✅ | Visualización de dependencia sintáctica. |
✅ | Acceso a vectores de palabras previamente entrenados |
✅ | Integración de API OpenAI Chat/Finalización/Incrustaciones |
Versión actual: 0.2.3
IMPORTANTE : asegúrese de que la opción enable-shared
esté habilitada en su instalación de Python. Puedes usar pyenv para instalar cualquier versión de Python que desees. Instale Python 3.10.6, por ejemplo, usando pyenv con enable-shared
de la siguiente manera:
$ env CONFIGURE_OPTS= " --enable-shared " pyenv install 3.10.6
Recuerde hacerlo accesible desde su directorio de trabajo. Se recomienda configurar global
en la versión de Python que acaba de instalar.
$ pyenv global 3.10.6
Luego, instale spaCy. Si usa pip
, el siguiente comando funcionará:
$ pip install spacy
Instale modelos de lenguaje entrenados. Para empezar, en_core_web_sm
será el más útil para realizar procesamiento de texto básico en inglés. Sin embargo, si desea utilizar funciones avanzadas de spaCy, como el reconocimiento de entidades con nombre o el cálculo de similitud de documentos, también debe instalar un modelo más grande 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 ver otros modelos en varios idiomas. Para instalar modelos para el idioma japonés, por ejemplo, puedes hacerlo de la siguiente manera:
$ python -m spacy download ja_core_news_sm
$ python -m spacy download ja_core_news_lg
Agregue esta línea al Gemfile de su aplicación:
gem 'ruby-spacy'
Y luego ejecuta:
$ bundle install
O instálelo usted mismo como:
$ gem install ruby-spacy
Vea los ejemplos a continuación.
Muchos de los siguientes ejemplos son traducciones de Python a Ruby de fragmentos de código en spaCy 101. Para obtener más ejemplos, consulte el directorio examples
.
→ spaCy: Tokenización
Código rubí:
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
Producción:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|
Manzana | es | mirando | en | comprar | Reino Unido | puesta en marcha | para | $ | 1 | mil millones |
→ spaCy: etiquetas y dependencias de partes del discurso
Código rubí:
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
Producción:
texto | lema | posición | etiqueta | departamento |
---|---|---|---|---|
Manzana | Manzana | PROPIEDAD | PNN | nsubj |
es | ser | auxiliar | VBZ | auxiliar |
mirando | mirar | VERBO | JBV | RAÍZ |
en | en | ADP | EN | deberes |
comprar | comprar | VERBO | JBV | pcomp |
Reino Unido | Reino Unido | PROPIEDAD | PNN | dobj |
puesta en marcha | puesta en marcha | SUSTANTIVO | NN | advcl |
para | para | ADP | EN | deberes |
$ | $ | SÍM | $ | mod cuántico |
1 | 1 | NÚMERO | CD | compuesto |
mil millones | mil millones | NÚMERO | CD | pobj |
Código rubí:
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
Producción:
texto | lema | posición | etiqueta | departamento |
---|---|---|---|---|
任天堂 | 任天堂 | PROPIEDAD | 名詞-固有名詞-一般 | nsubj |
は | は | ADP | 助詞-係助詞 | caso |
1983 | 1983 | NÚMERO | 名詞-数詞 | número |
年 | 年 | SUSTANTIVO | 名詞-普通名詞-助数詞可能 | obl |
に | に | ADP | 助詞-格助詞 | caso |
ファミコン | ファミコン | SUSTANTIVO | 名詞-普通名詞-一般 | objeto |
を | を | ADP | 助詞-格助詞 | caso |
14.800 | 14.800 | NÚMERO | 名詞-数詞 | fijado |
円 | 円 | SUSTANTIVO | 名詞-普通名詞-助数詞可能 | obl |
で | で | ADP | 助詞-格助詞 | caso |
発売 | 発売 | VERBO | 名詞-普通名詞-サ変可能 | RAÍZ |
し | する | auxiliar | 動詞-非自立可能 | auxiliar |
た | た | auxiliar | 助動詞 | auxiliar |
。 | 。 | PUNTO | 補助記号-句点 | punto |
→ Etiquetas POS y morfología
Código rubí:
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
Producción:
texto | forma | es_alfa | is_stop | morfología |
---|---|---|---|---|
Manzana | Xxxxx | verdadero | FALSO | SustantivoType = Prop Número = cantar |
es | xx | verdadero | verdadero | Estado de ánimo = Ind Número = cantar Persona = 3 Tiempo = Pres Forma verbal = fin |
mirando | xxxx | verdadero | FALSO | Aspecto = Prog. Tiempo = Pres Forma verbal = Parte |
en | xx | verdadero | verdadero | |
comprar | xxxx | verdadero | FALSO | Aspecto = Prog. Tiempo = Pres Forma verbal = Parte |
Reino Unido | XX | FALSO | FALSO | SustantivoType = Prop Número = cantar |
puesta en marcha | xxxx | verdadero | FALSO | Número = cantar |
para | xxx | verdadero | verdadero | |
$ | $ | FALSO | FALSO | |
1 | d | FALSO | FALSO | TipoNúm = Tarjeta |
mil millones | xxxx | verdadero | FALSO | TipoNúm = Tarjeta |
→ spaCy: Visualizadores
Código rubí:
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
Producción:
Código rubí:
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
Producción:
→ spaCy: entidades nombradas
Código rubí:
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
Producción:
texto | inicio_char | end_char | etiqueta |
---|---|---|---|
Manzana | 0 | 5 | ORG |
Reino Unido | 27 | 31 | AME |
mil millones de dólares | 44 | 54 | DINERO |
Código rubí:
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
Producción:
texto | comenzar | fin | etiqueta |
---|---|---|---|
任天堂 | 0 | 3 | ORG |
1983 | 4 | 9 | FECHA |
ファミコン | 10 | 15 | PRODUCTO |
14.800 円 | 16 | 23 | DINERO |
→ spaCy: Vectores de palabras y similitud
Código rubí:
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
Producción:
texto | tiene_vector | norma_vectorial | is_oov |
---|---|---|---|
perro | verdadero | 7.0336733 | FALSO |
gato | verdadero | 6.6808186 | FALSO |
banana | verdadero | 6.700014 | FALSO |
afskfsd | FALSO | 0.0 | verdadero |
Código rubí:
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 ) } "
Producción:
Doc 1: I like salty fries and hamburgers.
Doc 2: Fast food tastes very good.
Similarity: 0.7687607012190486
Código rubí:
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 ) } "
Producción:
doc1: 今日は雨ばっかり降って、嫌な天気ですね。
doc2: あいにくの悪天候で残念です。
Similarity: 0.8684192637149641
Tokio - Japón + Francia = París ?
Código rubí:
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
Producción:
rango | texto | puntaje |
---|---|---|
1 | FRANCIA | 0.8346999883651733 |
2 | Francia | 0.8346999883651733 |
3 | Francia | 0.8346999883651733 |
4 | PARÍS | 0.7703999876976013 |
5 | París | 0.7703999876976013 |
6 | París | 0.7703999876976013 |
7 | TOULOUSE | 0.6381999850273132 |
8 | Tolosa | 0.6381999850273132 |
9 | toulouse | 0.6381999850273132 |
10 | marsella | 0.6370999813079834 |
東京 - 日本 + フランス = パリ ?
Código rubí:
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
Producción:
rango | texto | puntaje |
---|---|---|
1 | パリ | 0.7376999855041504 |
2 | フランス | 0.7221999764442444 |
3 | 東京 | 0.6697999835014343 |
4 | ストラスブール | 0.631600022315979 |
5 | リヨン | 0.5939000248908997 |
6 | París | 0.574400007724762 |
7 | ベルギー | 0.5683000087738037 |
8 | ニース | 0.5679000020027161 |
9 | アルザス | 0.5644999742507935 |
10 | 南仏 | 0.5547999739646912 |
️ Esta característica es actualmente experimental. Los detalles están sujetos a cambios. Consulte la referencia de API de OpenAI y Ruby OpenAI para conocer los parámetros disponibles (max_tokens
,temperature
, etc.).
Aproveche fácilmente los modelos GPT dentro de Ruby-Spacy utilizando una clave API de OpenAI. Al crear solicitudes para el método Doc::openai_query
, puede incorporar las siguientes propiedades simbólicas del documento. Estas propiedades se recuperan a través de llamadas a funciones (realizadas internamente por GPT cuando es necesario) y se integran perfectamente en su mensaje. Tenga en cuenta que las llamadas a funciones necesitan gpt-4o-mini
o superior. Las propiedades disponibles incluyen:
surface
lemma
tag
pos
(parte del discurso)dep
(dependencia)ent_type
(tipo de entidad)morphology
Código rubí:
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
Producción:
ビートルズは12枚のスタジオアルバムをリリースしました.
Código rubí:
require "ruby-spacy"
api_key = ENV [ "OPENAI_API_KEY" ]
nlp = Spacy