diff --git a/doc/tutorials/semantic_role_labeling/semantic_role_labeling_cn.md b/doc/tutorials/semantic_role_labeling/semantic_role_labeling_cn.md new file mode 100644 index 0000000000000000000000000000000000000000..f3c855a9fd72b894ab69050b08c750fe9e4aa1a2 --- /dev/null +++ b/doc/tutorials/semantic_role_labeling/semantic_role_labeling_cn.md @@ -0,0 +1,201 @@ +# è¯ä¹‰è§’è‰²æ ‡æ³¨æ•™ç¨‹ # + +è¯ä¹‰è§’è‰²æ ‡æ³¨ï¼ˆSemantic role labeling, SRL)是浅è¯ä¹‰è§£æžçš„一ç§å½¢å¼ï¼Œå…¶ç›®çš„是在给定的输入å¥åä¸å‘现æ¯ä¸ªè°“è¯çš„è°“è¯å‚数结构。 SRL作为很多自然è¯è¨€å¤„ç†ä»»åŠ¡ä¸çš„ä¸é—´æ¥éª¤æ˜¯å¾ˆæœ‰ç”¨çš„,如信æ¯æå–ã€æ–‡æ¡£è‡ªåŠ¨åˆ†ç±»å’Œé—®ç”。 实例如下 [1]: + + [ <sub>A0</sub> ä»– ] [ <sub>AM-MOD</sub> å°† ][ <sub>AM-NEG</sub> ä¸ä¼š ] [ <sub>V</sub> 接å—] [ <sub>A1</sub> 任何东西 ] 从 [<sub>A2</sub> é‚£äº›ä»–å†™çš„ä¸œè¥¿ä¸ ]。 + +- V: åŠ¨è¯ +- A0: 接å—者 +- A1: 接å—的东西 +- A2: ä»Žâ€¦â€¦æŽ¥å— +- A3: 属性 +- AM-MOD: 情æ€åŠ¨è¯ +- AM-NEG: å¦å®š + +给定动è¯â€œæŽ¥å—â€ï¼Œå¥åä¸çš„大部分将会扮演æŸäº›è¯ä¹‰è§’è‰²ã€‚è¿™é‡Œï¼Œæ ‡ç¾æ–¹æ¡ˆæ¥è‡ª Penn Proposition Bank。 + +到目å‰ä¸ºæ¢ï¼Œå¤§å¤šæ•°æˆåŠŸçš„SRL系统是建立在æŸç§å½¢å¼çš„解æžç»“果之上的,其ä¸åœ¨è¯æ³•ç»“构上使用了预先定义的特å¾æ¨¡æ¿ã€‚ 本教程将介ç»ä½¿ç”¨æ·±åº¦åŒå‘é•¿çŸæœŸè®°å¿†ï¼ˆDB-LSTM)模型[2]的端到端系统æ¥è§£å†³SRL任务,这在很大程度上优于先å‰çš„最先进的系统。 这个系统将SRL任务视为åºåˆ—æ ‡è®°é—®é¢˜ã€‚ + +## æ•°æ®æè¿° +相关论文[2]采用 CoNLL-2005&2012 共享任务ä¸è®¾ç½®çš„æ•°æ®è¿›è¡Œè®ç»ƒå’Œæµ‹è¯•ã€‚æ ¹æ®æ•°æ®è®¸å¯è¯ï¼Œæ¼”示采用 CoNLL-2005 的测试数æ®é›†ï¼Œå¯ä»¥åœ¨ç½‘站上找到。 + +用户åªéœ€æ‰§è¡Œä»¥ä¸‹å‘½ä»¤å°±å¯ä»¥ä¸‹è½½å¹¶å¤„ç†åŽŸå§‹æ•°æ®ï¼š + +```bash +cd data +./get_data.sh +``` +`data `ç›®å½•ä¼šå‡ºçŽ°å¦‚ä¸‹å‡ ä¸ªæ–°çš„æ–‡ä»¶ï¼š +```bash +conll05st-release:the test data set of CoNll-2005 shared task +test.wsj.words:the Wall Street Journal data sentences +test.wsj.props: the propositional arguments +feature: the extracted features from data set +``` + +## è®ç»ƒ +### DB-LSTM +请å‚阅情绪分æžçš„演示以了解有关长期çŸæœŸè®°å¿†å•å…ƒçš„更多信æ¯ã€‚ + +与在 Sentiment Analysis 演示ä¸ä½¿ç”¨çš„ Bidirectional-LSTM ä¸åŒï¼ŒDB-LSTM 采用å¦ä¸€ç§æ–¹æ³•æ¥å †å LSTMå±‚ã€‚é¦–å…ˆï¼Œæ ‡å‡†LSTM以æ£å‘处ç†è¯¥åºåˆ—。该 LSTM 层的输入和输出作为下一个 LSTM 层的输入,并被åå‘处ç†ã€‚è¿™ä¸¤ä¸ªæ ‡å‡† LSTM 层组æˆä¸€å¯¹ LSTM。然åŽæˆ‘ä»¬å †å 一对对的 LSTM 层åŽå¾—到深度 LSTM 模型。 + +下图展示了时间扩展的2层 DB-LSTM 网络。 +<center> +![pic](./network_arch.png) +</center> + +### ç‰¹å¾ +两个输入特性在这个管é“ä¸èµ·ç€è‡³å…³é‡è¦çš„作用:predicate(pred)和argument(arguments)。 还采用了两个其他特å¾ï¼šè°“è¯ä¸Šä¸‹æ–‡ï¼ˆctx-pï¼‰å’ŒåŒºåŸŸæ ‡è®°ï¼ˆmr)。 å› ä¸ºå•ä¸ªè°“è¯ä¸èƒ½ç²¾ç¡®åœ°æè¿°è°“è¯ä¿¡æ¯ï¼Œç‰¹åˆ«æ˜¯å½“相åŒçš„è¯åœ¨å¥åä¸å‡ºçŽ°å¤šäºŽä¸€æ¬¡æ—¶ã€‚ 使用谓è¯ä¸Šä¸‹æ–‡ï¼Œå¯ä»¥åœ¨å¾ˆå¤§ç¨‹åº¦ä¸Šæ¶ˆé™¤æ§ä¹‰ã€‚类似地,如果它ä½äºŽè°“è¯ä¸Šä¸‹æ–‡åŒºåŸŸä¸ï¼Œåˆ™ä½¿ç”¨åŒºåŸŸæ ‡è®° m<sub>r</sub> = 1 æ¥è¡¨ç¤ºå‚æ•°ä½ç½®ï¼Œå之则 m<sub>r</sub> = 0。这四个简å•çš„特å¾æ˜¯æˆ‘们的SRL系统所需è¦çš„。上下文大å°è®¾ç½®ä¸º1çš„ä¸€ä¸ªæ ·æœ¬çš„ç‰¹å¾å¦‚下[2]所示: +<center> +![pic](./feature.jpg) +</center> + +在这个示例ä¸ï¼Œç›¸åº”çš„æ ‡è®°å¥å是: + +[ <sub>A1</sub> A record date ] has [ <sub>AM-NEG</sub> n't ] been [ <sub>V</sub> set ] . + +在演示ä¸, 我们采用上é¢çš„特å¾æ¨¡æ¿, 包括: `argument`, `predicate`, `ctx-p (p=-1,0,1)`, `mark` 并使用 `B/I/O` 方案æ¥æ ‡è®°æ¯ä¸ªå‚数。这些特å¾å’Œæ ‡ç¾å˜å‚¨åœ¨ `feature` 文件ä¸, 用`\t`分割。 + +### æ•°æ®æä¾› + +`dataprovider.py` 是一个包装数æ®çš„ Python 文件。 函数 `hook()` 定义了网络的数æ®æ§½ã€‚å…个特å¾å’Œæ ‡ç¾éƒ½æ˜¯ç´¢å¼•æ§½ã€‚ +``` +def hook(settings, word_dict, label_dict, **kwargs): + settings.word_dict = word_dict + settings.label_dict = label_dict + #all inputs are integral and sequential type + settings.slots = [ + integer_value_sequence(len(word_dict)), + integer_value_sequence(len(predicate_dict)), + integer_value_sequence(len(word_dict)), + integer_value_sequence(len(word_dict)), + integer_value_sequence(len(word_dict)), + integer_value_sequence(len(word_dict)), + integer_value_sequence(len(word_dict)), + integer_value_sequence(2), + integer_value_sequence(len(label_dict))] +``` +相应的数æ®è¿ä»£å™¨å¦‚下: +``` +@provider(init_hook=hook, should_shuffle=True, calc_batch_size=get_batch_size, + can_over_batch_size=False, cache=CacheType.CACHE_PASS_IN_MEM) +def process(settings, file_name): + with open(file_name, 'r') as fdata: + for line in fdata: + sentence, predicate, ctx_n2, ctx_n1, ctx_0, ctx_p1, ctx_p2, mark, label = \ + line.strip().split('\t') + + words = sentence.split() + sen_len = len(words) + word_slot = [settings.word_dict.get(w, UNK_IDX) for w in words] + + predicate_slot = [settings.predicate_dict.get(predicate)] * sen_len + ctx_n2_slot = [settings.word_dict.get(ctx_n2, UNK_IDX)] * sen_len + ctx_n1_slot = [settings.word_dict.get(ctx_n1, UNK_IDX)] * sen_len + ctx_0_slot = [settings.word_dict.get(ctx_0, UNK_IDX)] * sen_len + ctx_p1_slot = [settings.word_dict.get(ctx_p1, UNK_IDX)] * sen_len + ctx_p2_slot = [settings.word_dict.get(ctx_p2, UNK_IDX)] * sen_len + + marks = mark.split() + mark_slot = [int(w) for w in marks] + + label_list = label.split() + label_slot = [settings.label_dict.get(w) for w in label_list] + yield word_slot, predicate_slot, ctx_n2_slot, ctx_n1_slot, \ + ctx_0_slot, ctx_p1_slot, ctx_p2_slot, mark_slot, label_slot +``` +函数 `process` 产出有8个特å¾å’Œæ ‡ç¾çš„9个表。 + +### 神ç»ç½‘络é…ç½® + +`db_lstm.py` 是在è®ç»ƒè¿‡ç¨‹ä¸åŠ è½½å—典并定义数æ®æ供程åºæ¨¡å—和网络架构的神ç»ç½‘络é…置文件。 + +ä¹ä¸ª `data_layer` 从数æ®æ供程åºåŠ 载实例。八个特å¾åˆ†åˆ«è½¬æ¢ä¸ºåµŒå…¥ï¼Œå¹¶ç”±`mixed_layer`æ··åˆã€‚ 深度åŒå‘LSTM层æå–softmax层的特å¾ã€‚ç›®æ ‡å‡½æ•°æ˜¯æ ‡ç¾çš„交å‰ç†µã€‚ + +### è®ç»ƒ +è®ç»ƒçš„脚本是 `train.sh`,用户åªéœ€æ‰§è¡Œ: +```bash + ./train.sh +``` +`train.sh` ä¸çš„内容: +``` +paddle train \ + --config=./db_lstm.py \ + --use_gpu=0 \ + --log_period=5000 \ + --trainer_count=1 \ + --show_parameter_stats_period=5000 \ + --save_dir=./output \ + --num_passes=10000 \ + --average_test_period=10000000 \ + --init_model_path=./data \ + --load_missing_parameter_strategy=rand \ + --test_all_data_in_one_period=1 \ +2>&1 | tee 'train.log' +``` + +- \--config=./db_lstm.py : 网络é…置文件 +- \--use_gpu=false: 使用 CPU è®ç»ƒï¼ˆå¦‚果已安装 PaddlePaddle GPU版本并想使用 GPU è®ç»ƒå¯ä»¥è®¾ç½®ä¸ºtrueï¼Œç›®å‰ crf_layer ä¸æ”¯æŒ GPU) +- \--log_period=500: æ¯20批(batch)输出日志 +- \--trainer_count=1: 设置线程数(或 GPU 数) +- \--show_parameter_stats_period=5000: æ¯100批显示å‚数统计 +- \--save_dir=./output: 模型输出路径 +- \--num_passes=10000: 设置通过数,一次通过æ„味ç€PaddlePaddleè®ç»ƒæ•°æ®é›†ä¸çš„æ‰€æœ‰æ ·æœ¬ä¸€æ¬¡ +- \--average_test_period=10000000: æ¯ä¸ª average_test_period 批次对平å‡å‚数进行测试 +- \--init_model_path=./data: å‚æ•°åˆå§‹åŒ–路径 +- \--load_missing_parameter_strategy=rand: éšæœºåˆå§‹ä¸å˜åœ¨çš„å‚æ•° +- \--test_all_data_in_one_period=1: åœ¨ä¸€ä¸ªå‘¨æœŸå†…æµ‹è¯•æ‰€æœ‰æ•°æ® + + +è®ç»ƒåŽï¼Œæ¨¡åž‹å°†ä¿å˜åœ¨ç›®å½•`output`ä¸ã€‚ 我们的è®ç»ƒæ›²çº¿å¦‚下: +<center> +![pic](./curve.jpg) +</center> + +### 测试 +测试脚本是 `test.sh`, 执行: +```bash + ./test.sh +``` +`tesh.sh` 的主è¦éƒ¨åˆ†ï¼š +``` +paddle train \ + --config=./db_lstm.py \ + --model_list=$model_list \ + --job=test \ + --config_args=is_test=1 \ +``` + + - \--config=./db_lstm.py: 网络é…置文件 + - \--model_list=$model_list.list: 模型列表文件 + - \--job=test: 指示测试任务 + - \--config_args=is_test=1: æŒ‡ç¤ºæµ‹è¯•ä»»åŠ¡çš„æ ‡è®° + - \--test_all_data_in_one_period=1: åœ¨ä¸€ä¸ªå‘¨æœŸå†…æµ‹è¯•æ‰€æœ‰æ•°æ® + + +### 预测 +预测脚本是 `predict.sh`,用户åªéœ€æ‰§è¡Œï¼š +```bash + ./predict.sh + +``` +在`predict.sh`ä¸ï¼Œç”¨æˆ·åº”该æ供网络é…ç½®æ–‡ä»¶ï¼Œæ¨¡åž‹è·¯å¾„ï¼Œæ ‡ç¾æ–‡ä»¶ï¼Œå—典文件,特å¾æ–‡ä»¶ã€‚ +``` +python predict.py + -c $config_file \ + -w $best_model_path \ + -l $label_file \ + -p $predicate_dict_file \ + -d $dict_file \ + -i $input_file \ + -o $output_file +``` + +`predict.py` 是主è¦çš„å¯æ‰§è¡Œpython脚本,其ä¸åŒ…æ‹¬å‡½æ•°ï¼šåŠ è½½æ¨¡åž‹ï¼ŒåŠ è½½æ•°æ®ï¼Œæ•°æ®é¢„æµ‹ã€‚ç½‘ç»œæ¨¡åž‹å°†è¾“å‡ºæ ‡ç¾çš„概率分布。 在演示ä¸ï¼Œæˆ‘ä»¬ä½¿ç”¨æœ€å¤§æ¦‚çŽ‡çš„æ ‡ç¾ä½œä¸ºç»“果。用户还å¯ä»¥æ ¹æ®æ¦‚率分布矩阵实现集æŸæœç´¢æˆ–维特比解ç 。 + +预测åŽï¼Œç»“æžœä¿å˜åœ¨ `predict.res` ä¸ã€‚ + +## 引用 +[1] Martha Palmer, Dan Gildea, and Paul Kingsbury. The Proposition Bank: An Annotated Corpus of Semantic Roles , Computational Linguistics, 31(1), 2005. + +[2] Zhou, Jie, and Wei Xu. "End-to-end learning of semantic role labeling using recurrent neural networks." Proceedings of the Annual Meeting of the Association for Computational Linguistics. 2015.