ruby-spacy是一个包装模块,用于通过 PyCall 使用 Ruby 编程语言中的 spaCy。该模块旨在让 Ruby 程序员轻松自然地使用 spaCy。该模块涵盖了 spaCy 功能的领域,即使用其多种语言模型,而不是构建语言模型。
功能性 | |
---|---|
✅ | 分词、词形还原、句子分割 |
✅ | 词性标注和依存句法分析 |
✅ | 命名实体识别 |
✅ | 句法依存可视化 |
✅ | 访问预先训练的词向量 |
✅ | OpenAI 聊天/完成/嵌入 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
请记住使其可以从您的工作目录访问。建议将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:模型和语言。例如,要安装日语模型,您可以执行以下操作:
$ 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
输出:
文本 | 引理 | 位置 | 标签 | 部门 |
---|---|---|---|---|
苹果 | 苹果 | 丙二醇 | 国家核计划 | 恩苏吉 |
是 | 是 | 辅助设备 | VBZ | 辅助 |
寻找 | 看 | 动词 | VBG | 根 |
在 | 在 | 腺苷二磷酸 | 在 | 准备 |
购买 | 买 | 动词 | VBG | 复合材料 |
英国 | 英国 | 丙二醇 | 国家核计划 | 多吉 |
启动 | 启动 | 名词 | 神经网络 | 广告 |
为了 | 为了 | 腺苷二磷酸 | 在 | 准备 |
$ | $ | SYM | $ | 量子模型 |
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
输出:
文本 | 引理 | 位置 | 标签 | 部门 |
---|---|---|---|---|
任天堂 | 任天堂 | 丙二醇 | 名词-固有名词-一般 | 恩苏吉 |
は | は | 腺苷二磷酸 | 助词-系助词 | 案件 |
1983年 | 1983年 | 编号 | 名词数词 | 数字模数 |
年 | 年 | 名词 | 名词-普通名词-助数词可能 | 奥布尔 |
に | に | 腺苷二磷酸 | 助词- 助词 | 案件 |
法米康 | 法米康 | 名词 | 名词-普通名词-一般 | 对象 |
を | を | 腺苷二磷酸 | 助词- 助词 | 案件 |
14,800 | 14,800 | 编号 | 名词数词 | 固定的 |
円 | 円 | 名词 | 名词-普通名词-助数词可能 | 奥布尔 |
で | で | 腺苷二磷酸 | 助词- 助词 | 案件 |
発売 | 発売 | 动词 | 名词-普通名词-サ変可能 | 根 |
し | する | 辅助设备 | 动词-非自立可能 | 辅助 |
た | た | 辅助设备 | 助动词 | 辅助 |
。 | 。 | 旁路CT | 补助记号-句点 | 点 |
→ 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 | 是_停止 | 形态学 |
---|---|---|---|---|
苹果 | xxxx | 真的 | 错误的 | 名词类型 = 道具 数字=唱歌 |
是 | xx | 真的 | 真的 | 心情=工业 数字=唱歌 人 = 3 时态 = Pres 动词形式 = Fin |
寻找 | xxxx | 真的 | 错误的 | 方面=前卫 时态 = Pres 动词形式=部分 |
在 | xx | 真的 | 真的 | |
购买 | xxxx | 真的 | 错误的 | 方面=前卫 时态 = Pres 动词形式=部分 |
英国 | XX | 错误的 | 错误的 | 名词类型 = 道具 数字=唱歌 |
启动 | xxxx | 真的 | 错误的 | 数字 = 唱歌 |
为了 | xxx | 真的 | 真的 | |
$ | $ | 错误的 | 错误的 | |
1 | d | 错误的 | 错误的 | 数字类型 = 卡 |
十亿 | xxxx | 真的 | 错误的 | 数字类型 = 卡 |
→ 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
输出:
文本 | 起始字符 | 结束字符 | 标签 |
---|---|---|---|
苹果 | 0 | 5 | 奥格 |
英国 | 27 | 31 | 通用电气 |
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 | 奥格 |
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
输出:
文本 | 有向量 | 向量范数 | 是_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 |
东京 - 日本 + furansu = パri ?
红宝石代码:
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 |
️ 此功能目前处于实验阶段。详细信息可能会发生变化。请参阅 OpenAI 的 API 参考和 Ruby OpenAI 以获取可用参数(max_tokens
、temperature
等)。
使用 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枚のスタジオアルバムをoririsuしました。
红宝石代码:
require "ruby-spacy"
api_key = ENV [ "OPENAI_API_KEY" ]
nlp = Spacy