ruby-spacy 는 PyCall을 통해 Ruby 프로그래밍 언어의 spaCy를 사용하기 위한 래퍼 모듈입니다. 이 모듈은 Ruby 프로그래머가 spaCy를 쉽고 자연스럽게 사용할 수 있도록 하는 것을 목표로 합니다. 이 모듈에서는 언어 모델을 구축 하는 것이 아니라 다양한 언어 모델을 사용하기 위한 spaCy 기능 영역을 다룹니다.
기능성 | |
---|---|
✅ | 토큰화, 표제어 분석, 문장 분할 |
✅ | 품사 태그 지정 및 종속성 구문 분석 |
✅ | 명명된 엔터티 인식 |
✅ | 구문 종속성 시각화 |
✅ | 사전 훈련된 단어 벡터에 대한 액세스 |
✅ | OpenAI Chat/Completion/Embeddings API 통합 |
현재 버전: 0.2.3
중요 : Python 설치에서 enable-shared
옵션이 활성화되어 있는지 확인하십시오. pyenv를 사용하여 원하는 Python 버전을 설치할 수 있습니다. 예를 들어 다음과 같이 enable-shared
와 함께 pyenv를 사용하여 Python 3.10.6을 설치합니다.
$ env CONFIGURE_OPTS= " --enable-shared " pyenv install 3.10.6
작업 디렉터리에서 액세스할 수 있도록 설정하는 것을 잊지 마세요. 방금 설치한 Python 버전으로 global
설정하는 것이 좋습니다.
$ 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: 모델 및 언어를 참조하세요. 예를 들어 일본어용 모델을 설치하려면 다음과 같이 할 수 있습니다.
$ 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 | 10억 |
→ 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
산출:
텍스트 | 보조정리 | 포스 | 꼬리표 | 데프 |
---|---|---|---|---|
사과 | 사과 | PROPN | NNP | nsubj |
~이다 | BE | AUX | VBZ | 보조 |
찾고 | 바라보다 | 동사 | VBG | 뿌리 |
~에 | ~에 | ADP | 안에 | 예습 |
구매 | 구입하다 | 동사 | VBG | pcomp |
영국 | 영국 | PROPN | NNP | 도브 |
시작 | 시작 | 명사 | NN | advcl |
~을 위한 | ~을 위한 | ADP | 안에 | 예습 |
$ | $ | SYM | $ | 퀀트모드 |
1 | 1 | NUM | CD | 화합물 |
10억 | 10억 | NUM | CD | 포브 |
루비 코드:
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
산출:
텍스트 | 보조정리 | 포스 | 꼬리표 | 데프 |
---|---|---|---|---|
任天堂 | 任天堂 | PROPN | name詞-固有name詞-一般 | nsubj |
ㅋㅋㅋ | ㅋㅋㅋ | ADP | 助詞-係助詞 | 사례 |
1983년 | 1983년 | NUM | 이름 -数詞 | nummod |
年 | 年 | 명사 | name 詞-普communication-助数詞可能 | obl |
에 | 에 | ADP | 助詞-格助詞 | 사례 |
파미콘 | 파미콘 | 명사 | NAME詞-普통칭詞-一般 | 객체 |
을 | 을 | ADP | 助詞-格助詞 | 사례 |
14,800 | 14,800 | NUM | 이름 -数詞 | 결정된 |
円 | 円 | 명사 | name 詞-普communication-助数詞可能 | obl |
그리고 | 그리고 | ADP | 助詞-格助詞 | 사례 |
発売 | 発売 | 동사 | name 詞-普가요명 詞-sa変可能 | 뿌리 |
し | 스는 | AUX | 동詞-non自立可能 | 보조 |
타 | 타 | AUX | 助동영상 | 보조 |
。 | 。 | PUNC | 補助記号-句点 | 점을 찍다 |
→ 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 | 형태 |
---|---|---|---|---|
사과 | XXXXXX | 진실 | 거짓 | 명사유형 = Prop 번호 = 노래 |
~이다 | 더블 엑스 | 진실 | 진실 | 기분 = 인디 번호 = 노래 사람 = 3 시제 = 프레스 VerbForm = 핀 |
찾고 | xxxxx | 진실 | 거짓 | 측면 = Prog 시제 = 프레스 동사형 = 부분 |
~에 | 더블 엑스 | 진실 | 진실 | |
구매 | xxxxx | 진실 | 거짓 | 측면 = Prog 시제 = 프레스 동사형 = 부분 |
영국 | 더블 엑스 | 거짓 | 거짓 | 명사유형 = Prop 번호 = 노래 |
시작 | xxxxx | 진실 | 거짓 | 번호 = 노래 |
~을 위한 | 트리플 엑스 | 진실 | 진실 | |
$ | $ | 거짓 | 거짓 | |
1 | 디 | 거짓 | 거짓 | NumType = 카드 |
10억 | xxxxx | 진실 | 거짓 | 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
산출:
텍스트 | 시작_문자 | end_char | 상표 |
---|---|---|---|
사과 | 0 | 5 | ORG |
영국 | 27 | 31 | GPE |
10억 달러 | 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 | ORG |
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_벡터 | 벡터_표준 | is_oov |
---|---|---|---|
개 | 진실 | 7.0336733 | 거짓 |
고양이 | 진실 | 6.6808186 | 거짓 |
바나나 | 진실 | 6.700014 | 거짓 |
afskfsd | 거짓 | 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 |
️ 이 기능은 현재 실험적입니다. 세부 사항은 변경될 수 있습니다. 사용 가능한 매개변수(max_tokens
,temperature
등)는 OpenAI의 API 참조 및 Ruby OpenAI를 참조하세요.
OpenAI API 키를 사용하여 Ruby-spacy 내에서 GPT 모델을 쉽게 활용하세요. 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