Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleHub
提交
800317bf
P
PaddleHub
项目概览
PaddlePaddle
/
PaddleHub
1 年多 前同步成功
通知
283
Star
12117
Fork
2091
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
200
列表
看板
标记
里程碑
合并请求
4
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleHub
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
200
Issue
200
列表
看板
标记
里程碑
合并请求
4
合并请求
4
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
800317bf
编写于
3月 24, 2020
作者:
S
Steffy-zxf
提交者:
GitHub
3月 24, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add senta module sample (#475)
* relocate senta module scripts
上级
ce019ad9
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
255 addition
and
1 deletion
+255
-1
demo/README.md
demo/README.md
+5
-0
demo/senta_module_sample/README.md
demo/senta_module_sample/README.md
+194
-0
demo/senta_module_sample/senta_test/__init__.py
demo/senta_module_sample/senta_test/__init__.py
+0
-0
demo/senta_module_sample/senta_test/module.py
demo/senta_module_sample/senta_test/module.py
+49
-0
demo/senta_module_sample/senta_test/processor.py
demo/senta_module_sample/senta_test/processor.py
+3
-0
demo/senta_module_sample/senta_test/vocab.list
demo/senta_module_sample/senta_test/vocab.list
+3
-0
docs/contribution/contri_pretrained_model.md
docs/contribution/contri_pretrained_model.md
+1
-1
未找到文件。
demo/README.md
浏览文件 @
800317bf
...
...
@@ -22,6 +22,7 @@
*
[
文本分类
](
./text_classification
)
该样例展示了PaddleHub如何将ERNIE/BERT等Transformer类模型作为预训练模型在GLUE、ChnSentiCorp等数据集上完成文本分类的FineTune和预测。
**同时,该样例还展示了如何将一个Fine-tune保存的模型转化成PaddleHub Module。**
请确认转化时,使用的PaddleHub为1.6.0以上版本。
*
[
多标签分类
](
./multi_label_classification
)
该样例展示了PaddleHub如何将BERT作为预训练模型在Toxic数据集上完成多标签分类的FineTune和预测。
...
...
@@ -44,6 +45,10 @@
*
[
服务化部署Hub Serving使用
](
./serving
)
该样例文件夹下展示了服务化部署Hub Serving如何使用,将PaddleHub支持的可预测Module如何服务化部署。
*
[
预训练模型转化成PaddleHub Module
](
./senta_module_sample
)
该样例展示了如何将一个预训练模型转化成PaddleHub Module形式,使得可以通过
`hub.Module(name="module_name")`
实现一键加载。
请确认转化时,使用的PaddleHub为1.6.0以上版本。
**NOTE:**
以上任务示例均是利用PaddleHub提供的数据集,若您想在自定义数据集上完成相应任务,请查看
[
PaddleHub适配自定义数据完成Fine-tune
](
https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub%E9%80%82%E9%85%8D%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E5%AE%8C%E6%88%90FineTune
)
。
...
...
demo/senta_module_sample/README.md
0 → 100644
浏览文件 @
800317bf
# 如何编写一个PaddleHub Module
## 模型基本信息
我们准备编写一个PaddleHub Module,Module的基本信息如下:
```
yaml
name
:
senta_test
version
:
1.0.0
summary
:
This is a PaddleHub Module. Just for test.
author
:
anonymous
author_email
:
type
:
nlp/sentiment_analysis
```
Module存在一个接口sentiment_classify,用于接收传入文本,并给出文本的情感倾向(正面/负面),支持python接口调用和命令行调用。
```
python
import
paddlehub
as
hub
senta_test
=
hub
.
Module
(
name
=
"senta_test"
)
senta_test
.
sentiment_classify
(
texts
=
[
"这部电影太差劲了"
])
```
```
cmd
hub run senta_test --input_text 这部电影太差劲了
```
<br/>
## 策略
为了示例代码简单起见,我们使用一个非常简单的情感判断策略,当输入文本中带有词表中指定单词时,则判断文本倾向为负向,否则为正向
<br/>
## Module创建
### step 1. 创建必要的目录与文件
创建一个senta_test的目录,并在senta_test目录下分别创建__init__.py、module.py、processor.py、vocab.list,其中
|文件名|用途|
|-|-|
|
\_\_
init
\_\_
.py|空文件|
|module.py|主模块,提供Module的实现代码|
|processor.py|辅助模块,提供词表加载的方法|
|vocab.list|存放词表|
```
cmd
➜ tree senta_test
senta_test/
├── vocab.list
├── __init__.py
├── module.py
└── processor.py
```
### step 2. 实现辅助模块processor
在processor.py中实现一个load_vocab接口用于读取词表
```
python
def
load_vocab
(
vocab_path
):
with
open
(
vocab_path
)
as
file
:
return
file
.
read
().
split
()
```
### step 3. 编写Module处理代码
module.py文件为Module的入口代码所在,我们需要在其中实现预测逻辑。
#### step 3_1. 引入必要的头文件
```
python
import
argparse
import
os
import
paddlehub
as
hub
from
paddlehub.module.module
import
runnable
,
moduleinfo
from
senta_test.processor
import
load_vocab
```
**NOTE:**
当引用Module中模块时,需要输入全路径,如senta_test.processor
#### step 3_2. 定义SentaTest类
module.py中需要有一个继承了hub.Module的类存在,该类负责实现预测逻辑,并使用moduleinfo填写基本信息。当使用hub.Module(name="senta_test")加载Module时,PaddleHub会自动创建SentaTest的对象并返回。
```
python
@
moduleinfo
(
name
=
"senta_test"
,
version
=
"1.0.0"
,
summary
=
"This is a PaddleHub Module. Just for test."
,
author
=
"anonymous"
,
author_email
=
""
,
type
=
"nlp/sentiment_analysis"
,
)
class
SentaTest
(
hub
.
Module
):
...
```
#### step 3_3. 执行必要的初始化
```
python
def
_initialize
(
self
):
# add arg parser
self
.
parser
=
argparse
.
ArgumentParser
(
description
=
"Run the senta_test module."
,
prog
=
'hub run senta_test'
,
usage
=
'%(prog)s'
,
add_help
=
True
)
self
.
parser
.
add_argument
(
'--input_text'
,
type
=
str
,
default
=
None
,
help
=
"text to predict"
)
# load word dict
vocab_path
=
os
.
path
.
join
(
self
.
directory
,
"vocab.list"
)
self
.
vocab
=
load_vocab
(
vocab_path
)
```
`注意`
:执行类的初始化不能使用默认的__init__接口,而是应该重载实现_initialize接口。对象默认内置了directory属性,可以直接获取到Module所在路径
#### step 3_4. 完善预测逻辑
```
python
def
sentiment_classify
(
self
,
texts
):
results
=
[]
for
text
in
texts
:
sentiment
=
"positive"
for
word
in
self
.
vocab
:
if
word
in
text
:
sentiment
=
"negative"
break
results
.
append
({
"text"
:
text
,
"sentiment"
:
sentiment
})
return
results
```
#### step 3_5. 支持命令行调用
如果希望Module可以支持命令行调用,则需要提供一个经过runnable修饰的接口,接口负责解析传入数据并进行预测,将结果返回。
如果不需要提供命令行预测功能,则可以不实现该接口,PaddleHub在用命令行执行时,会自动发现该Module不支持命令行方式,并给出提示。
```
python
@
runnable
def
run_cmd
(
self
,
argvs
):
args
=
self
.
parser
.
parse_args
(
argvs
)
texts
=
[
args
.
input_text
]
return
self
.
sentiment_classify
(
texts
)
```
#### step 3_6. 支持serving调用
TODO
### 完整代码
*
[
module.py
](
./senta_test/module.py
)
*
[
processor.py
](
./senta_test/module.py
)
<br/>
## 测试步骤
完成Module编写后,我们可以通过以下方式测试该Module
### 调用方法1
将Module安装到本机中,再通过Hub.Module(name=...)加载
```
shell
hub
install
senta_test
```
```
python
import
paddlehub
as
hub
senta_test
=
hub
.
Module
(
name
=
"senta_test"
)
senta_test
.
sentiment_classify
(
texts
=
[
"这部电影太差劲了"
])
```
### 调用方法2
直接通过Hub.Module(directory=...)加载
```
python
import
paddlehub
as
hub
senta_test
=
hub
.
Module
(
directory
=
"senta_test/"
)
senta_test
.
sentiment_classify
(
texts
=
[
"这部电影太差劲了"
])
```
### 调用方法3
将senta_test作为路径加到环境变量中,直接加载SentaTest对象
```
shell
export
PYTHONPATH
=
senta_test:
$PYTHONPATH
```
```
python
from
senta_test.module
import
SentaTest
SentaTest
.
sentiment_classify
(
texts
=
[
"这部电影太差劲了"
])
```
### 调用方法4
将Module安装到本机中,再通过hub run运行
```
shell
hub
install
senta_test
hub run senta_test
--input_text
"这部电影太差劲了"
```
demo/senta_module_sample/senta_test/__init__.py
0 → 100644
浏览文件 @
800317bf
demo/senta_module_sample/senta_test/module.py
0 → 100644
浏览文件 @
800317bf
import
argparse
import
os
import
paddlehub
as
hub
from
paddlehub.module.module
import
runnable
,
moduleinfo
from
senta_test.processor
import
load_vocab
@
moduleinfo
(
name
=
"senta_test"
,
version
=
"1.0.0"
,
summary
=
"This is a PaddleHub Module. Just for test."
,
author
=
"anonymous"
,
author_email
=
""
,
type
=
"nlp/sentiment_analysis"
,
)
class
SentaTest
(
hub
.
Module
):
def
_initialize
(
self
):
# add arg parser
self
.
parser
=
argparse
.
ArgumentParser
(
description
=
"Run the senta_test module."
,
prog
=
'hub run senta_test'
,
usage
=
'%(prog)s'
,
add_help
=
True
)
self
.
parser
.
add_argument
(
'--input_text'
,
type
=
str
,
default
=
None
,
help
=
"text to predict"
)
# load word dict
vocab_path
=
os
.
path
.
join
(
self
.
directory
,
"vocab.list"
)
self
.
vocab
=
load_vocab
(
vocab_path
)
def
sentiment_classify
(
self
,
texts
):
results
=
[]
for
text
in
texts
:
sentiment
=
"positive"
for
word
in
self
.
vocab
:
if
word
in
text
:
sentiment
=
"negative"
break
results
.
append
({
"text"
:
text
,
"sentiment"
:
sentiment
})
return
results
@
runnable
def
run_cmd
(
self
,
argvs
):
args
=
self
.
parser
.
parse_args
(
argvs
)
texts
=
[
args
.
input_text
]
return
self
.
sentiment_classify
(
texts
)
demo/senta_module_sample/senta_test/processor.py
0 → 100644
浏览文件 @
800317bf
def
load_vocab
(
vocab_path
):
with
open
(
vocab_path
)
as
file
:
return
file
.
read
().
split
()
demo/senta_module_sample/senta_test/vocab.list
0 → 100644
浏览文件 @
800317bf
糟糕
差劲
浪费
docs/contribution/contri_pretrained_model.md
浏览文件 @
800317bf
...
...
@@ -12,7 +12,7 @@ author_email:
type
:
nlp/sentiment_analysis
```
**本示例代码可以参考[senta_module_sample](../../demo/senta_module_sample/)**
**本示例代码可以参考[senta_module_sample](../../demo/senta_module_sample/
senta_test
)**
Module存在一个接口sentiment_classify,用于接收传入文本,并给出文本的情感倾向(正面/负面),支持python接口调用和命令行调用。
```
python
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录