如何在SyntaxNet依存分析输出中保留待解析语句及标记未解析语句?
解决SyntaxNet批量解析的两个问题
嘿,我刚好在项目里折腾过SyntaxNet的批量解析,这俩问题我都踩过坑,给你分享下实用的解决方案:
问题1:在依存分析输出中打印待解析语句
要让每个解析结果前都带上原语句,有两种简单的方式:
方式一:修改demo.sh脚本(最稳妥)
直接修改官方的demo.sh,让它在处理每个句子前先打印原句。找到脚本里处理输入的核心逻辑(一般是调用parser_eval的部分),替换成循环读取每行并输出原句:
# 替换原demo.sh中的stdin处理逻辑 while read -r line; do # 打印带分隔符的原句,方便区分 echo "==== 原语句 ====" echo "$line" echo "==== 解析结果 ====" # 调用SyntaxNet解析器 echo "$line" | syntaxnet/models/parsey_universal/parser_eval \ --model_path=syntaxnet/models/parsey_universal/en \ --task_context=syntaxnet/models/parsey_universal/context.pbtxt \ --input=stdin --output=stdout echo "" # 空行分隔不同句子的结果 done
修改后,直接用cat filename.txt | ./demo.sh > output.txt就能得到带原句的输出。
方式二:用管道工具快速实现(无需改脚本)
如果不想动原脚本,可以用awk把输入句子和解析结果绑定:
cat filename.txt | awk '{printf "### 待解析语句: %s\n", $0; system("echo \"" $0 "\" | ./demo.sh")}' > output.txt
⚠️ 注意:如果句子里包含双引号,这个命令会出错,此时优先用方式一。
问题2:追踪未解析语句,维持输入顺序
批量解析时,有些句子(比如空行、含特殊字符的句子)会被SyntaxNet跳过,导致输出顺序和输入不一致。我们可以写一个简单的批量处理脚本,给每个句子加行号标记,不管解析成功与否都记录下来:
步骤1:创建批量解析脚本parse_batch.sh
#!/bin/bash # 用法:./parse_batch.sh 输入文件名 输出文件名 if [ $# -ne 2 ]; then echo "用法错误:./parse_batch.sh <输入文件> <输出文件>" exit 1 fi INPUT_FILE="$1" OUTPUT_FILE="$2" line_num=1 # 逐行处理输入 while read -r sentence; do # 处理空行 if [[ -z "$sentence" ]]; then echo "[$line_num] 空行,跳过解析" >> "$OUTPUT_FILE" line_num=$((line_num+1)) continue fi # 捕获解析输出(包含错误信息) parse_result=$(echo "$sentence" | ./demo.sh 2>&1) # 判断是否解析成功(通过检查输出是否包含依存分析的数字行) if [[ -z "$parse_result" || ! "$parse_result" =~ ^[0-9]+\s+ ]]; then echo "[$line_num] ❌ 未解析成功 - 原句: $sentence" >> "$OUTPUT_FILE" else echo "[$line_num] ✅ 原句: $sentence" >> "$OUTPUT_FILE" echo "$parse_result" >> "$OUTPUT_FILE" echo "---" >> "$OUTPUT_FILE" # 分隔符 fi line_num=$((line_num+1)) done < "$INPUT_FILE"
步骤2:运行脚本
给脚本加执行权限,然后运行:
chmod +x parse_batch.sh ./parse_batch.sh filename.txt output.txt
这样输出文件里会按输入顺序记录每个句子的状态:成功的会带解析结果,失败的会标记❌ 未解析成功,完全不会乱序。
内容的提问来源于stack exchange,提问作者Mayla
相关产品推荐
相关产品推荐

