四種常見NLP框架使用總結

2021-02-13 AINLP

作者:哈工大SCIR 狄東林 劉元興 朱慶福 胡景雯

引言

隨著人工智慧的發展,越來越多深度學習框架如雨後春筍般湧現,例如PyTorch、TensorFlow、Keras、MXNet、Theano和PaddlePaddle等。這些基礎框架提供了構建一個模型需要的基本通用工具包。但是對於NLP相關的任務,我們往往需要自己編寫大量比較繁瑣的代碼,包括數據預處理和訓練過程中的工具等。因此,大家通常基於NLP相關的深度學習框架編寫自己的模型,如OpenNMT、ParlAI和AllenNLP等。藉助這些框架,三兩下就可以實現一個NLP相關基礎任務的訓練和預測。但是當我們需要對基礎任務進行改動時,又被代碼封裝束縛,舉步維艱。因此,本文主要針對於如何使用框架實現自定義模型,幫助大家快速了解框架的使用方法。

我們首先介紹廣泛用於NLP/CV領域的TensorFlow框架——Tensor2Tensor,該框架提供了NLP/CV領域中常用的基本模型。然後介紹NLP領域的AllenNLP框架,該框架基於PyTorch平臺開發,為NLP模型提供了統一的開發架構。接著在介紹NLP領域中重要的兩個子領域,神經機器翻譯和對話系統常用的框架,OpenNMT和ParlAI。通過這四個框架的介紹,希望能幫助大家了解不同開發平臺,不同領域下的NLP框架的使用方式。

框架名稱應用領域開發平臺Tensor2TensorNLP/CVTensorFlowAllenNLPNLPPyTorchOpenNMTNLP-機器翻譯PyTorch/TensorFlowParlAINLP-對話PyTorch


一、Tensor2Tensor

Tensor2Tensor[1]是一個基於TensorFlow的較為綜合性的庫,既包括一些CV 和 NLP的基本模型,如LSTM,CNN等,也提供一些稍微高級一點的模型,如各式各樣的GAN和Transformer。對NLP的各項任務支持得都比較全面,很方便容易上手。

由於該資源庫仍處於不斷開發過程中,截止目前為止,已經有3897次commit,66個release 版本,178 contributors。在2018年《Attention is all you need》這個全網熱文中,該倉庫是官方提供的Transformer模型版本,後面陸陸續續其餘平臺架構才逐漸補充完成。

Tensor2Tensor(Transformer)使用方法

注意:有可能隨著版本迭代更新的過程中會有局部改動

1. 安裝CUDA 9.0 (一定是9.0,不能是9.2)

2. 安裝TensorFlow (現在是1.12)

3. 安裝Tensor2Tensor (參考官網安裝)

1. 數據預處理

這一步驟是根據自己任務自己編寫一些預處理的代碼,比如字符串格式化,生成特徵向量等操作。

2. 編寫自定義problem:

編寫自定義的problem代碼,一定需要在自定義類名前加裝飾器(@registry.registry_problem)。

自定義problem的類名一定是駝峰式命名,py文件名一定是下劃線式命名,且與類名對應。

一定需要繼承父類problem,t2t已經提供用於生成數據的problem,需要自行將自己的問題人腦分類找到對應的父類,主要定義的父類problem有:(運行 t2t-datagen 可以查看到problem list)。

一定需要在__init__.py文件裡導入自定義problem文件。

3. 使用t2t-datagen 將自己預處理後的數據轉為t2t的格式化數據集【注意路徑】

1cd scripts && t2t-datagen --t2t_usr_dir=./ --data_dir=../train_data --tmp_dir=../tmp_data --problem=my_problem

4. 使用t2t-trainer使用格式化的數據集進行訓練

1cd scripts && t2t-trainer --t2t_usr_dir=./ --problem=my_problem --data_dir=../train_data --model=transformer --hparams_set=transformer_base --output_dir=../output --train_steps=20 --eval_steps=100

5. 使用t2t-decoder對測試集進行預測【注意路徑】

