envtext for Chinese texts analysis in Environment domain
Project description
envText
首款中文环境领域文本分析工具。仍然在内测中,敬请期待。
特性:
-
:one:支持中文环境领域大规模预训练模型envBert!
-
:two:支持中文环境领域大规模预训练词向量!
-
:three:支持中文环境领域专家过滤的词表!
-
:four: 一且设计均为领域专家研究服务:
- 为神经网络模型精简了接口,只保留了必要的batch_size, learning_rate等参数
- 进一步优化huggingface transformers输入输出接口,支持20余种数据集格式
- 一键使用模型,让领域专家精力集中在分析问题上
-
:five: 使用transformers接口,支持轻松自定义模型
下一步计划:
- 数据集支持:支持常用标注工具数据集
- 精灵标注助手
- Doccano
- universal data annotator
- 专题支持
- 无监督实体/短语/固定搭配挖掘
- 气候变化文本分析工具箱
- 环境领域实体
- 更新文档和案例
如果您觉得本项目有用或是有帮助到您,麻烦您点击一下右上角的star :star:。您的支持是我们维护项目的最大动力:metal:!
使用方法
1. 安装
python环境配置
pip install envtext
#国内用户使用清华镜像加速
pip install envtext -i https://pypi.tuna.tsinghua.edu.cn/simple
由于envtext库依赖于transformers和pytorch,故安装时间比较长,建议等待时喝一杯咖啡:coffee:。
2. 推理
目前支持的模型有:
任务名称 | Bert模型 | RNNs模型 | 其他模型 |
---|---|---|---|
完型填空 | BertMLM | ------ | ------ |
分类 | BertCLS | RNNCLS | ------ |
情感分析(回归) | BertSA | RNNSA | ------ |
多选 | BertMultiChoice | RNNMultiChoice | ----- |
实体识别 | BertNER | RNNNER | ----- |
词向量 | ----- | ----- | Word2Vec |
除文本生成任务外,基本支持绝大部分NLP任务。
Bert 支持环境领域大规模预训练模型envBert
,也支持其他huggingface transformer的Bert模型。
RNNs模型包括LSTM
,GRU
,RNN
三种,可以选择使用环境领域预训练的词向量初始化,也可以使用Onehot编码初始化。
2.1 使用Bert
由于bert模型较大,建议从huggingface transformer上预先下载模型权重, 或者从我们提供的百度网盘链接上下载权重,保存到本地,方便使用。
百度网盘链接:
链接:百度网盘 envBert 模型
提取码:lfwm
#导入完形填空模型(masked language model)
from envtext.models import BertMLM
model = BertMLM('celtics1863/env-bert-chinese')
#进行预测
model('[MASK][MASK][MASK][MASK]是各国政府都关心的话题')
#导出结果
model.save_result('result.csv')
2.2 使用RNN
from envtext.models import RNNCLS
model = RNNCLS('本地pytorch_model.bin所在文件夹')
#进行预测
model('气候变化是各国政府都关心的话题')
#导出结果
model.save_result('result.csv')
2.3 使用word2vec
envtext自带长度为64的预训练词向量。
from envtext.models import load_word2vec
model = load_word2vec()
model.most_similar('环境保护')
3. 训练
#导入分类模型(classification)
from envtext.models import BertCLS
model = BertCLS('celtics1863/env-bert-chinese')
model.load_dataset('数据集位置',task = 'cls',format = '数据集格式')
#模型训练
model.train()
#模型保存
model.save_model('classification') #输入待保存的文件夹
或者:
#导入分类模型(classification)
from envtext.models import BertCLS
from envtext.data.utils import load_dataset
datasets,config = load_dataset('数据集位置',task = 'cls',format = '数据集格式')
model = BertCLS('celtics1863/env-bert-chinese',config)
#模型训练
model.train(datasets)
#模型保存
model.save_model('classification') #输入待保存的文件夹
4. 自定义模型
4.1 自定义Bert模型
首先自定义一个回归任务的Bert模型
from envtext.models.bert_base import BertBase
import torch
from transformers import BertPreTrainedModel,BertModel
class MyBert(BertPreTrainedModel):
def __init__(self, config):
super(MyBert, self).__init__(config)
self.bert = BertModel(config) #bert模型
self.regressor = torch.nn.Linear(config.hidden_size, 1) #回归器
self.loss = torch.nn.MSELoss() #损失函数
def forward(self, input_ids, token_type_ids=None, attention_mask=None, labels=None,
position_ids=None, inputs_embeds=None, head_mask=None):
outputs = self.bert(input_ids,
attention_mask=attention_mask,
token_type_ids=token_type_ids,
position_ids=position_ids,
head_mask=head_mask,
inputs_embeds=inputs_embeds)
#使用[CLS] token
cls_output = outputs[0][:,0,:]
# 得到判别值
logits = self.regressor(cls_output)
outputs = (logits,)
#这里需要与bert的接口保持一致,在有labels输入的情况下,返回(loss,logits),否则返回(logits,)
if labels is not None:
loss = self.loss(logits.squeeze(),labels)
outputs = (loss,) + outputs
return outputs
将模型与envtext的接口对接
class MyBertModel(BertBase):
#重写初始化函数
def initialize_bert(self,path = None,config = None,**kwargs):
super().initialize_bert(path,config,**kwargs)
self.model = MyBert.from_pretrained(self.model_path)
#重写预测函数
def predict_per_sentence(self,text, print_result = True ,save_result = True):
tokens=self.tokenizer.encode(text, return_tensors='pt',add_special_tokens=True).to(self.model.device) #获得token
logits = self.model(tokens)[0] #获得logits
if print_result:
#打印结果
print(logits[0].clone().detach().cpu())
if save_result:
#保存结果
self.result[text] = logits[0].clone().detach().cpu()
#[Optional] 可选 重新计算判别值函数,用于训练时提供除loss外的metrics信息
def compute_metrics(eval_pred)
from envtext.utils.metrics import metrics_for_reg
return metrics_for_reg(eval_pred)
#[Optional] 可选 用于对齐config中的参数,
#因为有的时候需要接受多种参数的输入,例如分类任务时可以接受类别数量,也可以接受类别的列表,这时候可以通过这个接口对齐。
def align_config(self):
super().align_config()
##可以使用self.update_config() 或 self.set_attribute() 接口重新设置config
pass
4.1 自定义RNN模型
定义RNN模型也是类似的。
先实现一个LSTM分类模型如下:
from torch import nn
import torch
class MyRNN(nn.Module):
def __init__(self,config):
self.rnn = nn.LSTM(config.embed_size, config.hidden_size ,config.num_layers,batch_first = True)
self.classifier = nn.Linear(config.hidden_size,config.num_labels)
def forward(self,X,labels = None):
X,_ = self.rnn(X)
logits = self.classifier(X)
#对齐接口,仍然需要在labels存在的情况下输出(loss,logits),不存在的情况下输出(logits,)
if labels is not None:
loss = self.loss_fn(logits,labels)
return (loss,logits)
return (logits,)
再将模型与envtext接口对接,
class MyRNNModel(BertBase):
#重写初始化函数
def initialize_bert(self,path = None,config = None,**kwargs):
super().initialize_bert(path,config,**kwargs) #保持不变
self.model = MyRNN.from_pretrained(self.model_path)
#重写预测函数
def predict_per_sentence(self,text, print_result = True ,save_result = True):
tokens=self.tokenizer.encode(text, return_tensors='pt').to(self.model.device) #获得token
logits = self.model(tokens)[0] #获得logits
preds,probs = torch.argmax(logits,dim = -1) #获得预测结果
if print_result:
#打印结果
print(preds.clone().detach().cpu().numpy())
if save_result:
#保存结果
self.result[text] = preds.clone().detach().cpu().numpy().tolist()
#[Optional] 可选 重写metrics,增加loss以外的metric
def compute_metrics(eval_pred):
return {} #返回一个dict
#[Optional] 可选 重写align_config,对齐config参数
def align_config(self):
super().align_config()
pass
更详细的教程,请参见我们的案例 jupyter notebooks
LISENCE
Apache Lisence
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file envtext-0.0.8.tar.gz
.
File metadata
- Download URL: envtext-0.0.8.tar.gz
- Upload date:
- Size: 35.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.8.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6461548195df238f6c45ec17bd35e660001b8f9a79f2d51746fee08ced0f2859 |
|
MD5 | 20fd7843d4702c3d5bfe7279d884e3e1 |
|
BLAKE2b-256 | 7c4e7a6ac6a2d13b4444d3265dd5e75c1e5776e6c0ff9c477705522334d7d919 |
File details
Details for the file envtext-0.0.8-py3-none-any.whl
.
File metadata
- Download URL: envtext-0.0.8-py3-none-any.whl
- Upload date:
- Size: 35.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.8.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 638f211927979bca1662d159c69dda8c636a618149083c1d27d25415eba5e127 |
|
MD5 | 7ab2041c9a1069089a15789c5a2f62ed |
|
BLAKE2b-256 | 561810d4bf20ec3bef0ed15f5af8de326aa4197220ce9277da3c9289f5eee60d |