Ruby-spacy — это модуль-оболочка для использования spaCy из языка программирования Ruby через PyCall. Цель этого модуля — сделать использование SpaCy программистами Ruby простым и естественным. Этот модуль охватывает области функциональности SpaCy для использования многих разновидностей языковых моделей, а не для их построения .
Функциональность | |
---|---|
✅ | Токенизация, лемматизация, сегментация предложений |
✅ | Тегирование части речи и анализ зависимостей |
✅ | Распознавание названного объекта |
✅ | Визуализация синтаксических зависимостей |
✅ | Доступ к предварительно обученным векторам слов |
✅ | Интеграция OpenAI Chat/Completion/Embeddings API |
Текущая версия: 0.2.3
ВАЖНО : Убедитесь, что в вашей установке Python включена опция enable-shared
. Вы можете использовать pyenv для установки любой понравившейся вам версии Python. Установите Python 3.10.6, например, используя pyenv с enable-shared
следующим образом:
$ 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: Models & Languages. Например, чтобы установить модели для японского языка, вы можете сделать это следующим образом:
$ 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: Токенизация
Рубиновый код:
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: теги частей речи и зависимости
Рубиновый код:
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
Выход:
текст | лемма | позиция | ярлык | глубина |
---|---|---|---|---|
Яблоко | Яблоко | ПРОПН | ННП | nsubj |
является | быть | ВСПОМОГАТЕЛЬНЫЙ | ВБЗ | вспомогательный |
смотрящий | смотреть | ГЛАГОЛ | ВБГ | КОРЕНЬ |
в | в | АДП | В | подготовка |
покупка | купить | ГЛАГОЛ | ВБГ | pcomp |
Великобритания | Великобритания | ПРОПН | ННП | добж |
запускать | запускать | СУЩЕСТВИТЕЛЬНОЕ | НН | реклама |
для | для | АДП | В | подготовка |
$ | $ | СИМ | $ | квантовый мод |
1 | 1 | НОМЕР | компакт-диск | сложный |
миллиард | миллиард | НОМЕР | компакт-диск | побж |
Рубиновый код:
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 |
は | は | АДП | 助詞-係助詞 | случай |
1983 год | 1983 год | НОМЕР | 名詞-数詞 | nummod |
年 | 年 | СУЩЕСТВИТЕЛЬНОЕ | 名詞-普通名詞-助数詞可能 | обл |
に | に | АДП | 助詞-格助詞 | случай |
ファミコン | ファミコン | СУЩЕСТВИТЕЛЬНОЕ | 名詞-普通名詞-一般 | объект |
を | を | АДП | 助詞-格助詞 | случай |
14 800 | 14 800 | НОМЕР | 名詞-数詞 | зафиксированный |
円 | 円 | СУЩЕСТВИТЕЛЬНОЕ | 名詞-普通名詞-助数詞可能 | обл |
で | で | АДП | 助詞-格助詞 | случай |
発売 | 発売 | ГЛАГОЛ | 名詞-普通名詞-サ変可能 | КОРЕНЬ |
し | する | ВСПОМОГАТЕЛЬНЫЙ | 動詞-非自立可能 | вспомогательный |
た | た | ВСПОМОГАТЕЛЬНЫЙ | 助動詞 | вспомогательный |
。 | 。 | ПУНКТ | 補助記号-句点 | пункт |
→ POS и морфологические теги
Рубиновый код:
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 | морфология |
---|---|---|---|---|
Яблоко | Ххххх | истинный | ЛОЖЬ | NounType = Опора Число = Петь |
является | хх | истинный | истинный | Настроение = Инд Число = Петь Человек = 3 Время = Прес VerbForm = Фин |
смотрящий | хххх | истинный | ЛОЖЬ | Аспект = Прог. Время = Прес ГлаголФорма = Часть |
в | хх | истинный | истинный | |
покупка | хххх | истинный | ЛОЖЬ | Аспект = Прог. Время = Прес ГлаголФорма = Часть |
Великобритания | ХХ | ЛОЖЬ | ЛОЖЬ | NounType = Опора Число = Петь |
запускать | хххх | истинный | ЛОЖЬ | Число = Петь |
для | ххх | истинный | истинный | |
$ | $ | ЛОЖЬ | ЛОЖЬ | |
1 | д | ЛОЖЬ | ЛОЖЬ | NumType = Карта |
миллиард | хххх | истинный | ЛОЖЬ | NumType = Карта |
→ spaCy: Визуализаторы
Рубиновый код:
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
Выход:
Рубиновый код:
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: Именованные объекты
Рубиновый код:
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
Выход:
текст | start_char | конечный_символ | этикетка |
---|---|---|---|
Яблоко | 0 | 5 | ОРГ |
Великобритания | 27 | 31 | ГПО |
1 миллиард долларов | 44 | 54 | ДЕНЬГИ |
Рубиновый код:
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: векторы слов и сходство
Рубиновый код:
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 | ЛОЖЬ |
афскфсд | ЛОЖЬ | 0,0 | истинный |
Рубиновый код:
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
Рубиновый код:
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
Токио – Япония + Франция = Париж?
Рубиновый код:
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 |
東京 - 日本 + フランス = パリ ?
Рубиновый код:
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 |
️ Эта функция в настоящее время является экспериментальной. Детали могут быть изменены. Пожалуйста, обратитесь к справочнику по API OpenAI и Ruby OpenAI для получения доступных параметров (max_tokens
,temperature
и т. д.).
Легко используйте модели GPT в Ruby-Spacy, используя ключ API OpenAI. При создании подсказок для метода Doc::openai_query
вы можете включить следующие свойства токена документа. Эти свойства извлекаются посредством вызовов функций (при необходимости выполняемых внутри GPT) и легко интегрируются в ваше приглашение. Обратите внимание, что для вызовов функций требуется gpt-4o-mini
или более поздняя версия. Доступные свойства включают в себя:
surface
lemma
tag
pos
(часть речи)dep
(зависимость)ent_type
(тип объекта)morphology
Рубиновый код:
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 минут のスタジオアルバムをリリースしました。
Рубиновый код:
require "ruby-spacy"
api_key = ENV [ "OPENAI_API_KEY" ]
nlp = Spacy