1cd scripts && t2t-decoder --t2t_usr_dir=./ --problem=my_problem --data_dir=../train_data --model=transformer --hparams_set=transformer_base --output_dir=../output --decode_hparams=」beam_size=5,alpha=0.6」 --decode_from_file=../decode_in/test_in.txt --decode_to_file=../decode_out/test_out.txt

6. 使用t2t-exporter導出訓練模型

7. 分析結果

1# coding=utf-8
2from tensor2tensor.utils import registry
3from tensor2tensor.data_generators import problem, text_problems
4
5@registry.register_problem
6class AttentionGruFeature(text_problems.Text2ClassProblem):
7
8    ROOT_DATA_PATH = '../data_manager/'
9    PROBLEM_NAME = 'attention_gru_feature'
10
11    @property
12    def is_generate_per_split(self):
13        return True
14
15    @property
16    def dataset_splits(self):
17        return [{
18            "split": problem.DatasetSplit.TRAIN,
19            "shards": 5,
20        }, {
21            "split": problem.DatasetSplit.EVAL,
22            "shards": 1,
23        }]
24
25    @property
26    def approx_vocab_size(self):
27        return 2 ** 10  # 8k vocab suffices for this small dataset.
28
29    @property
30    def num_classes(self):
31        return 2
32
33    @property
34    def vocab_filename(self):
35        return self.PROBLEM_NAME + ".vocab.%d" % self.approx_vocab_size
36
37    def generate_samples(self, data_dir, tmp_dir, dataset_split):
38        del data_dir
39        del tmp_dir
40        del dataset_split
41
42        # with open('{}self_antecedent_generate_sentences.pkl'.format(self.ROOT_DATA_PATH), 'rb') as f:
43        #     # get all the sentences for antecedent identification
44        #     _sentences = pickle.load(f)
45        #
46        # for _sent in _sentences:
47        #     # # sum pooling, FloatTensor, Size: 400
48        #     # _sent.input_vec_sum
49        #     # # sum pooling with feature, FloatTensor, Size: 468
50        #     # _sent.input_vec_sum_feature
51        #     # # GRU, FloatTensor, Size: 6100
52        #     # _sent.input_vec_hidden
53        #     # # GRU with feature, FloatTensor, Size: 6168
54        #     # _sent.input_vec_hidden_feature
55        #     # # AttentionGRU, FloatTensor, Size: 1600
56        #     # _sent.input_vec_attention
57        #     # # AttentionGRU with feature, FloatTensor, Size: 1668
58        #     # _sent.input_vec_attention_feature
59        #     # # tag(1 for positive case, and 0 for negative case), Int, Size: 1
60        #     # _sent.antecedent_label
61        #     # # tag(1 for positive case, and 0 for negative case), Int, Size: 1
62        #     # _sent.trigger_label
63        #     # # trigger word for the error analysis, Str
64        #     # _sent.trigger
65        #     # # trigger word auxiliary type for the experiment, Str
66        #     # _sent.aux_type
67        #     # # the original sentence for the error analysis, Str
68        #     # _sent.sen
69        #
70        #     yield {
71        #         "inputs": _sent.input_vec_attention_feature,
72        #         "label": _sent.antecedent_label
73        #     }
74
75        with open('../prep_ante_data/antecedent_label.txt') as antecedent_label, open(
76                '../prep_ante_data/input_vec_attention_gru_feature.txt') as input_vec:
77            for labal in antecedent_label:
78                yield {
79                    "inputs": input_vec.readline().strip()[1:-2],
80                    "label": int(labal.strip())
81                }
82
83        antecedent_label.close()
84        input_vec.close()
85
86
87# PROBLEM_NAME='attention_gru_feature'
88# DATA_DIR='../train_data_atte_feature'
89# OUTPUT_DIR='../output_atte_feature'
90# t2t-datagen --t2t_usr_dir=. --data_dir=$DATA_DIR --tmp_dir=../tmp_data --problem=$PROBLEM_NAME
91# t2t-trainer --t2t_usr_dir=. --data_dir=$DATA_DIR --problem=$PROBLEM_NAME --model=transformer --hparams_set=transformer_base --output_dir=$OUTPUT_DIR

T2T 是Google 非官方提供的倉庫,是社區廣大愛好者共同努力建設的簡單入門型框架,底層封裝TF,能滿足大部分CV 和 NLP的任務,很多主流成熟的模型也已經都有實現。直接繼承或實現一些框架內預設的接口,就可以完成很多任務。入門起來非常友好,並且文檔更新也較為及時。認真閱讀文檔(或閱讀報錯信息)就可以了解並使用該框架,方便許多非大幅創新模型的復現。

二、AllenNLP

AllenNLP是一個基於PyTorch的NLP研究庫,可為開發者提供語言任務中的各種業內最佳訓練模型。官網提供了一個很好的入門教程[2],能夠讓初學者在30分鐘內就了解AllenNLP的使用方法。

由於AllenNLP已經幫我們實現很多麻煩瑣碎的預處理和訓練框架,我們實際需要編寫的只有:

DatasetReader的示例代碼如下所示。

1from typing import Dict, Iterator
2
3from allennlp.data import Instance
4from allennlp.data.fields import TextField
5from allennlp.data.dataset_readers import DatasetReader
6from allennlp.data.token_indexers import TokenIndexer, SingleIdTokenIndexer
7from allennlp.data.tokenizers import WordTokenizer, Tokenizer
8
9@DatasetReader.register('custom')
10class CustomReader(DatasetReader):
11
12    def __init__(self, tokenizer: Tokenizer = None, token_indexers: Dict[str, TokenIndexer] = None) -> None:
13        super().__init__(lazy=False)
14        self.tokenizer = tokenizer or WordTokenizer()
15        self.word_indexers = token_indexers or {"word": SingleIdTokenIndexer('word')}
16
17    def text_to_instance(self, _input: str) -> Instance:
18        fields = {}
19        tokenized_input = self.tokenizer.tokenize(_input)
20        fields['input'] = TextField(tokenized_input, self.word_indexers)
21        return Instance(fields)
22
23    def _read(self, file_path: str) -> Iterator[Instance]:
24        with open(file_path) as f:
25            for line in f:
26                yield self.text_to_instance(line)

首先需要自定義_read函數,寫好讀取數據集的方式,通過yield方式返回構建一個instance需要的文本。然後通過text_to_instance函數將文本轉化為instance。在text_to_instance函數中,需要對輸入的文本進行切分,然後構建fileld。

self.tokenizer是用來切分文本成Token的。有Word級別的也有Char級別的。self.word_indexers是用來索引Token並轉換為Tensor。同樣TokenIndexer也有很多種,在實現自己的模型之前可以看看官方文檔有沒有比較符合自己需要的類型。如果你需要構建多個Vocabulary,比如源語言的vocab 和目標語言的vocab, 就需要在這裡多定義一個self.word_indexers。不同indexers在vocab中,是通過SingleIdTokenIndexer函數初始化的namespace來區分的,也就是15行代碼中最後一個的'word'。


與PyTorch實現model的方式一樣,但需要注意的是:

@Model.register('') 註冊之後可以使用JsonNet進行模型選擇(如果你有多個模型,可以直接修改Json值來切換,不需要手動修改代碼)。

由於AllenNLP封裝了Trainer,所以我們需要在model內實現或者選擇已有的評價指標,這樣在訓練過程中就會自動計算評價指標。具體方法是,在__init__方法中定義評價函數,可以從在官方文檔[3]上看看有沒有,如果沒有的話就需要自己寫。

1self.acc = CategoricalAccuracy()

然後在forward方法中調用評價函數計算指標

1self.acc(output, labels)

最後在model的get_metrics返回對應指標的dict結果就行了。

1def get_metrics(self, reset: bool = False) -> Dict[str, float]:
2    return {"acc": self.acc.get_metric(reset)}

一般來說直接調用AllenNLP的Trainer方法就可以自動開始訓練了。但是如果你有一些特殊的訓練步驟,比如GAN[4],你就不能單純地使用AllenNLP的Trainer,得把Trainer打開進行每步的迭代,可以參考[4]中trainer的寫法。

關於AllenNLP的學習代碼,可以參考[5]。由於AllenNLP是基於PyTorch的,代碼風格和PyTorch的風格基本一致,因此如果你會用PyTorch,那上手AllenNLP基本沒有什麼障礙。代碼注釋方面也比較全,模塊封裝方面比較靈活。AllenNLP的代碼非常容易改動,就像用純的PyTorch一樣靈活。當然靈活也就意味著很多複雜的實現,AllenNLP目前還沒有,大部分可能都需要自己寫。AllenNLP依賴了很多Python庫,近期也在更新。

三、OpenNMT

OpenNMT[6]是一個開源的神經機器翻譯(neural machine translation)項目,採用目前普遍使用的編碼器-解碼器(encoder-decoder)結構,因此,也可以用來完成文本摘要、回復生成等其他文本生成任務。目前,該項目已經開發出PyTorch、TensorFlow兩個版本,用戶可以按需選取。本文以PyTorch版本[7]為例進行介紹。

作為一個典型的機器翻譯框架,OpenNMT的數據主要包含source和target兩部分,對應於機器翻譯中的源語言輸入和目標語言翻譯。OpenNMT採用TorchText中的Field數據結構來表示每個部分。用戶自定義過程中,如需添加source和target外的其他數據,可以參照source field或target field的構建方法,如構建一個自定義的user_data數據:

1fields["user_data"] = torchtext.data.Field(
2    init_token=BOS_WORD, eos_token=EOS_WORD,
3    pad_token=PAD_WORD,
4    include_lengths=True)

其中init_token、eos_token和pad_token分別為用戶自定義的開始字符、結束字符和padding字符。Include_lengths為真時,會同時返回處理後數據和數據的長度。

OpenNMT實現了注意力機制的編碼器-解碼器模型。框架定義了編碼器和解碼器的接口,在該接口下,進一步實現了多種不同結構的編碼器解碼器,可供用戶按需組合,如CNN、 RNN編碼器等。如用戶需自定義特定結構的模塊,也可以遵循該接口進行設計,以保證得到的模塊可以和OpenNMT的其他模塊進行組合。其中,編碼器解碼器接口如下:

1class EncoderBase(nn.Module):
2    def forward(self, input, lengths=None, hidden=None):
3        raise NotImplementedError
4
5class RNNDecoderBase(nn.Module):
6    def forward(self, input, context, state, context_lengths=None):
7             raise NotImplementedError

OpenNMT的訓練由Trainer.py中Trainer類控制,該類的可定製化程度並不高,只實現了最基本的序列到序列的訓練過程。對於多任務、對抗訓練等複雜的訓練過程,需要對該類進行較大的改動。

OpenNMT提供了基於PyTorch和TensorFlow這兩大主流框架的不同實現,能夠滿足絕大多數用戶的需求。對於基礎框架的封裝使得其喪失了一定的靈活性,但是對於編碼器-解碼器結構下文本生成的任務來說,可以省去數據格式、接口定義等細節處理,將精力更多集中在其自定義模塊上,快速搭建出需要的模型。


四、ParlAI

ParlAI是Facebook公司開發出的一個專注於對話領域在很多對話任務上分享,訓練和評估對話模型的平臺[8]。這個平臺可以用於訓練和測試對話模型,在很多數據集上進行多任務訓練,並且集成了Amazon Mechanical Turk,以便數據收集和人工評估。

ParlAI 中的基本概念:

1def observe(self, observation): #用觀察更新內部狀態
2def act(self): #根據內部狀態生成動作

observations是我們稱之為代理的act函數返回的對象,並且因為它們被輸入到其他代理的observe函數而被命名。這是ParlAI中代理與環境之間傳遞消息的主要方式。觀察通常採用包含不同類型信息的python詞典的形式。

teacher是特殊類型的代理人。他們像所有代理一樣實施act和observe功能,但他們也會跟蹤他們通過報告功能返回的指標,例如他們提出的問題數量或者正確回答這些問題的次數。

ParlAI 的代碼包含如下幾個主要的文件夾[9]:

ParlAI內部封裝了很多對話任務(如ConvAI2)和評測(如F1值和hits@1等等)。使用ParlAI現有的數據,代碼以及模型進行訓練和評測,可以快速實現對話模型中的很多baseline模型。但由於代碼封裝性太強,不建議使用它從頭搭建自己的模型。想在基礎上搭建自己的模型可以詳細參考官網中的教程[10]。

這裡簡單介紹直接利用內部的數據,代碼以及模型進行訓練和評測的一個簡單例子(Train a Transformer on Twitter):

1. 列印一些數據集中的例子

1python examples/display_data.py -t twitter
2*# display first examples from twitter dataset*

2. 訓練模型

1python examples/train_model.py -t twitter -mf /tmp/tr_twitter -m transformer/ranker -bs 10 -vtim 3600 -cands batch -ecands batch --data-parallel True
2# train transformer ranker

3. 評測之前訓練出的模型

1python examples/eval_model.py -t twitter -m legacy:seq2seq:0 -mf models:twitter/seq2seq/twitter_seq2seq_model
2# Evaluate seq2seq model trained on twitter from our model zoo

4. 輸出模型的一些預測

1python examples/display_model.py -t twitter -mf /tmp/tr_twitter -ecands batch
2# display predictions for model saved at specific file on twitter

ParlAI有自己的一套模式,例如world、agent和teacher等等。代碼封裝性特別好,代碼量巨大,如果想查找一個中間結果,需要一層一層查看調用的函數,不容易進行修改。ParlAI中間封裝了很多現有的baseline模型,對於對話研究者,可以快速實現baseline模型。目前ParlAI還在更新,不同版本之間的代碼可能結構略有不同,但是ParlAI的核心使用方法大致相同。

五、總結本文介紹了四種常見框架構建自定義模型的方法。Tensor2Tensor涵蓋比較全面,但是只支持TensorFlow。AllenNLP最大的優點在於簡化了數據預處理、訓練和預測的過程。代碼改起來也很靈活,但是一些工具目前官方還沒有實現,需要自己寫。如果是比較傳統的編碼器-解碼器結構下文本生成任務,使用OpenNMT能節省很多時間。但是如果是結構比較新穎的模型,使用OpenNMT搭建模型依舊是一個不小的挑戰。ParlAI內部封裝了很多對話任務,方便使用者快速復現相關的baseline模型。但由於代碼封裝性太強和其特殊的模式,使用ParlAI從頭搭建自己的模型具有一定的挑戰性。每個框架都有各自的優點和弊端,大家需結合自身情況和使用方式進行選擇。但是不建議每個框架都試一遍,畢竟掌握每個框架還是需要一定時間成本的。參考資料

[1] https://github.com/tensorflow/tensor2tensor

[2] https://allennlp.org/tutorials

[3] https://allenai.github.io/allennlp-docs/api/allennlp.training.metrics.html

[4] http://www.realworldnlpbook.com/blog/training-a-shakespeare-reciting-monkey-using-rl-and-seqgan.html

[5] https://github.com/mhagiwara/realworldnlp

[6] http://opennmt.net/

[7] https://github.com/OpenNMT/OpenNMT-py

[8] http://parl.ai.s3-website.us-east-2.amazonaws.com/docs/tutorial_quick.html

[9] https://www.infoq.cn/article/2017/05/ParlAI-Facebook-AI

[10] http://parl.ai.s3-website.us-east-2.amazonaws.com/docs/tutorial_basic.html

本期責任編輯:崔一鳴

本期編輯:劉元興

相關焦點

  • 一點點spaCy思想食物:易於使用的NLP框架
    spaCy是一個NLP框架,由Explosion AI於2015年2月發布。它被認為是世界上最快的。易於使用並具有使用神經網絡的能力是其他優點。這是spaCy詞典中「man」的單詞vector:[-1.7310e-01, 2.0663e-01, 1.6543e-02, , -7.3803e-02] spaCy的單詞向量的長度是300.它可以在其他框架中有所不同。
  • 【PTMs】全面總結!PTMs:NLP預訓練模型
    本文以此篇綜述論文為主要參考,通過借鑑不同的歸納方法進行總結,同時也整合了專欄之前已經介紹過的《nlp中的詞向量對比》和《nlp中的預訓練語言模型總結》兩篇文章,以QA形式對PTMs進行全面總結歸納。獲取總結圖片下載以及單模型精讀請到 github:NLP預訓練模型的全面總結,希望為大家的學習工作提供一些幫助。
  • QizNLP使用(一):利用Transformer訓練單輪閒聊機器人
    ,提供NLP多種任務(分類、匹配、序列標註、生成等)代碼模板,包括數據處理、模型訓練、部署推斷的全流程,同時內置一些常見模型提供調用,並支持基於horovod的數據並行式分布訓練。本文將介紹在QizNLP框架中如何利用經典的Transformer模型訓練一個閒聊機器人。(想看效果可直接翻到文末截圖)訓練數據訓練數據採用清華組發布的LCCC閒聊語料(github地址),該語料包括base&large版本,其中base版本使用了更嚴格的過濾規則,所以更乾淨,故本次實驗採用base版本。
  • NLP神器 spacy 入門教程
    你可以使用以下代碼找出活動的管道組件:nlp.pipe_names輸出:['tagger','parser','ner']如果您希望禁用管道組件並僅保持ner的運行,則可以使用下面的代碼禁用管道組件例如,可以使用以下代碼行禁用管道的多個組件:nlp.disable_pipes('tagger', 'parser')spaCy實戰現在,讓我們練手。在本節中,你將學習使用spaCy執行各種NLP任務。
  • 8種優秀預訓練模型大盤點,NLP應用so easy!
    如果你是NLP愛好者,那麼一定會喜歡現在這部分,讓我們深入研究5個最先進的多用途NLP模型框架。這裡我提供了每種模型的研究論文和預訓練模型的連結,來探索一下吧!「通用」一詞在這裡非常貼切 - 該框架幾乎可以應用於任何NLP任務。
  • 復旦邱錫鵬教授:2020最新NLP預訓練模型綜述
    該綜述系統地介紹了nlp中的預訓練模型。主要的貢獻包括:1、深入盤點了目前主流的預訓練模型,如word2vec,ELMo,BERT等。2、提出了一種預訓練模型的分類體系,通過四種分類維度來劃分目前已有的預訓練模型。
  • 使用NLP和ML來提取和構造Web數據
    SPACY庫初始化NLP對象nlp = spacy.load("en_core_web_sm")提取href我們將從ISW的生產庫中提取文檔。本教程並不打算全面介紹NLP—對於這樣的資源,請查看:https://medium.com/@ODSC/an-introduction-to-natural-language-processing-nlp-8e476d9f5f59從外部API獲取坐標為了找到地名的坐標,我們將使用 「Open Cage API」
  • 復旦大學邱錫鵬教授:NLP預訓練模型綜述
    3.1.1 語言模型 (LM)作為 NLP 中最常見的無監督任務,LM 一般指自回歸 LM (auto-regressive LM) 或者單向 LM (unidirectional LM)。具體訓練過程是基於一個大的語料,通過最大似然估計 (MLE) 訓練計算一個句子出現的概率。
  • Python 異步任務框架Celery 使用總結
    Celery 用消息通信,通常使用中間人(Broker)在客戶端和職程間斡旋。這個過程從客戶端向隊列添加消息開始,之後中間人把消息派送給職程,一般我們可以使用RabbitMQ或redis ,官方推薦使用RabbitMQ,而處理結果我們可以使用redis。消息隊列的輸入是工作的一個單元,稱為任務,獨立的職程(Worker)進程持續監視隊列中是否有需要處理的新任務。
  • 谷歌開源NLP模型可視化工具LIT,模型訓練不再「黑箱」
    並且它具備高度可擴展性,可通過聲明式、框架無關的 API 進行擴展。可以針對新穎的工作流程進行重新配置,並且這些組件是獨立的,可移植的,且易於實現。LIT 位於一個單頁 web 應用中,由多個工具欄和包含多個獨立模塊的主體部分組成。如果模塊適用於當前模型和數據集,它們將自動顯示。例如,顯示分類結果的模塊僅在模型返回 MulticlassPreds 時顯示。
  • 【學習】18個常見事務公文寫作基本框架大全
    調查報告的基本內容是:反映問題現狀、陳述事件經過、分析問題或事件、做法的影響、危害、作用、意義,總結經驗教訓,提出對策建議。  【基本框架】 是什麼——為什麼——怎麼辦;調查背景——調查方式——調查內容——調查結果——應對之策;調查背景——存在問題——解決對策。
  • 支持 53 種語言預訓練模型,斯坦福發布全新 NLP 工具包 StanfordNLP
    StanfordNLP 的相關論文、安裝、使用以及設置方法。StanfordNLP 用高度準確的神經網絡構建而成,允許使用自己的標註數據進行高效訓練和評估。這些模塊基於 PyTorch 構建。推薦使用 Python 3.6.8 及之後版本和 Python 3.7.2 及之後版本。StanfordNLP 還提供多語言 demo 腳本,展示了如何在非英語語言中使用 StanfordNLP,如繁體中文。
  • 支持53種語言預訓練模型,斯坦福發布全新NLP工具包StanfordNLP
    StanfordNLP 的相關論文、安裝、使用以及設置方法。StanfordNLP 用高度準確的神經網絡構建而成,允許使用自己的標註數據進行高效訓練和評估。這些模塊基於 PyTorch 構建。推薦使用 Python 3.6.8 及之後版本和 Python 3.7.2 及之後版本。StanfordNLP 還提供多語言 demo 腳本,展示了如何在非英語語言中使用 StanfordNLP,如繁體中文。
  • Linux下幾種常見的反彈shell方式的總結
    常見四種方式linux命令反彈shellpython反彈nc反彈shellphp反彈shell‍‍‍‍‍‍‍‍‍‍‍‍bash一句話命令詳解以下針對常用的bash今天我也向大佬學習學習總結總結,不足之處還望多多包含。
  • Rasa 聊天機器人框架使用
    一、RasaRasa是一個開源機器學習框架,用於構建上下文AI助手和聊天機器人。
  • 「黑科技」 VirtualXposed - 無需 Root 直接使用 Xposed 框架的虛擬工具
    >了,它能讓你使用各種「模塊」,像外掛一樣去修改系統或 APP 來獲得不同的新功能特性。不過,隨著黑科技般的 VirtualXposed 出現,大家終於可以免 Root 權限直接使用 Xposed 框架了……虛擬黑科技免 Root 玩轉 Xposed 框架VirtualXposed (簡稱 VXP) 的出現,給很多想玩 Xposed 框架但又不想刷機或 Root 手機的朋友帶來了希望
  • Spring框架快速入門第一篇
    ORM框架6Spring WEB web模塊建立與應用上下文之間,提供了web開發的基礎集成特性7Spring MVC是一個全功能的構建Web應用程式的MVC實現Spring 框架的功能可以用在任何J2EE伺服器中,大多數功能也適用於不受管理的環境。
  • 使用Transformers進行NLP的數據增廣的4種常用方法
    自然語言處理(NLP)項目面臨的最常見問題之一是缺乏數據的標記。標記數據是昂貴並且耗時的。數據增廣技術通過對數據進行擴充,加大訓練的數據量來防止過擬合和使模型更健壯,幫助我們建立更好的模型。在這篇文章中,我將介紹我們如何使用Transformers庫和預訓練模型,如BERT, GPT-2, T5等,以輕鬆地增加我們的文本數據。
  • Keras使用總結(1)—Keras概述與常見問題整理
    Keras英文文檔:keras.io/#               Keras中文文檔:keras.io/zh/1、機器學習和深度學習的總結
  • 使用Axure設計中,大型的後臺系統原型總結
    本人結合自己實際的多個後臺系統項目經歷以及使用Axure的經驗技巧,從方便維護和便於復用等角度出發,總結出了這篇關於後臺系統原型設計的分享內容,希望能幫助到一些有需要的朋友們。1. 確定框架結構和布局方案在正式開始設計一套後臺系統原型之前,我們需要先確定它的框架結構。