Commit 563c6999 by 张韩昊帝

Initial commit

parents
# Instruction
We have built a Chinese GEC evaluation tool, ChERRANT (Chinese ERRANT), following the mainstream English GEC evaluation tool [ERRANT](https://github.com/chrisjbryant/errant). The main function of ChERRANT is to calculate the Precision, Recall and F-value of prediction results by comparing hypothesis edits and golden edits, thereby evaluating the performance of GEC model.
## Environment
`requirements.txt` contains the main environment required for the experiment. The specific environment construction process is as follows:
```
conda create -n cherrant python==3.8
conda activate cherrant
pip install -r requirements.txt
```
## Usage
### Overview
#### File Format
The format of the hypothesis file is: `id \t Original sentence \t Forecast results `;
The format of the reference file is: `id \t Original sentence \t Standard answer 1 \t Standard answer 2 \t ... `;
The format of the edit file is M2, as follows:
```
S 冬 阴 功 是 泰 国 最 著 名 的 菜 之 一 , 它 虽 然 不 是 很 豪 华 , 但 它 的 味 确 实 让 人 上 瘾 , 做 法 也 不 难 、 不 复 杂 。
T0-A0 冬 阴 功 是 泰 国 最 著 名 的 菜 之 一 , 它 虽 然 不 是 很 豪 华 , 但 它 的 味 道 确 实 让 人 上 瘾 , 做 法 也 不 难 、 不 复 杂 。
A 27 27|||M|||道|||REQUIRED|||-NONE-|||0
```
+ `S` represents the original sentence;
+ `T0-A0` represents the 0th edit sequence of the 0th answer (a sentence may have multiple answers, and an answer may also have multiple edit sequences with the same minimal edit distance);
+ `A` represents edits, mainly including the following information: The start and end positions of errors (`27 27`); Error type (`M`, Missing Error); Modification method of errors (`道`, i.e., insert "道"); Annotator ID (`0`);
#### Evaluation Process
The main evaluation steps are as follows:
1. Converting parallel reference file to edit file `gold.m2` through `parallel_to_m2.py` (it is only necessary for the first evaluation and can be reused later);
2. Converting parallel hypothesis file to edit file `hyp.m2` through `parallel_to_m2.py`;
3. Comparing `gold.m2` and `hyp.m2` using `compare_m2_for_evaluation.py` to get the final evaluation results;
For example scripts of the complete process, please refer to `./demo.sh`.
### Extract Edit
First, merging the input file (one sentence per line) and the output file (one sentence per line) into the parallel format:
```
INPUT_FILE=./samples/demo.input
OUTPUT_FILE=./samples/demo.hyp
HYP_PARA_FILE=./samples/demo.hyp.para
paste $INPUT_FILE $OUTPUT_FILE | awk '{print NR"\t"$p}' > $HYP_PARA_FILE
```
Then, extracting the edits with the following command:
```
HYP_M2_FILE=./samples/demo.hyp.m2.char
python parallel_to_m2.py -f $HYP_PARA_FILE -o $HYP_M2_FILE -g char
```
By default, char-level edits are extracted.
By setting the `-g' parameter to 'word', you can extract word-level edits.
For more functions, please refer to the command line help file:
```
python parallel_to_m2.py --help
```
### Calculate Evaluation
Use the following script to compare the hypothesis edit file with the reference edit file to get the char-level evaluation metrics:
```
REF_M2_FILE=./samples/demo.ref.m2.char
python compare_m2_for_evaluation.py -hyp $HYP_M2_FILE -ref $REF_M2_FILE
```
The F0.5 value at the char-level is the official evaluation metric adopted by the MuCGEC dataset, and the evaluation results are as follows:
```
=========== Span-Based Correction ============
TP FP FN Prec Rec F0.5
8 19 35 0.2963 0.186 0.2649
==============================================
```
This program can also support more fine-grained information displays, such as displaying detection indicators and correction indicators of different types of errors.
For more functions, please refer to the command line help file:
```
python compare_m2_for_evaluation.py --help
```
## Citation
If you find this work is useful for your research, please cite our paper:
#### MuCGEC: a Multi-Reference Multi-Source Evaluation Dataset for Chinese Grammatical Error Correction (Accepted by NAACL2022 main conference) [[PDF]](https://arxiv.org/pdf/2204.10994.pdf)
```
@inproceedings{zhang-etal-2022-mucgec,
title = "{MuCGEC}: a Multi-Reference Multi-Source Evaluation Dataset for Chinese Grammatical Error Correction",
author = "Zhang, Yue and Li, Zhenghua and Bao, Zuyi and Li, Jiacheng and Zhang, Bo and Li, Chen and Huang, Fei and Zhang, Min",
booktitle = "Proceedings of NAACL-HLT",
year = "2022",
address = "Online",
publisher = "Association for Computational Linguistics"
```
# 使用说明
我们借鉴了英文上主流的GEC评估工具[ERRANT](https://github.com/chrisjbryant/errant),搭建了中文GEC评估工具ChERRANT(Chinese ERRANT)。ChERRANT的主要功能是通过对比预测编辑和标准编辑,计算预测结果的精确度、召回度、F值指标,从而评估语法纠错模型的性能。
## 环境
`requirements.txt`包含了实验所需的主要环境,具体环境搭建流程如下所示:
```
conda create -n cherrant python==3.8
conda activate cherrant
pip install -r requirements.txt
```
## 使用方式
### 总览
#### 文件格式
预测文件格式为:`id \t 原句 \t 预测结果 `
标准答案文件格式为:`id \t 原句 \t 标准答案1 \t 标准答案2 \t ... `
编辑文件格式采用M2格式,如下所示:
```
S 冬 阴 功 是 泰 国 最 著 名 的 菜 之 一 , 它 虽 然 不 是 很 豪 华 , 但 它 的 味 确 实 让 人 上 瘾 , 做 法 也 不 难 、 不 复 杂 。
T0-A0 冬 阴 功 是 泰 国 最 著 名 的 菜 之 一 , 它 虽 然 不 是 很 豪 华 , 但 它 的 味 道 确 实 让 人 上 瘾 , 做 法 也 不 难 、 不 复 杂 。
A 27 27|||M|||道|||REQUIRED|||-NONE-|||0
```
+ `S` 代表原句;
+ `T0-A0`代表第0个答案的第0个编辑序列(一个句子可能有多个答案,一个答案也可能有编辑距离相同的多个编辑序列);
+ `A `代表编辑,主要包括如下信息:错误的起始和结束位置(`27 27`);错误类型(`M`,Missing Error,缺失错误);错误的修改答案(`道`,即插入“道”);标注id(`0`);
#### 评估过程
主要的评估步骤为:
1. 将标准答案平行文件通过`parallel_to_m2.py`转换成M2格式的编辑文件`gold.m2`(仅首次评估需要,之后可以复用);
2. 将预测答案平行文件通过`parallel_to_m2.py`转换成M2格式的编辑文件`hyp.m2`
3. 使用`compare_m2_for_evaluation.py`对比`hyp.m2``gold.m2`,得到最终的评价指标。
完整流程的示例脚本可以参考`./demo.sh`
### 抽取编辑
首先,将输入文件(每行一句)和输出文件(每行一句)合并,处理成平行格式:
```
INPUT_FILE=./samples/demo.input
OUTPUT_FILE=./samples/demo.hyp
HYP_PARA_FILE=./samples/demo.hyp.para
paste $INPUT_FILE $OUTPUT_FILE | awk '{print NR"\t"$p}' > $HYP_PARA_FILE
```
然后,通过如下命令抽取编辑:
```
HYP_M2_FILE=./samples/demo.hyp.m2.char
python parallel_to_m2.py -f $HYP_PARA_FILE -o $HYP_M2_FILE -g char
```
默认抽取的是字级别编辑。
通过将`-g`参数设为`word`,则可以抽取词级别编辑。虽然词级别编辑标注了更多的错误类型信息,但可能会受到分词错误影响,因此仅供参考。更多设置请参考命令行帮助文件:
```
python parallel_to_m2.py --help
```
### 计算指标
使用如下脚本对比预测编辑文件和标准编辑文件,即可得到字级别的评测指标:
```
REF_M2_FILE=./samples/demo.ref.m2.char
python compare_m2_for_evaluation.py -hyp $HYP_M2_FILE -ref $REF_M2_FILE
```
字级别的F0.5指标是MuCGEC数据集采用的官方评测指标,评价结果如下所示:
```
=========== Span-Based Correction ============
TP FP FN Prec Rec F0.5
8 19 35 0.2963 0.186 0.2649
==============================================
```
该程序也可支持更细粒度的信息展示,如展示检测指标和不同类型错误的纠正指标,请参考命令行帮助信息使用。
```
python compare_m2_for_evaluation.py --help
```
## 引用
如果您使用了我们的评价程序,请引用我们的论文:
#### MuCGEC: a Multi-Reference Multi-Source Evaluation Dataset for Chinese Grammatical Error Correction (Accepted by NAACL2022 main conference) [[PDF]](https://arxiv.org/pdf/2204.10994.pdf)
```
@inproceedings{zhang-etal-2022-mucgec,
title = "{MuCGEC}: a Multi-Reference Multi-Source Evaluation Dataset for Chinese Grammatical Error Correction",
author = "Zhang, Yue and Li, Zhenghua and Bao, Zuyi and Li, Jiacheng and Zhang, Bo and Li, Chen and Huang, Fei and Zhang, Min",
booktitle = "Proceedings of NAACL-HLT",
year = "2022",
address = "Online",
publisher = "Association for Computational Linguistics"
```
from flask import Flask, request, jsonify, render_template
import subprocess
import os
import tempfile
import logging
from logging.handlers import RotatingFileHandler
app = Flask(__name__)
processing = False
# 日志配置
if not os.path.exists('logs'):
os.mkdir('logs')
file_handler = RotatingFileHandler('logs/app.log', maxBytes=10240, backupCount=10)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s'
))
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)
@app.route('/')
def home():
return render_template('index.html')
@app.route('/evaluate', methods=['POST'])
def evaluate():
global processing
app.logger.info(f'收到请求: {request.files}') # 添加日志
if processing:
return jsonify({'error': '正在处理其他文件,请等待'}), 400
if 'file' not in request.files:
app.logger.error('没有文件字段') # 添加日志
return jsonify({'error': '请选择文件'}), 400
file = request.files['file']
app.logger.info(f'文件名: {file.filename}') # 添加日志
try:
with tempfile.NamedTemporaryFile(delete=False, suffix='.csv') as temp_csv:
file.save(temp_csv.name)
# 执行处理脚本
subprocess.run(['python', 'convert_to_para.py', temp_csv.name, 'pred.para', 'gold.para'], check=True)
subprocess.run(['python', 'parallel_to_m2.py', '-f', 'gold.para', '-o', 'gold.m2', '-g', 'char'], check=True)
subprocess.run(['python', 'parallel_to_m2.py', '-f', 'pred.para', '-o', 'pred.m2', '-g', 'char'], check=True)
result = subprocess.run(
['python', 'compare_m2_for_evaluation.py', '-hyp', 'pred.m2', '-ref', 'gold.m2'],
capture_output=True,
text=True,
check=True
)
app.logger.info(f'文件处理完成: {file.filename}')
return jsonify({'result': result.stdout})
except subprocess.CalledProcessError as e:
error_msg = f'脚本执行错误: {str(e)}'
app.logger.error(error_msg)
return jsonify({'error': error_msg}), 500
except Exception as e:
error_msg = f'处理错误: {str(e)}'
app.logger.error(error_msg)
return jsonify({'error': error_msg}), 500
finally:
processing = False
cleanup_files(temp_csv.name)
def cleanup_files(temp_csv):
os.unlink(temp_csv)
for f in ['pred.para', 'gold.para', 'pred.m2', 'gold.m2']:
if os.path.exists(f):
os.remove(f)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
\ No newline at end of file
import pandas as pd
import argparse
def convert_to_para(csv_path, pred_output, gold_output):
"""
将CSV转换为para格式文件
"""
# 读取CSV
df = pd.read_csv(csv_path)
# 生成预测para文件
with open(pred_output, 'w', encoding='utf-8') as f:
for idx, row in df.iterrows():
line = f"{idx+1}\t{row['错误内容']}\t{row['语法结果']}\n"
f.write(line)
# 生成金标para文件
with open(gold_output, 'w', encoding='utf-8') as f:
for idx, row in df.iterrows():
line = f"{idx+1}\t{row['错误内容']}\t{row['正确内容']}\n"
f.write(line)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='将CSV转换为para格式')
parser.add_argument('csv_file', help='输入的CSV文件路径')
parser.add_argument('pred_output', help='预测结果para文件输出路径')
parser.add_argument('gold_output', help='标准答案para文件输出路径')
args = parser.parse_args()
convert_to_para(args.csv_file, args.pred_output, args.gold_output)
# python convert_to_para.py /nfs/zhanghanhaodi/HHDZ_projects/full_book_evaluate/merged_data.csv pred.para gold.para
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
INPUT_FILE=./samples/demo.input
OUTPUT_FILE=./samples/demo.hyp
HYP_PARA_FILE=./samples/demo.hyp.para
HYP_M2_FILE=./samples/demo.hyp.m2.char
REF_M2_FILE=./samples/demo.ref.m2.char
# Step1. extract edits from hypothesis file.
paste $INPUT_FILE $OUTPUT_FILE | awk '{print NR"\t"$p}' > $HYP_PARA_FILE # only for single hypothesis situation
python parallel_to_m2.py -f $HYP_PARA_FILE -o $HYP_M2_FILE -g char # char-level evaluation
# Step2. compare hypothesis edits with reference edits.
python compare_m2_for_evaluation.py -hyp $HYP_M2_FILE -ref $REF_M2_FILE
# Note: you can also extract the reference edits yourself by using parallel_to_m2.py if you have reference sentences.
# You need to process the data into the following format: id \t source \t reference1 \t reference2 \t ... \n
# word-level evaluation
HYP_M2_FILE=./samples/demo.hyp.m2.word
REF_M2_FILE=./samples/demo.ref.m2.word
python parallel_to_m2.py -f $HYP_PARA_FILE -o $HYP_M2_FILE -g word
python compare_m2_for_evaluation.py -hyp $HYP_M2_FILE -ref $REF_M2_FILE
# Seq2Edit的三个模型,更换了3个随机种子
RESULT_FILE1=$1
RESULT_FILE2=$2
RESULT_FILE3=$3
# Seq2Seq的三个模型,更换了3个随机种子
RESULT_FILE4=$4
RESULT_FILE5=$5
RESULT_FILE6=$6
# for ((i=1; i<=6; i++))
# do
# THRESHOLD=$i
# RESULT_DIR=./ensemble_results/3seq2edit_3seq2seq_threshold_$THRESHOLD
# mkdir -p $RESULT_DIR
# M2_OUTPUT_FILE=$RESULT_DIR/MuCGEC_test.m2_temp
# OUTPUT_FILE=$RESULT_DIR/MuCGEC_test.output
# python edit_ensemble.py --result_path $RESULT_FILE1 $RESULT_FILE2 $RESULT_FILE3 $RESULT_FILE4 $RESULT_FILE5 $RESULT_FILE6 --output_path $M2_OUTPUT_FILE --threshold $THRESHOLD
# python m2convertor.py -f $M2_OUTPUT_FILE -o $OUTPUT_FILE
# done
THRESHOLD=4 # threshold 一般取 N/2+1,即当编辑出现次数大于等于该值时,才会保留
RESULT_DIR=./ensemble_results/3seq2edit_3seq2seq_threshold_$THRESHOLD
mkdir -p $RESULT_DIR
M2_OUTPUT_FILE=$RESULT_DIR/MuCGEC_test.m2_temp
OUTPUT_FILE=$RESULT_DIR/MuCGEC_test.output
python rule_ensemble.py --result_path $RESULT_FILE1 $RESULT_FILE2 $RESULT_FILE3 $RESULT_FILE4 $RESULT_FILE5 $RESULT_FILE6 --output_path $M2_OUTPUT_FILE --threshold $THRESHOLD
python m2convertor.py -f $M2_OUTPUT_FILE -o $OUTPUT_FILE
RESULT_DIR=$1
INPUT_FILE=../../data/test_data/MuCGEC/MuCGEC-ALL/MuCGEC_ALL_Test.input
OUTPUT_FILE=$RESULT_DIR"/MuCGEC_test.output"
NLPCC18_OFFICIAL_M2=../../data/test_data/NLPCC18-orig/NLPCC18-orig.m2.pkunlp # m2scorer, word-based
MuCGEC_ALL_M2=../../data/test_data/MuCGEC/MuCGEC-ALL/MuCGEC_ALL_Test.m2.char # ChERRANT, char-based
if [ ! -f $RESULT_DIR"/MuCGEC_test.pred.m2.char" ]; then
paste $INPUT_FILE $OUTPUT_FILE | awk '{print NR"\t"$p}' > $RESULT_DIR"/MuCGEC_test.pred.para"
CUDA_VISIBLE_DEVICES=0 python parallel_to_m2.py -f $RESULT_DIR"/MuCGEC_test.pred.para" -o $RESULT_DIR"/MuCGEC_test.pred.m2.char" -g char -s all
fi
if [ ! -f $RESULT_DIR"/MuCGEC_test.output.pku_tok" ]; then
head -n 2000 $OUTPUT_FILE | python ../../tools/segment/segment_pkunlp.py $RESULT_DIR"/MuCGEC_test.output.pku_tok"
fi
echo "****************NLPCC18-official-MaxMatch****************"
python2 ../m2scorer/scripts/m2scorer.py $RESULT_DIR"/MuCGEC_test.output.pku_tok" $NLPCC18_OFFICIAL_M2
echo "****************MuCGEC-NLPCC18-ChERRANT****************"
python compare_m2_for_evaluation.py -hyp $RESULT_DIR"/MuCGEC_test.pred.m2.char" -ref $MuCGEC_ALL_M2 --start 0 --end 2000
echo "****************MuCGEC-LANG8-ChERRANT****************"
python compare_m2_for_evaluation.py -hyp $RESULT_DIR"/MuCGEC_test.pred.m2.char" -ref $MuCGEC_ALL_M2 --start 2000 --end 4000
echo "****************MuCGEC-CGED-ChERRANT****************"
python compare_m2_for_evaluation.py -hyp $RESULT_DIR"/MuCGEC_test.pred.m2.char" -ref $MuCGEC_ALL_M2 --start 4000 --end 6000
echo "****************MuCGEC-ALL-ChERRANT****************"
python compare_m2_for_evaluation.py -hyp $RESULT_DIR"/MuCGEC_test.pred.m2.char" -ref $MuCGEC_ALL_M2
2025-01-23 09:17:00,650 INFO: 收到请求: ImmutableMultiDict([])
2025-01-23 09:17:00,651 ERROR: 没有文件字段
2025-01-23 09:20:20,230 INFO: 收到请求: ImmutableMultiDict([])
2025-01-23 09:20:20,230 ERROR: 没有文件字段
2025-01-23 09:20:58,935 INFO: 收到请求: ImmutableMultiDict([('file', <FileStorage: 'merged_data.csv' ('text/csv')>)])
2025-01-23 09:20:58,935 INFO: 文件名: merged_data.csv
2025-01-23 09:21:08,606 INFO: 文件处理完成: merged_data.csv
# -*- coding:UTF-8 -*-
# @Author: Xuezhi Fang
# @Date: 2020-06-19
# @Email: jasonfang3900@gmail.com
import argparse
import re
class M2Processor():
def __init__(self, src_sent, edit_lines):
self.src_sent = src_sent
self.edit_lines = edit_lines
self.edits = {}
self.trg_sents = []
def conv_edit(self, line):
line = line.strip().split("|||")
edit_span = line[0].split(" ")
edit_span = (int(edit_span[0]), int(edit_span[1]))
edit_res = line[2]
editor = line[-1]
if edit_span[0] == -1:
return None
if edit_span[0] == edit_span[1]:
edit_tag = "ADD"
elif edit_res == "-NONE-" or edit_res == "":
edit_tag = "DEL"
else:
edit_tag = "REP"
return editor, edit_tag, edit_span, edit_res
def get_edits(self):
for line in self.edit_lines:
if line:
edit_item = self.conv_edit(line)
if not edit_item:
continue
editor, edit_tag, edit_span, edit_res = edit_item
if editor not in self.edits:
self.edits[editor] = []
self.edits[editor].append({"span": edit_span, "op": edit_tag, "res": edit_res})
def get_para(self):
self.get_edits()
if self.edits:
for editor in self.edits:
sent = self.src_sent.split(" ")
for edit_item in self.edits[editor]:
edit_span, edit_tag, trg_tokens = edit_item["span"], edit_item["op"], edit_item["res"]
if edit_tag == "DEL":
sent[edit_span[0]:edit_span[1]] = [" " for _ in range(edit_span[1] - edit_span[0])]
else:
if edit_tag == "ADD":
if edit_span[0] != 0:
sent[edit_span[0]-1] += " " + trg_tokens
else:
sent[edit_span[0]] = trg_tokens + " " + sent[edit_span[0]]
elif edit_tag == "REP":
src_tokens_len = len(sent[edit_span[0]:edit_span[1]])
sent[edit_span[0]:edit_span[1]] = [trg_tokens] + [" " for _ in range(src_tokens_len-1)]
sent = " ".join(sent).strip()
res_sent = re.sub(" +", " ", sent)
self.trg_sents.append(res_sent)
return self.trg_sents
else:
return [self.src_sent]
def read_file():
src_sent = None
edit_lines = []
with open(args.f, "r", encoding="utf8") as fr:
for line in fr:
if line:
line = line.strip()
if line.startswith("S "):
src_sent = line.replace("S ", "", 1)
elif line.startswith("A "):
edit_lines.append(line.replace("A ", "", 1))
elif line == "":
yield src_sent, edit_lines
edit_lines.clear()
def main():
counter = 0
fw_trg = open(args.o, "w", encoding="utf8")
for src_sent, edit_lines in read_file():
counter += 1
m2_item = M2Processor(src_sent, edit_lines)
trg_sents = m2_item.get_para()
prefix_counter = 0
fw_trg.write(trg_sents[0]+"\n")
fw_trg.close()
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-f", help="m2 file")
parser.add_argument("-o", help="output file")
args = parser.parse_args()
main()
from typing import List, Tuple
from modules.alignment import read_cilin, read_confusion, Alignment
from modules.merger import Merger
from modules.classifier import Classifier
class Annotator:
def __init__(self,
align: Alignment,
merger: Merger,
classifier: Classifier,
granularity: str = "word",
strategy: str = "first"):
self.align = align
self.merger = merger
self.classifier = classifier
self.granularity = granularity
self.strategy = strategy
@classmethod
def create_default(cls, granularity: str = "word", strategy: str = "first"):
"""
Default parameters used in the paper
"""
semantic_dict, semantic_class = read_cilin()
confusion_dict = read_confusion()
align = Alignment(semantic_dict, confusion_dict, granularity)
merger = Merger(granularity)
classifier = Classifier(granularity)
return cls(align, merger, classifier, granularity, strategy)
def __call__(self,
src: List[Tuple],
tgt: List[Tuple],
annotator_id: int = 0,
verbose: bool = False):
"""
Align sentences and annotate them with error type information
"""
src_tokens = [x[0] for x in src]
tgt_tokens = [x[0] for x in tgt]
src_str = "".join(src_tokens)
tgt_str = "".join(tgt_tokens)
# convert to text form
annotations_out = ["S " + " ".join(src_tokens) + "\n"]
if tgt_str == "没有错误" or src_str == tgt_str: # Error Free Case
annotations_out.append(f"T{annotator_id} 没有错误\n")
cors = [tgt_str]
op, toks, inds = "noop", "-NONE-", (-1, -1)
a_str = f"A {inds[0]} {inds[1]}|||{op}|||{toks}|||REQUIRED|||-NONE-|||{annotator_id}\n"
annotations_out.append(a_str)
elif tgt_str == "无法标注": # Not Annotatable Case
annotations_out.append(f"T{annotator_id} 无法标注\n")
cors = [tgt_str]
op, toks, inds = "NA", "-NONE-", (-1, -1)
a_str = f"A {inds[0]} {inds[1]}|||{op}|||{toks}|||REQUIRED|||-NONE-|||{annotator_id}\n"
annotations_out.append(a_str)
else: # Other
align_objs = self.align(src, tgt)
edit_objs = []
align_idx = 0
if self.strategy == "first":
align_objs = align_objs[:1]
for align_obj in align_objs:
edits = self.merger(align_obj, src, tgt, verbose)
if edits not in edit_objs:
edit_objs.append(edits)
annotations_out.append(f"T{annotator_id}-A{align_idx} " + " ".join(tgt_tokens) + "\n")
align_idx += 1
cors = self.classifier(src, tgt, edits, verbose)
# annotations_out = []
for cor in cors:
op, toks, inds = cor.op, cor.toks, cor.inds
a_str = f"A {inds[0]} {inds[1]}|||{op}|||{toks}|||REQUIRED|||-NONE-|||{annotator_id}\n"
annotations_out.append(a_str)
annotations_out.append("\n")
return annotations_out, cors
from utils.char_smi import CharFuncs
from collections import namedtuple
from pypinyin import pinyin, Style
import os
Correction = namedtuple(
"Correction",
[
"op",
"toks",
"inds",
],
)
file_path = os.path.dirname(os.path.abspath(__file__))
char_smi = CharFuncs(os.path.join(file_path.replace("modules", ""), 'data/char_meta.txt'))
def check_spell_error(src_span: str,
tgt_span: str,
threshold: float = 0.8) -> bool:
if len(src_span) != len(tgt_span):
return False
src_chars = [ch for ch in src_span]
tgt_chars = [ch for ch in tgt_span]
if sorted(src_chars) == sorted(tgt_chars): # 词内部字符异位
return True
for src_char, tgt_char in zip(src_chars, tgt_chars):
if src_char != tgt_char:
if src_char not in char_smi.data or tgt_char not in char_smi.data:
return False
v_sim = char_smi.shape_similarity(src_char, tgt_char)
p_sim = char_smi.pronunciation_similarity(src_char, tgt_char)
if v_sim + p_sim < threshold and not (
set(pinyin(src_char, style=Style.NORMAL, heteronym=True)[0]) & set(pinyin(tgt_char, style=Style.NORMAL, heteronym=True)[0])):
return False
return True
class Classifier:
"""
错误类型分类器
"""
def __init__(self,
granularity: str = "word"):
self.granularity = granularity
@staticmethod
def get_pos_type(pos):
if pos in {"n", "nd"}:
return "NOUN"
if pos in {"nh", "ni", "nl", "ns", "nt", "nz"}:
return "NOUN-NE"
if pos in {"v"}:
return "VERB"
if pos in {"a", "b"}:
return "ADJ"
if pos in {"c"}:
return "CONJ"
if pos in {"r"}:
return "PRON"
if pos in {"d"}:
return "ADV"
if pos in {"u"}:
return "AUX"
# if pos in {"k"}: # TODO 后缀词比例太少,暂且分入其它
# return "SUFFIX"
if pos in {"m"}:
return "NUM"
if pos in {"p"}:
return "PREP"
if pos in {"q"}:
return "QUAN"
if pos in {"wp"}:
return "PUNCT"
return "OTHER"
def __call__(self,
src,
tgt,
edits,
verbose: bool = False):
"""
为编辑操作划分错误类型
:param src: 错误句子信息
:param tgt: 正确句子信息
:param edits: 编辑操作
:param verbose: 是否打印信息
:return: 划分完错误类型后的编辑操作
"""
results = []
src_tokens = [x[0] for x in src]
tgt_tokens = [x[0] for x in tgt]
for edit in edits:
error_type = edit[0]
src_span = " ".join(src_tokens[edit[1]: edit[2]])
tgt_span = " ".join(tgt_tokens[edit[3]: edit[4]])
# print(tgt_span)
cor = None
if error_type[0] == "T":
cor = Correction("W", tgt_span, (edit[1], edit[2]))
elif error_type[0] == "D":
if self.granularity == "word": # 词级别可以细分错误类型
if edit[2] - edit[1] > 1: # 词组冗余暂时分为OTHER
cor = Correction("R:OTHER", "-NONE-", (edit[1], edit[2]))
else:
pos = self.get_pos_type(src[edit[1]][1])
pos = "NOUN" if pos == "NOUN-NE" else pos
pos = "MC" if tgt_span == "[缺失成分]" else pos
cor = Correction("R:{:s}".format(pos), "-NONE-", (edit[1], edit[2]))
else: # 字级别可以只需要根据操作划分类型即可
cor = Correction("R", "-NONE-", (edit[1], edit[2]))
elif error_type[0] == "I":
if self.granularity == "word": # 词级别可以细分错误类型
if edit[4] - edit[3] > 1: # 词组丢失暂时分为OTHER
cor = Correction("M:OTHER", tgt_span, (edit[1], edit[2]))
else:
pos = self.get_pos_type(tgt[edit[3]][1])
pos = "NOUN" if pos == "NOUN-NE" else pos
pos = "MC" if tgt_span == "[缺失成分]" else pos
cor = Correction("M:{:s}".format(pos), tgt_span, (edit[1], edit[2]))
else: # 字级别可以只需要根据操作划分类型即可
cor = Correction("M", tgt_span, (edit[1], edit[2]))
elif error_type[0] == "S":
if self.granularity == "word": # 词级别可以细分错误类型
if check_spell_error(src_span.replace(" ", ""), tgt_span.replace(" ", "")):
cor = Correction("S:SPELL", tgt_span, (edit[1], edit[2]))
# Todo 暂且不单独区分命名实体拼写错误
# if edit[4] - edit[3] > 1:
# cor = Correction("S:SPELL:COMMON", tgt_span, (edit[1], edit[2]))
# else:
# pos = self.get_pos_type(tgt[edit[3]][1])
# if pos == "NOUN-NE": # 命名实体拼写有误
# cor = Correction("S:SPELL:NE", tgt_span, (edit[1], edit[2]))
# else: # 普通词语拼写有误
# cor = Correction("S:SPELL:COMMON", tgt_span, (edit[1], edit[2]))
else:
if edit[4] - edit[3] > 1: # 词组被替换暂时分为OTHER
cor = Correction("S:OTHER", tgt_span, (edit[1], edit[2]))
else:
pos = self.get_pos_type(tgt[edit[3]][1])
pos = "NOUN" if pos == "NOUN-NE" else pos
pos = "MC" if tgt_span == "[缺失成分]" else pos
cor = Correction("S:{:s}".format(pos), tgt_span, (edit[1], edit[2]))
else: # 字级别可以只需要根据操作划分类型即可
cor = Correction("S", tgt_span, (edit[1], edit[2]))
results.append(cor)
if verbose:
print("========== Corrections ==========")
for cor in results:
print("Type: {:s}, Position: {:d} -> {:d}, Target: {:s}".format(cor.op, cor.inds[0], cor.inds[1], cor.toks))
return results
# print(pinyin("朝", style=Style.NORMAL))
\ No newline at end of file
from ltp import LTP
from typing import List
from pypinyin import pinyin, Style, lazy_pinyin
import torch
import os
import functools
class Tokenizer:
"""
分词器
"""
def __init__(self,
granularity: str = "word",
device: str = "cpu",
segmented: bool = False,
bpe: bool = False,
) -> None:
"""
构造函数
:param mode: 分词模式,可选级别:字级别(char)、词级别(word)
"""
self.ltp = None
if granularity == "word":
self.ltp = LTP(device=torch.device(device) if torch.cuda.is_available() else torch.device("cpu"))
self.ltp.add_words(words=["[缺失成分]"], max_window=6)
self.segmented = segmented
self.granularity = granularity
if self.granularity == "word":
self.tokenizer = self.split_word
elif self.granularity == "char":
self.tokenizer = functools.partial(self.split_char, bpe=bpe)
else:
raise NotImplementedError
def __repr__(self) -> str:
return "{:s}\nMode:{:s}\n}".format(str(self.__class__.__name__), self.mode)
def __call__(self,
input_strings: List[str]
) -> List:
"""
分词函数
:param input_strings: 需要分词的字符串列表
:return: 分词后的结果列表,由元组组成,元组为(token,pos_tag,pinyin)的形式
"""
if not self.segmented:
input_strings = ["".join(s.split(" ")) for s in input_strings]
results = self.tokenizer(input_strings)
return results
def split_char(self, input_strings: List[str], bpe=False) -> List:
"""
分字函数
:param input_strings: 需要分字的字符串
:return: 分字结果
"""
if bpe:
from . import tokenization
project_dir = os.path.dirname(os.path.dirname(__file__))
tokenizer = tokenization.FullTokenizer(vocab_file=os.path.join(project_dir,"data","chinese_vocab.txt"), do_lower_case=False)
results = []
for input_string in input_strings:
if not self.segmented: # 如果没有被分字,就按照每个字符隔开(不考虑英文标点的特殊处理,也不考虑BPE),否则遵循原分字结果
segment_string = " ".join([char for char in input_string] if not bpe else tokenizer.tokenize(input_string))
else:
segment_string = input_string
# print(segment_string)
segment_string = segment_string.replace("[ 缺 失 成 分 ]", "[缺失成分]").split(" ") # 缺失成分当成一个单独的token
results.append([(char, "unk", pinyin(char, style=Style.NORMAL, heteronym=True)[0]) for char in segment_string])
return results
def split_word(self, input_strings: List[str]) -> List:
"""
分词函数
:param input_strings: 需要分词的字符串
:return: 分词结果
"""
if self.segmented:
seg, hidden = self.ltp.seg([input_string.split(" ") for input_string in input_strings], is_preseged=True)
else:
seg, hidden = self.ltp.seg(input_strings)
pos = self.ltp.pos(hidden)
result = []
for s, p in zip(seg, pos):
pinyin = [lazy_pinyin(word) for word in s]
result.append(list(zip(s, p, pinyin)))
return result
if __name__ == "__main__":
tokenizer = Tokenizer("word")
print(tokenizer(["LAC是个优秀的分词工具", "百度是一家高科技公司"]))
import os
from modules.annotator import Annotator
from modules.tokenizer import Tokenizer
import argparse
from collections import Counter
from tqdm import tqdm
# import torch
from collections import defaultdict
from multiprocessing import Pool
from opencc import OpenCC
os.environ["TOKENIZERS_PARALLELISM"] = "false"
annotator, sentence_to_tokenized = None, None
cc = OpenCC("t2s")
def annotate(line):
"""
:param line:
:return:
"""
sent_list = line.split("\t")[1:]
source = sent_list[0]
if args.segmented:
source = source.strip()
else:
source = "".join(source.strip().split())
output_str = ""
for idx, target in enumerate(sent_list[1:]):
try:
if args.segmented:
target = target.strip()
else:
target = "".join(target.strip().split())
if not args.no_simplified:
target = cc.convert(target)
source_tokenized, target_tokenized = sentence_to_tokenized[source], sentence_to_tokenized[target]
out, cors = annotator(source_tokenized, target_tokenized, idx)
if idx == 0:
output_str += "".join(out[:-1])
else:
output_str += "".join(out[1:-1])
except Exception:
raise Exception
return output_str
def main(args):
tokenizer = Tokenizer(args.granularity, args.device, args.segmented, args.bpe)
global annotator, sentence_to_tokenized
annotator = Annotator.create_default(args.granularity, args.multi_cheapest_strategy)
lines = open(args.file, "r", encoding="utf-8").read().strip().split("\n") # format: id src tgt1 tgt2...
# error_types = []
with open(args.output, "w", encoding="utf-8") as f:
count = 0
sentence_set = set()
sentence_to_tokenized = {}
for line in lines:
sent_list = line.split("\t")[1:]
for idx, sent in enumerate(sent_list):
if args.segmented:
# print(sent)
sent = sent.strip()
else:
sent = "".join(sent.split()).strip()
if idx >= 1:
if not args.no_simplified:
sentence_set.add(cc.convert(sent))
else:
sentence_set.add(sent)
else:
sentence_set.add(sent)
batch = []
for sent in tqdm(sentence_set):
count += 1
if sent:
batch.append(sent)
if count % args.batch_size == 0:
results = tokenizer(batch)
for s, r in zip(batch, results):
sentence_to_tokenized[s] = r # Get tokenization map.
batch = []
if batch:
results = tokenizer(batch)
for s, r in zip(batch, results):
sentence_to_tokenized[s] = r # Get tokenization map.
# 单进程模式
for line in tqdm(lines):
ret = annotate(line)
f.write(ret)
f.write("\n")
# 多进程模式:仅在Linux环境下测试,建议在linux服务器上使用
# with Pool(args.worker_num) as pool:
# for ret in pool.imap(annotate, tqdm(lines), chunksize=8):
# if ret:
# f.write(ret)
# f.write("\n")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Choose input file to annotate")
parser.add_argument("-f", "--file", type=str, required=True, help="Input parallel file")
parser.add_argument("-o", "--output", type=str, help="Output file", required=True)
parser.add_argument("-b", "--batch_size", type=int, help="The size of batch", default=128)
parser.add_argument("-d", "--device", type=int, help="The ID of GPU", default=0)
parser.add_argument("-w", "--worker_num", type=int, help="The number of workers", default=16)
parser.add_argument("-g", "--granularity", type=str, help="Choose char-level or word-level evaluation", default="char")
parser.add_argument("-m", "--merge", help="Whether merge continuous replacement/deletion/insertion", action="store_true")
parser.add_argument("-s", "--multi_cheapest_strategy", type=str, choices=["first", "all"], default="all")
parser.add_argument("--segmented", help="Whether tokens have been segmented", action="store_true") # 支持提前token化,用空格隔开
parser.add_argument("--no_simplified", help="Whether simplifying chinese", action="store_true") # 将所有corrections转换为简体中文
parser.add_argument("--bpe", help="Whether to use bpe", action="store_true") # 支持 bpe 切分英文单词
args = parser.parse_args()
main(args)
ltp
OpenCC
python-Levenshtein
pypinyin
tqdm
\ No newline at end of file
import argparse
from collections import Counter
from modules.classifier import check_spell_error
from tqdm import tqdm
def parse_m2(filename):
"""解析m2格式文件
Arguments:
filename -- 文件名
"""
sources = []
edits = []
with open(filename, "r") as f:
chunk = []
for line in f:
if line == "\n":
sources.append(chunk[0])
edit_list = []
for s in chunk[2:]:
if s[0] != "A": break
edit_list.append(s)
edits.append(edit_list)
chunk = []
else:
chunk.append(line.rstrip("\n"))
if chunk:
sources.append(chunk[0])
edit_list = []
for s in chunk[2:]:
if s[0] != "A": break
edit_list.append(s)
edits.append(edit_list)
return sources, edits
def validate(edits):
edits_with_pos = []
for edit, times in edits:
_, ss, se = edit.split("|||")[0].split(" ")
ss, se = int(ss), int(se)
edits_with_pos.append((ss, se, edit, times))
edits_with_pos.sort(key=lambda x: (x[0], -times)) # 按照起始位置从小到大排序,起始位置相同,按照编辑出现次数从大到小排序
final_edits = [edits_with_pos[0][2]]
for i in range(1, len(edits_with_pos)):
if edits_with_pos[i][0] < edits_with_pos[i-1][1]: # 有重叠span
edits_with_pos[i] = edits_with_pos[i-1] # 后续的span和前一个span比较
continue
if edits_with_pos[i][0] == edits_with_pos[i-1][0] and edits_with_pos[i][1] == edits_with_pos[i-1][1]:
edits_with_pos[i] = edits_with_pos[i-1] # 后续的span和前一个span比较
continue
final_edits.append(edits_with_pos[i][-2])
final_final_edits = []
for e in final_edits:
if len(final_final_edits) == 0 or e != final_final_edits[-1]:
final_final_edits.append(e)
return final_final_edits
def main(args):
total_edits = []
for f in args.result_path:
sources, edits = parse_m2(f)
total_edits.append(edits)
with open(args.output_path, "w", encoding="utf-8") as o:
for i in tqdm(range(len(sources))):
src = sources[i]
src_tokens = src.split(" ")[1:]
edit_candidates = []
for edits in total_edits:
edit_candidates.extend(edits[i])
final_edits = []
c = Counter(edit_candidates)
if c["A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0"] > (6 - args.threshold): # 没有错误
out = src + "\n" + "A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0" + "\n\n"
o.write(out)
continue
for k, v in c.items():
if v >= args.threshold:
if k != "A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0":
final_edits.append((k, v))
if "|||W|||" in k and v >= args.threshold - 1: # 词序错误特殊阈值
final_edits.append((k, v))
if "|||S|||" in k and v >= args.threshold - 1: # 拼写错误特殊阈值
_, ss, se = k.split("|||")[0].split(" ")
src_span = "".join(src_tokens[int(ss): int(se)])
tgt_span = k.split("|||")[2].replace(" ", "")
if check_spell_error(src_span, tgt_span):
final_edits.append((k, v))
if final_edits:
final_edits = validate(final_edits)
out = src + "\n" + "\n".join(final_edits) + "\n\n"
else:
out = src + "\n" + "A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0" + "\n\n"
o.write(out)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--result_path',
help='Path to the result file.', nargs='+',
required=True)
parser.add_argument('--output_path',
help='Path to the output file.',
required=True)
parser.add_argument('-T', '--threshold',
help='Threshold.',
type=int,
default=2)
args = parser.parse_args()
main(args)
\ No newline at end of file
冬阴功是泰国最著名的菜之一,它虽然不是很豪华,但它的味道确实让人上瘾,做法也不难、不复杂。
首先,我们得准备:大虾六到九只、盐一茶匙、已搾好的柠檬汁三汤匙、泰国柠檬叶三叶、柠檬香草一根、鱼酱两汤匙、辣椒6粒,纯净水4量杯、香菜半量杯和草菇10个。
这样,你就会尝到泰国人死爱的味道。
另外,冬阴功对外国人的喜爱也不断地增加。
这部电影不仅是在国内,在国外也很有名。
不管是真正的冬阴功还是电影里的“冬阴功”,都在人们的心里刻骨铭刻。
随着中国经济突飞猛快,建造工业与日俱增。
虽然工业的发展和城市规模的扩大对经济发展有积极作用,但是同时也使环境问题日益严重造成了空气污染问题。
那些空气污染也没有助于人们的身体健康。
由此可见,首先我们要了解一些关于空气污染对我们人生有什么危害的话题,知道了这些常识以后对我们人类会有积极作用。并且要学会怎何应对和治理空气污染的问题。
任何事情都是各有利弊,众所周知越建立工业对经济方面越有发展。
在我看来,曼古空气污染的问题与日俱增。
每天会有不少的有毒气体从工厂里出来。
在工厂里的工作人员为了工作,而每天吸不少的毒气体,经过了一年多的时间,连工作人员也得了严重的病。更不用说住在这家工厂附近的家庭。
沙尘暴也是一类空气污染之一。
不管是从口、眼、鼻子进去,这样都会伤害身体的健康。
这样做会避免受到沙尘暴。
最后,要关注一些关于天气预报的新闻。
中国,悠久的历史,灿烂的文化,真是历史上最难忘的国家。
对一个生人来说空气污染是很严重的问题,对身体不好。
\ No newline at end of file
S 冬 阴 功 是 泰 国 最 著 名 的 菜 之 一 , 它 虽 然 不 是 很 豪 华 , 但 它 的 味 确 实 让 人 上 瘾 , 做 法 也 不 难 、 不 复 杂 。
T0-A0 冬 阴 功 是 泰 国 最 著 名 的 菜 之 一 , 它 虽 然 不 是 很 豪 华 , 但 它 的 味 道 确 实 让 人 上 瘾 , 做 法 也 不 难 、 不 复 杂 。
A 27 27|||M|||道|||REQUIRED|||-NONE-|||0
S 首 先 , 我 们 得 准 备 : 大 虾 六 到 九 只 、 盐 一 茶 匙 、 已 搾 好 的 柠 檬 汁 三 汤 匙 、 泰 国 柠 檬 叶 三 叶 、 柠 檬 香 草 一 根 、 鱼 酱 两 汤 匙 、 辣 椒 6 粒 , 纯 净 水 4 量 杯 、 香 菜 半 量 杯 和 草 菇 1 0 个 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 这 样 , 你 就 会 尝 到 泰 国 人 死 爱 的 味 道 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 另 外 , 冬 阴 功 对 外 国 人 的 喜 爱 不 断 地 增 加 。
T0-A0 另 外 , 冬 阴 功 对 外 国 人 的 喜 爱 也 不 断 地 增 加 。
A 13 13|||M|||也|||REQUIRED|||-NONE-|||0
S 这 部 电 影 不 仅 是 国 内 , 在 国 外 也 很 有 名 。
T0-A0 这 部 电 影 不 仅 是 在 国 内 , 在 国 外 也 很 有 名 。
A 7 7|||M|||在|||REQUIRED|||-NONE-|||0
S 不 管 是 真 正 的 冬 阴 功 还 是 电 影 的 “ 冬 阴 功 ” , 都 在 人 们 的 心 里 刻 骨 铭 心 。
T0-A0 不 管 是 真 正 的 冬 阴 功 还 是 电 影 里 的 “ 冬 阴 功 ” , 都 在 人 们 的 心 里 刻 骨 铭 刻 。
A 13 13|||M|||里|||REQUIRED|||-NONE-|||0
A 30 31|||S|||刻|||REQUIRED|||-NONE-|||0
S 随 着 中 国 经 济 突 飞 猛 近 , 建 造 工 业 与 日 俱 增 。
T0-A0 随 着 中 国 经 济 突 飞 猛 快 , 建 造 工 业 与 日 俱 增 。
A 9 10|||S|||快|||REQUIRED|||-NONE-|||0
S 虽 然 工 业 的 发 展 和 城 市 规 模 的 扩 大 对 经 济 发 展 有 积 极 作 用 , 但 是 同 时 也 对 环 境 问 题 日 益 严 重 造 成 了 空 气 污 染 问 题 。
T0-A0 虽 然 工 业 的 发 展 和 城 市 规 模 的 扩 大 对 经 济 发 展 有 积 极 作 用 , 但 是 同 时 也 使 环 境 问 题 日 益 严 重 造 成 了 空 气 污 染 问 题 。
A 31 32|||S|||使|||REQUIRED|||-NONE-|||0
S 那 些 空 气 污 染 也 没 有 助 于 人 生 的 身 体 建 康 。
T0-A0 那 些 空 气 污 染 也 没 有 助 于 人 们 的 身 体 健 康 。
A 12 13|||S|||们|||REQUIRED|||-NONE-|||0
A 16 17|||S|||健|||REQUIRED|||-NONE-|||0
S 由 此 可 见 , 首 先 我 们 要 了 解 一 些 关 于 空 气 污 染 对 我 们 人 生 有 什 么 危 害 的 话 题 知 道 了 这 些 常 识 以 后 对 我 们 人 类 会 有 积 极 作 用 。 以 及 要 学 会 怎 样 应 对 和 治 理 空 气 污 染 的 问 题 。
T0-A0 由 此 可 见 , 首 先 我 们 要 了 解 一 些 关 于 空 气 污 染 对 我 们 人 生 有 什 么 危 害 的 话 题 , 知 道 了 这 些 常 识 以 后 对 我 们 人 类 会 有 积 极 作 用 。 并 且 要 学 会 怎 何 应 对 和 治 理 空 气 污 染 的 问 题 。
A 33 33|||M|||,|||REQUIRED|||-NONE-|||0
A 54 56|||S|||并 且|||REQUIRED|||-NONE-|||0
A 60 61|||S|||何|||REQUIRED|||-NONE-|||0
S 任 何 事 情 都 是 各 有 利 弊 , 众 所 周 知 越 建 立 工 业 越 对 经 济 方 面 有 所 发 展 。
T0-A0 任 何 事 情 都 是 各 有 利 弊 , 众 所 周 知 越 建 立 工 业 对 经 济 方 面 越 有 发 展 。
A 20 26|||W|||对 经 济 方 面 越|||REQUIRED|||-NONE-|||0
A 27 28|||R|||-NONE-|||REQUIRED|||-NONE-|||0
S 对 我 看 来 , 曼 古 空 气 污 染 的 问 题 与 日 俱 增 。
T0-A0 在 我 看 来 , 曼 古 空 气 污 染 的 问 题 与 日 俱 增 。
A 0 1|||S|||在|||REQUIRED|||-NONE-|||0
S 每 天 会 有 不 少 的 毒 气 体 泄 漏 从 工 厂 里 出 来 。
T0-A0 每 天 会 有 不 少 的 有 毒 气 体 从 工 厂 里 出 来 。
A 7 7|||M|||有|||REQUIRED|||-NONE-|||0
A 10 12|||R|||-NONE-|||REQUIRED|||-NONE-|||0
S 在 工 厂 里 的 工 作 人 员 为 了 工 作 , 而 每 天 吸 了 不 少 的 毒 气 体 , 经 过 了 一 年 多 的 时 间 , 连 工 作 人 员 也 得 了 严 重 的 病 。 更 不 用 说 住 在 这 家 工 厂 近 的 家 庭 。
T0-A0 在 工 厂 里 的 工 作 人 员 为 了 工 作 , 而 每 天 吸 不 少 的 毒 气 体 , 经 过 了 一 年 多 的 时 间 , 连 工 作 人 员 也 得 了 严 重 的 病 。 更 不 用 说 住 在 这 家 工 厂 附 近 的 家 庭 。
A 18 19|||R|||-NONE-|||REQUIRED|||-NONE-|||0
A 59 59|||M|||附|||REQUIRED|||-NONE-|||0
S 沙 尘 暴 也 是 一 类 空 气 污 染 之 一 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 不 官 是 从 口 、 眼 、 鼻 子 进 去 这 样 会 伤 害 身 体 的 建 康 。
T0-A0 不 管 是 从 口 、 眼 、 鼻 子 进 去 , 这 样 都 会 伤 害 身 体 的 健 康 。
A 1 2|||S|||管|||REQUIRED|||-NONE-|||0
A 12 12|||M|||,|||REQUIRED|||-NONE-|||0
A 14 14|||M|||都|||REQUIRED|||-NONE-|||0
A 20 21|||S|||健|||REQUIRED|||-NONE-|||0
S 这 样 做 会 避 免 受 到 沙 尘 暴 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 最 后 , 要 关 主 一 些 关 于 天 气 预 报 的 新 闻 。
T0-A0 最 后 , 要 关 注 一 些 关 于 天 气 预 报 的 新 闻 。
A 5 6|||S|||注|||REQUIRED|||-NONE-|||0
S 中 国 , 悠 久 的 历 史 , 灿 烂 的 文 化 , 真 是 在 历 史 上 最 难 忘 的 国 家 。
T0-A0 中 国 , 悠 久 的 历 史 , 灿 烂 的 文 化 , 真 是 历 史 上 最 难 忘 的 国 家 。
A 17 18|||R|||-NONE-|||REQUIRED|||-NONE-|||0
S 对 一 个 生 名 来 说 空 气 污 染 是 很 危 害 的 问 题 , 对 身 体 不 好 。
T0-A0 对 一 个 生 人 来 说 空 气 污 染 是 很 严 重 的 问 题 , 对 身 体 不 好 。
A 4 5|||S|||人|||REQUIRED|||-NONE-|||0
A 13 15|||S|||严 重|||REQUIRED|||-NONE-|||0
S 冬 阴 功 是 泰 国 最 著 名 的 菜 之 一 , 它 虽 然 不 是 很 豪 华 , 但 它 的 味 确 实 让 人 上 瘾 , 做 法 也 不 难 、 不 复 杂 。
T0-A0 冬 阴 功 是 泰 国 最 著 名 的 菜 之 一 , 它 虽 然 不 是 很 豪 华 , 但 它 的 味 道 确 实 让 人 上 瘾 , 做 法 也 不 难 、 不 复 杂 。
A 27 27|||M|||道|||REQUIRED|||-NONE-|||0
S 首 先 , 我 们 得 准 备 : 大 虾 六 到 九 只 、 盐 一 茶 匙 、 已 搾 好 的 柠 檬 汁 三 汤 匙 、 泰 国 柠 檬 叶 三 叶 、 柠 檬 香 草 一 根 、 鱼 酱 两 汤 匙 、 辣 椒 6 粒 , 纯 净 水 4 量 杯 、 香 菜 半 量 杯 和 草 菇 1 0 个 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 这 样 , 你 就 会 尝 到 泰 国 人 死 爱 的 味 道 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 另 外 , 冬 阴 功 对 外 国 人 的 喜 爱 不 断 地 增 加 。
T0-A0 另 外 , 冬 阴 功 对 外 国 人 的 喜 爱 也 不 断 地 增 加 。
A 13 13|||M|||也|||REQUIRED|||-NONE-|||0
S 这 部 电 影 不 仅 是 国 内 , 在 国 外 也 很 有 名 。
T0-A0 这 部 电 影 不 仅 是 在 国 内 , 在 国 外 也 很 有 名 。
A 7 7|||M|||在|||REQUIRED|||-NONE-|||0
S 不 管 是 真 正 的 冬 阴 功 还 是 电 影 的 “ 冬 阴 功 ” , 都 在 人 们 的 心 里 刻 骨 铭 心 。
T0-A0 不 管 是 真 正 的 冬 阴 功 还 是 电 影 里 的 “ 冬 阴 功 ” , 都 在 人 们 的 心 里 刻 骨 铭 刻 。
A 13 13|||M|||里|||REQUIRED|||-NONE-|||0
A 30 31|||S|||刻|||REQUIRED|||-NONE-|||0
S 随 着 中 国 经 济 突 飞 猛 近 , 建 造 工 业 与 日 俱 增 。
T0-A0 随 着 中 国 经 济 突 飞 猛 快 , 建 造 工 业 与 日 俱 增 。
A 9 10|||S|||快|||REQUIRED|||-NONE-|||0
S 虽 然 工 业 的 发 展 和 城 市 规 模 的 扩 大 对 经 济 发 展 有 积 极 作 用 , 但 是 同 时 也 对 环 境 问 题 日 益 严 重 造 成 了 空 气 污 染 问 题 。
T0-A0 虽 然 工 业 的 发 展 和 城 市 规 模 的 扩 大 对 经 济 发 展 有 积 极 作 用 , 但 是 同 时 也 使 环 境 问 题 日 益 严 重 造 成 了 空 气 污 染 问 题 。
A 31 32|||S|||使|||REQUIRED|||-NONE-|||0
S 那 些 空 气 污 染 也 没 有 助 于 人 生 的 身 体 建 康 。
T0-A0 那 些 空 气 污 染 也 没 有 助 于 人 们 的 身 体 健 康 。
A 12 13|||S|||们|||REQUIRED|||-NONE-|||0
A 16 17|||S|||健|||REQUIRED|||-NONE-|||0
S 由 此 可 见 , 首 先 我 们 要 了 解 一 些 关 于 空 气 污 染 对 我 们 人 生 有 什 么 危 害 的 话 题 知 道 了 这 些 常 识 以 后 对 我 们 人 类 会 有 积 极 作 用 。 以 及 要 学 会 怎 样 应 对 和 治 理 空 气 污 染 的 问 题 。
T0-A0 由 此 可 见 , 首 先 我 们 要 了 解 一 些 关 于 空 气 污 染 对 我 们 人 生 有 什 么 危 害 的 话 题 , 知 道 了 这 些 常 识 以 后 对 我 们 人 类 会 有 积 极 作 用 。 并 且 要 学 会 怎 何 应 对 和 治 理 空 气 污 染 的 问 题 。
A 33 33|||M|||,|||REQUIRED|||-NONE-|||0
A 54 56|||S|||并 且|||REQUIRED|||-NONE-|||0
A 60 61|||S|||何|||REQUIRED|||-NONE-|||0
S 任 何 事 情 都 是 各 有 利 弊 , 众 所 周 知 越 建 立 工 业 越 对 经 济 方 面 有 所 发 展 。
T0-A0 任 何 事 情 都 是 各 有 利 弊 , 众 所 周 知 越 建 立 工 业 对 经 济 方 面 越 有 发 展 。
A 20 26|||W|||对 经 济 方 面 越|||REQUIRED|||-NONE-|||0
A 27 28|||R|||-NONE-|||REQUIRED|||-NONE-|||0
S 对 我 看 来 , 曼 古 空 气 污 染 的 问 题 与 日 俱 增 。
T0-A0 在 我 看 来 , 曼 古 空 气 污 染 的 问 题 与 日 俱 增 。
A 0 1|||S|||在|||REQUIRED|||-NONE-|||0
S 每 天 会 有 不 少 的 毒 气 体 泄 漏 从 工 厂 里 出 来 。
T0-A0 每 天 会 有 不 少 的 有 毒 气 体 从 工 厂 里 出 来 。
A 7 7|||M|||有|||REQUIRED|||-NONE-|||0
A 10 12|||R|||-NONE-|||REQUIRED|||-NONE-|||0
S 在 工 厂 里 的 工 作 人 员 为 了 工 作 , 而 每 天 吸 了 不 少 的 毒 气 体 , 经 过 了 一 年 多 的 时 间 , 连 工 作 人 员 也 得 了 严 重 的 病 。 更 不 用 说 住 在 这 家 工 厂 近 的 家 庭 。
T0-A0 在 工 厂 里 的 工 作 人 员 为 了 工 作 , 而 每 天 吸 不 少 的 毒 气 体 , 经 过 了 一 年 多 的 时 间 , 连 工 作 人 员 也 得 了 严 重 的 病 。 更 不 用 说 住 在 这 家 工 厂 附 近 的 家 庭 。
A 18 19|||R|||-NONE-|||REQUIRED|||-NONE-|||0
A 59 59|||M|||附|||REQUIRED|||-NONE-|||0
S 沙 尘 暴 也 是 一 类 空 气 污 染 之 一 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 不 官 是 从 口 、 眼 、 鼻 子 进 去 这 样 会 伤 害 身 体 的 建 康 。
T0-A0 不 管 是 从 口 、 眼 、 鼻 子 进 去 , 这 样 都 会 伤 害 身 体 的 健 康 。
A 1 2|||S|||管|||REQUIRED|||-NONE-|||0
A 12 12|||M|||,|||REQUIRED|||-NONE-|||0
A 14 14|||M|||都|||REQUIRED|||-NONE-|||0
A 20 21|||S|||健|||REQUIRED|||-NONE-|||0
S 这 样 做 会 避 免 受 到 沙 尘 暴 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 最 后 , 要 关 主 一 些 关 于 天 气 预 报 的 新 闻 。
T0-A0 最 后 , 要 关 注 一 些 关 于 天 气 预 报 的 新 闻 。
A 5 6|||S|||注|||REQUIRED|||-NONE-|||0
S 中 国 , 悠 久 的 历 史 , 灿 烂 的 文 化 , 真 是 在 历 史 上 最 难 忘 的 国 家 。
T0-A0 中 国 , 悠 久 的 历 史 , 灿 烂 的 文 化 , 真 是 历 史 上 最 难 忘 的 国 家 。
A 17 18|||R|||-NONE-|||REQUIRED|||-NONE-|||0
S 对 一 个 生 名 来 说 空 气 污 染 是 很 危 害 的 问 题 , 对 身 体 不 好 。
T0-A0 对 一 个 生 人 来 说 空 气 污 染 是 很 严 重 的 问 题 , 对 身 体 不 好 。
A 4 5|||S|||人|||REQUIRED|||-NONE-|||0
A 13 15|||S|||严 重|||REQUIRED|||-NONE-|||0
S 冬阴功 是 泰国 最 著名 的 菜 之一 , 它 虽然 不 是 很 豪华 , 但 它 的 味 确实 让 人 上瘾 , 做法 也 不 难 、 不 复杂 。
T0-A0 冬阴功 是 泰国 最 著名 的 菜 之一 , 它 虽然 不 是 很 豪华 , 但 它 的 味道 确实 让 人 上瘾 , 做法 也 不 难 、 不 复杂 。
A 19 20|||S:NOUN|||味道|||REQUIRED|||-NONE-|||0
S 首先 , 我们 得 准备 : 大虾 六 到 九 只 、 盐 一 茶匙 、 已 搾好 的 柠檬汁 三 汤匙 、 泰国 柠檬叶 三 叶 、 柠檬 香草 一 根 、 鱼 酱 两 汤匙 、 辣椒 6 粒 , 纯净水 4 量 杯 、 香菜 半量 杯 和 草菇 10 个 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 这样 , 你 就 会 尝 到 泰国 人 死 爱 的 味道 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 另外 , 冬阴功 对 外国人 的 喜爱 不断 地 增加 。
T0-A0 另外 , 冬阴功 对 外国人 的 喜爱 也 不断 地 增加 。
A 7 7|||M:ADV|||也|||REQUIRED|||-NONE-|||0
S 这部 电影 不仅 是 国内 , 在 国外 也 很 有名 。
T0-A0 这部 电影 不仅 是 在 国内 , 在 国外 也 很 有名 。
A 4 4|||M:PREP|||在|||REQUIRED|||-NONE-|||0
S 不管 是 真正 的 冬 阴功 还是 电影 的 “ 冬 阴功 ” , 都 在 人们 的 心里 刻骨铭心 。
T0-A0 不管 是 真正 的 冬 阴功 还是 电影 里 的 “ 冬 阴功 ” , 都 在 人们 的 心里 刻骨铭刻 。
A 8 8|||M:NOUN|||里|||REQUIRED|||-NONE-|||0
A 19 20|||S:OTHER|||刻骨铭刻|||REQUIRED|||-NONE-|||0
S 随着 中国 经济 突飞猛近 , 建造 工业 与日俱增 。
T0-A0 随着 中国 经济 突飞猛快 , 建造 工业 与日俱增 。
A 3 4|||S:OTHER|||突飞猛快|||REQUIRED|||-NONE-|||0
S 虽然 工业 的 发展 和 城市 规模 的 扩大 对 经济 发展 有 积极 作用 , 但是 同时 也 对 环境 问题 日益 严重 造成 了 空气 污染 问题 。
T0-A0 虽然 工业 的 发展 和 城市 规模 的 扩大 对 经济 发展 有 积极 作用 , 但是 同时 也 使 环境 问题 日益 严重 造成 了 空气 污染 问题 。
A 19 20|||S:VERB|||使|||REQUIRED|||-NONE-|||0
S 那些 空气 污染 也 没有 助于 人生 的 身体 建康 。
T0-A0 那些 空气 污染 也 没有 助于 人们 的 身体 健康 。
A 6 7|||S:NOUN|||人们|||REQUIRED|||-NONE-|||0
A 9 10|||S:SPELL|||健康|||REQUIRED|||-NONE-|||0
S 由此可见 , 首先 我们 要 了解 一些 关于 空气 污染 对 我们 人生 有 什么 危害 的 话题 知道 了 这些 常识 以后 对 我们 人类 会 有 积极 作用 。 以及 要 学会 怎样 应对 和 治理 空气 污染 的 问题 。
T0-A0 由此可见 , 首先 我们 要 了解 一些 关于 空气 污染 对 我们 人生 有 什么 危害 的 话题 , 知道 了 这些 常识 以后 对 我们 人类 会 有 积极 作用 。 并且 要 学会 怎 何 应对 和 治理 空气 污染 的 问题 。
A 18 18|||M:PUNCT|||,|||REQUIRED|||-NONE-|||0
A 31 32|||S:CONJ|||并且|||REQUIRED|||-NONE-|||0
A 34 35|||S:OTHER|||怎 何|||REQUIRED|||-NONE-|||0
S 任何 事情 都 是 各 有 利弊 , 众所周知 越 建立 工业 越 对 经济 方面 有所 发展 。
T0-A0 任何 事情 都 是 各 有 利弊 , 众所周知 越 建立 工业 对 经济 方面 越 有 发展 。
A 12 13|||R:ADV|||-NONE-|||REQUIRED|||-NONE-|||0
A 16 17|||S:OTHER|||越 有|||REQUIRED|||-NONE-|||0
S 对 我 看来 , 曼古 空气 污染 的 问题 与日俱增 。
T0-A0 在 我 看来 , 曼古 空气 污染 的 问题 与日俱增 。
A 0 1|||S:PREP|||在|||REQUIRED|||-NONE-|||0
S 每天 会 有 不少 的 毒 气体 泄漏 从 工厂 里 出来 。
T0-A0 每天 会 有 不少 的 有毒 气体 从 工厂 里 出来 。
A 5 6|||S:VERB|||有毒|||REQUIRED|||-NONE-|||0
A 7 8|||R:VERB|||-NONE-|||REQUIRED|||-NONE-|||0
S 在 工厂 里 的 工作 人员 为了 工作 , 而 每天 吸 了 不少 的 毒气体 , 经过 了 一 年 多 的 时间 , 连 工作 人员 也 得了 严重 的 病 。 更 不用 说 住 在 这家 工厂 近 的 家庭 。
T0-A0 在 工厂 里 的 工作 人员 为了 工作 , 而 每天 吸 不少 的 毒 气体 , 经过 了 一 年 多 的 时间 , 连 工作 人员 也 得了 严重 的 病 。 更 不用 说 住 在 这家 工厂 附近 的 家庭 。
A 12 13|||R:AUX|||-NONE-|||REQUIRED|||-NONE-|||0
A 41 42|||S:NOUN|||附近|||REQUIRED|||-NONE-|||0
S 沙尘暴 也 是 一 类 空气 污染 之一 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 不 官 是 从 口 、 眼 、 鼻子 进去 这样 会 伤害 身体 的 建康 。
T0-A0 不管 是 从 口 、 眼 、 鼻子 进去 , 这样 都 会 伤害 身体 的 健康 。
A 0 2|||S:SPELL|||不管|||REQUIRED|||-NONE-|||0
A 10 10|||M:PUNCT|||,|||REQUIRED|||-NONE-|||0
A 11 11|||M:ADV|||都|||REQUIRED|||-NONE-|||0
A 15 16|||S:SPELL|||健康|||REQUIRED|||-NONE-|||0
S 这样 做 会 避免 受到 沙尘暴 。
T0 没有错误
A -1 -1|||noop|||-NONE-|||REQUIRED|||-NONE-|||0
S 最后 , 要 关主 一些 关于 天气 预报 的 新闻 。
T0-A0 最后 , 要 关注 一些 关于 天气 预报 的 新闻 。
A 3 4|||S:SPELL|||关注|||REQUIRED|||-NONE-|||0
S 中国 , 悠久 的 历史 , 灿烂 的 文化 , 真是 在 历史 上 最 难忘 的 国家 。
T0-A0 中国 , 悠久 的 历史 , 灿烂 的 文化 , 真是 历史 上 最 难忘 的 国家 。
A 11 12|||R:PREP|||-NONE-|||REQUIRED|||-NONE-|||0
S 对 一个 生名 来说 空气 污染 是 很 危害 的 问题 , 对 身体 不好 。
T0-A0 对 一个 生人 来说 空气 污染 是 很 严重 的 问题 , 对 身体 不好 。
A 2 3|||S:NOUN|||生人|||REQUIRED|||-NONE-|||0
A 8 9|||S:ADJ|||严重|||REQUIRED|||-NONE-|||0
1 冬阴功是泰国最著名的菜之一,它虽然不是很豪华,但它的味确实让人上瘾,做法也不难、不复杂。 冬阴功是泰国最著名的菜之一,它虽然不是很豪华,但它的味道确实让人上瘾,做法也不难、不复杂。
2 首先,我们得准备:大虾六到九只、盐一茶匙、已搾好的柠檬汁三汤匙、泰国柠檬叶三叶、柠檬香草一根、鱼酱两汤匙、辣椒6粒,纯净水4量杯、香菜半量杯和草菇10个。 首先,我们得准备:大虾六到九只、盐一茶匙、已搾好的柠檬汁三汤匙、泰国柠檬叶三叶、柠檬香草一根、鱼酱两汤匙、辣椒6粒,纯净水4量杯、香菜半量杯和草菇10个。
3 这样,你就会尝到泰国人死爱的味道。 这样,你就会尝到泰国人死爱的味道。
4 另外,冬阴功对外国人的喜爱不断地增加。 另外,冬阴功对外国人的喜爱也不断地增加。
5 这部电影不仅是国内,在国外也很有名。 这部电影不仅是在国内,在国外也很有名。
6 不管是真正的冬阴功还是电影的“冬阴功”,都在人们的心里刻骨铭心。 不管是真正的冬阴功还是电影里的“冬阴功”,都在人们的心里刻骨铭刻。
7 随着中国经济突飞猛近,建造工业与日俱增。 随着中国经济突飞猛快,建造工业与日俱增。
8 虽然工业的发展和城市规模的扩大对经济发展有积极作用,但是同时也对环境问题日益严重造成了空气污染问题。 虽然工业的发展和城市规模的扩大对经济发展有积极作用,但是同时也使环境问题日益严重造成了空气污染问题。
9 那些空气污染也没有助于人生的身体建康。 那些空气污染也没有助于人们的身体健康。
10 由此可见,首先我们要了解一些关于空气污染对我们人生有什么危害的话题知道了这些常识以后对我们人类会有积极作用。以及要学会怎样应对和治理空气污染的问题。 由此可见,首先我们要了解一些关于空气污染对我们人生有什么危害的话题,知道了这些常识以后对我们人类会有积极作用。并且要学会怎何应对和治理空气污染的问题。
11 任何事情都是各有利弊,众所周知越建立工业越对经济方面有所发展。 任何事情都是各有利弊,众所周知越建立工业对经济方面越有发展。
12 对我看来,曼古空气污染的问题与日俱增。 在我看来,曼古空气污染的问题与日俱增。
13 每天会有不少的毒气体泄漏从工厂里出来。 每天会有不少的有毒气体从工厂里出来。
14 在工厂里的工作人员为了工作,而每天吸了不少的毒气体,经过了一年多的时间,连工作人员也得了严重的病。更不用说住在这家工厂近的家庭。 在工厂里的工作人员为了工作,而每天吸不少的毒气体,经过了一年多的时间,连工作人员也得了严重的病。更不用说住在这家工厂附近的家庭。
15 沙尘暴也是一类空气污染之一。 沙尘暴也是一类空气污染之一。
16 不官是从口、眼、鼻子进去这样会伤害身体的建康。 不管是从口、眼、鼻子进去,这样都会伤害身体的健康。
17 这样做会避免受到沙尘暴。 这样做会避免受到沙尘暴。
18 最后,要关主一些关于天气预报的新闻。 最后,要关注一些关于天气预报的新闻。
19 中国,悠久的历史,灿烂的文化,真是在历史上最难忘的国家。 中国,悠久的历史,灿烂的文化,真是历史上最难忘的国家。
20 对一个生名来说空气污染是很危害的问题,对身体不好。 对一个生人来说空气污染是很严重的问题,对身体不好。
冬阴功是泰国最著名的菜之一,它虽然不是很豪华,但它的味确实让人上瘾,做法也不难、不复杂。
首先,我们得准备:大虾六到九只、盐一茶匙、已搾好的柠檬汁三汤匙、泰国柠檬叶三叶、柠檬香草一根、鱼酱两汤匙、辣椒6粒,纯净水4量杯、香菜半量杯和草菇10个。
这样,你就会尝到泰国人死爱的味道。
另外,冬阴功对外国人的喜爱不断地增加。
这部电影不仅是国内,在国外也很有名。
不管是真正的冬阴功还是电影的“冬阴功”,都在人们的心里刻骨铭心。
随着中国经济突飞猛近,建造工业与日俱增。
虽然工业的发展和城市规模的扩大对经济发展有积极作用,但是同时也对环境问题日益严重造成了空气污染问题。
那些空气污染也没有助于人生的身体建康。
由此可见,首先我们要了解一些关于空气污染对我们人生有什么危害的话题知道了这些常识以后对我们人类会有积极作用。以及要学会怎样应对和治理空气污染的问题。
任何事情都是各有利弊,众所周知越建立工业越对经济方面有所发展。
对我看来,曼古空气污染的问题与日俱增。
每天会有不少的毒气体泄漏从工厂里出来。
在工厂里的工作人员为了工作,而每天吸了不少的毒气体,经过了一年多的时间,连工作人员也得了严重的病。更不用说住在这家工厂近的家庭。
沙尘暴也是一类空气污染之一。
不官是从口、眼、鼻子进去这样会伤害身体的建康。
这样做会避免受到沙尘暴。
最后,要关主一些关于天气预报的新闻。
中国,悠久的历史,灿烂的文化,真是在历史上最难忘的国家。
对一个生名来说空气污染是很危害的问题,对身体不好。
\ No newline at end of file
S 冬 阴 功 是 泰 国 最 著 名 的 菜 之 一 , 它 虽 然 不 是 很 豪 华 , 但 它 的 味 确 实 让 人 上 瘾 , 做 法 也 不 难 、 不 复 杂 。
T0-A0 冬 阴 功 是 泰 国 最 著 名 的 菜 之 一 , 虽 然 它 不 是 很 豪 华 , 但 它 的 味 确 实 让 人 上 瘾 , 做 法 也 不 难 、 不 复 杂 。
A 14 17|||W|||虽 然 它|||REQUIRED|||-NONE-|||0
S 首 先 , 我 们 得 准 备 : 大 虾 六 到 九 只 、 盐 一 茶 匙 、 已 搾 好 的 柠 檬 汁 三 汤 匙 、 泰 国 柠 檬 叶 三 叶 、 柠 檬 香 草 一 根 、 鱼 酱 两 汤 匙 、 辣 椒 6 粒 , 纯 净 水 4 量 杯 、 香 菜 半 量 杯 和 草 菇 1 0 个 。
T0-A0 首 先 , 我 们 得 准 备 : 大 虾 六 到 九 只 、 盐 一 茶 匙 、 已 榨 好 的 柠 檬 汁 三 汤 匙 、 泰 国 柠 檬 叶 三 叶 、 柠 檬 香 草 一 根 、 鱼 酱 两 汤 匙 、 辣 椒 六 粒 , 纯 净 水 四 量 杯 、 香 菜 半 量 杯 和 草 菇 十 个 。
A 22 23|||S|||榨|||REQUIRED|||-NONE-|||0
A 55 56|||S|||六|||REQUIRED|||-NONE-|||0
A 61 62|||S|||四|||REQUIRED|||-NONE-|||0
A 73 75|||S|||十|||REQUIRED|||-NONE-|||0
S 这 样 , 你 就 会 尝 到 泰 国 人 死 爱 的 味 道 。
T0-A0 这 样 , 你 就 会 尝 到 泰 国 人 爱 死 的 味 道 。
A 11 13|||W|||爱 死|||REQUIRED|||-NONE-|||0
S 另 外 , 冬 阴 功 对 外 国 人 的 喜 爱 不 断 地 增 加 。
T0-A0 另 外 , 外 国 人 对 冬 阴 功 的 喜 爱 不 断 地 增 加 。
A 3 10|||W|||外 国 人 对 冬 阴 功|||REQUIRED|||-NONE-|||0
S 这 部 电 影 不 仅 是 国 内 , 在 国 外 也 很 有 名 。
T0-A0 这 部 电 影 不 仅 是 在 国 内 , 在 国 外 也 很 有 名 。
A 7 7|||M|||在|||REQUIRED|||-NONE-|||0
T1-A0 这 部 电 影 不 仅 在 国 内 , 在 国 外 也 很 有 名 。
A 6 7|||S|||在|||REQUIRED|||-NONE-|||1
S 不 管 是 真 正 的 冬 阴 功 还 是 电 影 的 “ 冬 阴 功 ” , 都 在 人 们 的 心 里 刻 骨 铭 心 。
T0-A0 不 管 是 真 正 的 冬 阴 功 还 是 电 影 的 “ 冬 阴 功 ” , 人 们 都 刻 骨 铭 心 。
A 20 22|||R|||-NONE-|||REQUIRED|||-NONE-|||0
A 24 27|||S|||都|||REQUIRED|||-NONE-|||0
T1-A0 不 管 是 真 正 的 冬 阴 功 还 是 电 影 中 的 “ 冬 阴 功 ” , 都 使 人 们 刻 骨 铭 心 。
A 13 13|||M|||中|||REQUIRED|||-NONE-|||1
A 21 22|||S|||使|||REQUIRED|||-NONE-|||1
A 24 27|||R|||-NONE-|||REQUIRED|||-NONE-|||1
S 随 着 中 国 经 济 突 飞 猛 近 , 建 造 工 业 与 日 俱 增 。
T0-A0 随 着 中 国 经 济 突 飞 猛 进 , 建 造 工 业 与 日 俱 增 。
A 9 10|||S|||进|||REQUIRED|||-NONE-|||0
S 虽 然 工 业 的 发 展 和 城 市 规 模 的 扩 大 对 经 济 发 展 有 积 极 作 用 , 但 是 同 时 也 对 环 境 问 题 日 益 严 重 造 成 了 空 气 污 染 问 题 。
T0-A0 虽 然 工 业 的 发 展 和 城 市 规 模 的 扩 大 对 经 济 发 展 有 积 极 作 用 , 但 是 同 时 也 对 环 境 造 成 了 日 益 严 重 的 空 气 污 染 问 题 。
A 34 36|||S|||造 成 了|||REQUIRED|||-NONE-|||0
A 40 43|||S|||的|||REQUIRED|||-NONE-|||0
T1-A0 虽 然 工 业 的 发 展 和 城 市 规 模 的 扩 大 对 经 济 发 展 有 积 极 作 用 , 但 是 同 时 也 对 环 境 造 成 了 日 益 严 重 的 污 染 问 题 。
A 34 36|||S|||造 成 了|||REQUIRED|||-NONE-|||1
A 40 45|||S|||的|||REQUIRED|||-NONE-|||1
S 那 些 空 气 污 染 也 没 有 助 于 人 生 的 身 体 建 康 。
T0-A0 那 些 空 气 污 染 也 无 助 于 人 的 身 体 健 康 。
A 7 9|||S|||无|||REQUIRED|||-NONE-|||0
A 12 13|||R|||-NONE-|||REQUIRED|||-NONE-|||0
A 16 17|||S|||健|||REQUIRED|||-NONE-|||0
S 由 此 可 见 , 首 先 我 们 要 了 解 一 些 关 于 空 气 污 染 对 我 们 人 生 有 什 么 危 害 的 话 题 知 道 了 这 些 常 识 以 后 对 我 们 人 类 会 有 积 极 作 用 。 以 及 要 学 会 怎 样 应 对 和 治 理 空 气 污 染 的 问 题 。
T0-A0 由 此 可 见 , 首 先 我 们 要 了 解 一 些 关 于 空 气 污 染 对 我 们 人 体 有 什 么 危 害 的 话 题 — — 知 道 这 些 常 识 对 我 们 人 类 会 有 积 极 作 用 , 以 及 要 学 会 怎 样 应 对 和 治 理 空 气 污 染 的 问 题 。
A 24 25|||S|||体|||REQUIRED|||-NONE-|||0
A 33 33|||M|||— —|||REQUIRED|||-NONE-|||0
A 35 36|||R|||-NONE-|||REQUIRED|||-NONE-|||0
A 40 42|||R|||-NONE-|||REQUIRED|||-NONE-|||0
A 53 54|||S|||,|||REQUIRED|||-NONE-|||0
T1-A0 由 此 可 见 , 首 先 我 们 要 了 解 一 些 关 于 空 气 污 染 对 我 们 人 体 有 什 么 危 害 的 话 题 — — 知 道 这 些 常 识 对 我 们 人 类 会 有 积 极 作 用 , 其 次 要 学 会 怎 样 应 对 和 治 理 空 气 污 染 的 问 题 。
A 24 25|||S|||体|||REQUIRED|||-NONE-|||1
A 33 33|||M|||— —|||REQUIRED|||-NONE-|||1
A 35 36|||R|||-NONE-|||REQUIRED|||-NONE-|||1
A 40 42|||R|||-NONE-|||REQUIRED|||-NONE-|||1
A 53 56|||S|||, 其 次|||REQUIRED|||-NONE-|||1
S 任 何 事 情 都 是 各 有 利 弊 , 众 所 周 知 越 建 立 工 业 越 对 经 济 方 面 有 所 发 展 。
T0-A0 任 何 事 情 都 是 各 有 利 弊 , 众 所 周 知 越 发 展 工 业 , 经 济 方 面 就 越 有 所 发 展 。
A 16 18|||S|||发 展|||REQUIRED|||-NONE-|||0
A 20 22|||S|||,|||REQUIRED|||-NONE-|||0
A 26 26|||M|||就 越|||REQUIRED|||-NONE-|||0
T1-A0 任 何 事 情 都 是 各 有 利 弊 的 , 众 所 周 知 越 发 展 工 业 , 经 济 方 面 就 越 有 所 发 展 。
A 10 10|||M|||的|||REQUIRED|||-NONE-|||1
A 16 18|||S|||发 展|||REQUIRED|||-NONE-|||1
A 20 22|||S|||,|||REQUIRED|||-NONE-|||1
A 26 26|||M|||就 越|||REQUIRED|||-NONE-|||1
S 对 我 看 来 , 曼 古 空 气 污 染 的 问 题 与 日 俱 增 。
T0-A0 在 我 看 来 , 曼 古 空 气 污 染 的 问 题 与 日 俱 增 。
A 0 1|||S|||在|||REQUIRED|||-NONE-|||0
S 每 天 会 有 不 少 的 毒 气 体 泄 漏 从 工 厂 里 出 来 。
T0-A0 每 天 会 有 不 少 的 有 毒 气 体 从 工 厂 里 泄 漏 出 来 。
A 7 7|||M|||有|||REQUIRED|||-NONE-|||0
A 10 16|||W|||从 工 厂 里 泄 漏|||REQUIRED|||-NONE-|||0
T1-A0 每 天 会 有 不 少 的 有 毒 气 体 从 工 厂 里 泄 露 出 来 。
A 7 7|||M|||有|||REQUIRED|||-NONE-|||1
A 10 16|||W|||从 工 厂 里 泄 露|||REQUIRED|||-NONE-|||1
S 在 工 厂 里 的 工 作 人 员 为 了 工 作 , 而 每 天 吸 了 不 少 的 毒 气 体 , 经 过 了 一 年 多 的 时 间 , 连 工 作 人 员 也 得 了 严 重 的 病 。 更 不 用 说 住 在 这 家 工 厂 近 的 家 庭 。
T0-A0 在 工 厂 里 的 工 作 人 员 为 了 工 作 , 每 天 吸 了 不 少 的 有 毒 气 体 , 经 过 了 一 年 多 的 时 间 , 连 工 作 人 员 也 得 了 严 重 的 病 , 更 不 用 说 住 得 离 这 家 工 厂 近 的 家 庭 。
A 14 15|||R|||-NONE-|||REQUIRED|||-NONE-|||0
A 22 22|||M|||有|||REQUIRED|||-NONE-|||0
A 48 49|||S|||,|||REQUIRED|||-NONE-|||0
A 54 55|||S|||得 离|||REQUIRED|||-NONE-|||0
T1-A0 在 工 厂 里 的 工 作 人 员 为 了 工 作 , 每 天 吸 了 不 少 的 有 毒 气 体 , 经 过 了 一 年 多 的 时 间 , 连 工 作 人 员 也 得 了 严 重 的 病 , 更 不 用 说 住 在 这 家 工 厂 附 近 的 家 庭 。
A 14 15|||R|||-NONE-|||REQUIRED|||-NONE-|||1
A 22 22|||M|||有|||REQUIRED|||-NONE-|||1
A 48 49|||S|||,|||REQUIRED|||-NONE-|||1
A 59 59|||M|||附|||REQUIRED|||-NONE-|||1
S 沙 尘 暴 也 是 一 类 空 气 污 染 之 一 。
T0-A0 沙 尘 暴 也 是 一 类 空 气 污 染 。
A 11 13|||R|||-NONE-|||REQUIRED|||-NONE-|||0
T1-A0 沙 尘 暴 也 是 空 气 污 染 之 一 。
A 5 7|||R|||-NONE-|||REQUIRED|||-NONE-|||1
S 不 官 是 从 口 、 眼 、 鼻 子 进 去 这 样 会 伤 害 身 体 的 建 康 。
T0-A0 不 管 是 从 口 、 眼 还 是 鼻 子 进 去 , 都 会 伤 害 身 体 的 健 康 。
A 1 2|||S|||管|||REQUIRED|||-NONE-|||0
A 7 8|||S|||还 是|||REQUIRED|||-NONE-|||0
A 12 14|||S|||, 都|||REQUIRED|||-NONE-|||0
A 20 21|||S|||健|||REQUIRED|||-NONE-|||0
S 这 样 做 会 避 免 受 到 沙 尘 暴 。
T0-A0 这 样 做 会 避 免 受 到 沙 尘 暴 的 危 害 。
A 11 11|||M|||的 危 害|||REQUIRED|||-NONE-|||0
S 最 后 , 要 关 主 一 些 关 于 天 气 预 报 的 新 闻 。
T0-A0 最 后 , 要 关 注 一 些 关 于 天 气 预 报 的 新 闻 。
A 5 6|||S|||注|||REQUIRED|||-NONE-|||0
S 中 国 , 悠 久 的 历 史 , 灿 烂 的 文 化 , 真 是 在 历 史 上 最 难 忘 的 国 家 。
T0-A0 中 国 , 拥 有 悠 久 的 历 史 , 灿 烂 的 文 化 , 真 是 在 历 史 上 让 人 最 难 忘 的 国 家 。
A 3 3|||M|||拥 有|||REQUIRED|||-NONE-|||0
A 21 21|||M|||让 人|||REQUIRED|||-NONE-|||0
S 对 一 个 生 名 来 说 空 气 污 染 是 很 危 害 的 问 题 , 对 身 体 不 好 。
T0-A0 对 一 个 生 命 来 说 空 气 污 染 是 有 很 大 危 害 的 问 题 , 对 身 体 不 好 。
A 4 5|||S|||命|||REQUIRED|||-NONE-|||0
A 12 12|||M|||有|||REQUIRED|||-NONE-|||0
A 13 13|||M|||大|||REQUIRED|||-NONE-|||0
T1-A0 对 一 个 生 命 来 说 空 气 污 染 是 很 有 危 害 的 , 对 身 体 不 好 。
A 4 5|||S|||命|||REQUIRED|||-NONE-|||1
A 13 13|||M|||有|||REQUIRED|||-NONE-|||1
A 16 18|||R|||-NONE-|||REQUIRED|||-NONE-|||1
S 冬阴功 是 泰国 最 著名 的 菜 之一 , 它 虽然 不 是 很 豪华 , 但 它 的 味 确实 让 人 上瘾 , 做法 也 不 难 、 不 复杂 。
T0-A0 冬阴功 是 泰国 最 著名 的 菜 之一 , 虽然 它 不 是 很 豪华 , 但 它 的 味 确实 让 人 上瘾 , 做法 也 不 难 、 不 复杂 。
A 9 11|||W|||虽然 它|||REQUIRED|||-NONE-|||0
S 首先 , 我们 得 准备 : 大虾 六 到 九 只 、 盐 一 茶匙 、 已 搾好 的 柠檬汁 三 汤匙 、 泰国 柠檬叶 三 叶 、 柠檬 香草 一 根 、 鱼 酱 两 汤匙 、 辣椒 6 粒 , 纯净水 4 量 杯 、 香菜 半量 杯 和 草菇 10 个 。
T0-A0 首先 , 我们 得 准备 : 大虾 六 到 九 只 、 盐 一 茶匙 、 已 榨 好 的 柠檬汁 三 汤匙 、 泰国 柠檬叶 三 叶 、 柠檬 香草 一 根 、 鱼 酱 两 汤匙 、 辣椒 六 粒 , 纯净水 四 量 杯 、 香菜 半量 杯 和 草菇 十 个 。
A 17 18|||S:SPELL|||榨 好|||REQUIRED|||-NONE-|||0
A 39 40|||S:NUM|||六|||REQUIRED|||-NONE-|||0
A 43 44|||S:NUM|||四|||REQUIRED|||-NONE-|||0
A 52 53|||S:NUM|||十|||REQUIRED|||-NONE-|||0
S 这样 , 你 就 会 尝 到 泰国 人 死 爱 的 味道 。
T0-A0 这样 , 你 就 会 尝 到 泰国 人 爱 死 的 味道 。
A 9 11|||W|||爱 死|||REQUIRED|||-NONE-|||0
S 另外 , 冬阴功 对 外国人 的 喜爱 不断 地 增加 。
T0-A0 另外 , 外国人 对 冬阴功 的 喜爱 不断 地 增加 。
A 2 5|||W|||外国人 对 冬阴功|||REQUIRED|||-NONE-|||0
S 这部 电影 不仅 是 国内 , 在 国外 也 很 有名 。
T0-A0 这部 电影 不仅 是 在 国内 , 在 国外 也 很 有名 。
A 4 4|||M:PREP|||在|||REQUIRED|||-NONE-|||0
T1-A0 这部 电影 不仅 在 国内 , 在 国外 也 很 有名 。
A 3 4|||S:PREP|||在|||REQUIRED|||-NONE-|||1
S 不管 是 真正 的 冬 阴功 还是 电影 的 “ 冬 阴功 ” , 都 在 人们 的 心里 刻骨铭心 。
T0-A0 不管 是 真正 的 冬 阴功 还是 电影 的 “ 冬 阴功 ” , 人们 都 刻骨铭心 。
A 14 16|||R:OTHER|||-NONE-|||REQUIRED|||-NONE-|||0
A 17 19|||S:ADV|||都|||REQUIRED|||-NONE-|||0
T1-A0 不管 是 真正 的 冬 阴功 还是 电影 中 的 “ 冬 阴功 ” , 都 使 人们 刻骨铭心 。
A 8 8|||M:NOUN|||中|||REQUIRED|||-NONE-|||1
A 15 16|||S:VERB|||使|||REQUIRED|||-NONE-|||1
A 17 19|||R:OTHER|||-NONE-|||REQUIRED|||-NONE-|||1
S 随着 中国 经济 突飞猛近 , 建造 工业 与日俱增 。
T0-A0 随着 中国 经济 突飞猛进 , 建造 工业 与日俱增 。
A 3 4|||S:SPELL|||突飞猛进|||REQUIRED|||-NONE-|||0
S 虽然 工业 的 发展 和 城市 规模 的 扩大 对 经济 发展 有 积极 作用 , 但是 同时 也 对 环境 问题 日益 严重 造成 了 空气 污染 问题 。
T0-A0 虽然 工业 的 发展 和 城市 规模 的 扩大 对 经济 发展 有 积极 作用 , 但是 同时 也 对 环境 造成 了 日益 严重 的 空气 污染 问题 。
A 21 22|||S:OTHER|||造成 了|||REQUIRED|||-NONE-|||0
A 24 26|||S:AUX|||的|||REQUIRED|||-NONE-|||0
T1-A0 虽然 工业 的 发展 和 城市 规模 的 扩大 对 经济 发展 有 积极 作用 , 但是 同时 也 对 环境 造成 了 日益 严重 的 污染 问题 。
A 21 22|||S:OTHER|||造成 了|||REQUIRED|||-NONE-|||1
A 24 27|||S:AUX|||的|||REQUIRED|||-NONE-|||1
S 那些 空气 污染 也 没有 助于 人生 的 身体 建康 。
T0-A0 那些 空气 污染 也 无助于 人 的 身体 健康 。
A 4 7|||S:OTHER|||无助于 人|||REQUIRED|||-NONE-|||0
A 9 10|||S:SPELL|||健康|||REQUIRED|||-NONE-|||0
S 由此可见 , 首先 我们 要 了解 一些 关于 空气 污染 对 我们 人生 有 什么 危害 的 话题 知道 了 这些 常识 以后 对 我们 人类 会 有 积极 作用 。 以及 要 学会 怎样 应对 和 治理 空气 污染 的 问题 。
T0-A0 由此可见 , 首先 我们 要 了解 一些 关于 空气 污染 对 我们 人体 有 什么 危害 的 话题 —— 知道 这些 常识 对 我们 人类 会 有 积极 作用 , 以及 要 学会 怎样 应对 和 治理 空气 污染 的 问题 。
A 12 13|||S:NOUN|||人体|||REQUIRED|||-NONE-|||0
A 18 18|||M:PUNCT|||——|||REQUIRED|||-NONE-|||0
A 19 20|||R:AUX|||-NONE-|||REQUIRED|||-NONE-|||0
A 22 23|||R:NOUN|||-NONE-|||REQUIRED|||-NONE-|||0
A 30 31|||S:PUNCT|||,|||REQUIRED|||-NONE-|||0
T1-A0 由此可见 , 首先 我们 要 了解 一些 关于 空气 污染 对 我们 人体 有 什么 危害 的 话题 —— 知道 这些 常识 对 我们 人类 会 有 积极 作用 , 其次 要 学会 怎样 应对 和 治理 空气 污染 的 问题 。
A 12 13|||S:NOUN|||人体|||REQUIRED|||-NONE-|||1
A 18 18|||M:PUNCT|||——|||REQUIRED|||-NONE-|||1
A 19 20|||R:AUX|||-NONE-|||REQUIRED|||-NONE-|||1
A 22 23|||R:NOUN|||-NONE-|||REQUIRED|||-NONE-|||1
A 30 31|||S:PUNCT|||,|||REQUIRED|||-NONE-|||1
A 31 32|||S:CONJ|||其次|||REQUIRED|||-NONE-|||1
S 任何 事情 都 是 各 有 利弊 , 众所周知 越 建立 工业 越 对 经济 方面 有所 发展 。
T0-A0 任何 事情 都 是 各 有 利弊 , 众所周知 越 发展 工业 , 经济 方面 就 越 有所 发展 。
A 10 11|||S:VERB|||发展|||REQUIRED|||-NONE-|||0
A 12 14|||S:PUNCT|||,|||REQUIRED|||-NONE-|||0
A 16 16|||M:OTHER|||就 越|||REQUIRED|||-NONE-|||0
T1-A0 任何 事情 都 是 各 有 利弊 的 , 众所周知 越 发展 工业 , 经济 方面 就 越 有所 发展 。
A 7 7|||M:AUX|||的|||REQUIRED|||-NONE-|||1
A 10 11|||S:VERB|||发展|||REQUIRED|||-NONE-|||1
A 12 14|||S:PUNCT|||,|||REQUIRED|||-NONE-|||1
A 16 16|||M:OTHER|||就 越|||REQUIRED|||-NONE-|||1
S 对 我 看来 , 曼古 空气 污染 的 问题 与日俱增 。
T0-A0 在 我 看来 , 曼古 空气 污染 的 问题 与日俱增 。
A 0 1|||S:PREP|||在|||REQUIRED|||-NONE-|||0
S 每天 会 有 不少 的 毒 气体 泄漏 从 工厂 里 出来 。
T0-A0 每天 会 有 不少 的 有毒 气体 从 工厂 里 泄漏 出来 。
A 5 6|||S:VERB|||有毒|||REQUIRED|||-NONE-|||0
A 7 11|||W|||从 工厂 里 泄漏|||REQUIRED|||-NONE-|||0
T1-A0 每天 会 有 不少 的 有毒 气体 从 工厂 里 泄露 出来 。
A 5 6|||S:VERB|||有毒|||REQUIRED|||-NONE-|||1
A 7 11|||W|||从 工厂 里 泄露|||REQUIRED|||-NONE-|||1
S 在 工厂 里 的 工作 人员 为了 工作 , 而 每天 吸 了 不少 的 毒气体 , 经过 了 一 年 多 的 时间 , 连 工作 人员 也 得了 严重 的 病 。 更 不用 说 住 在 这家 工厂 近 的 家庭 。
T0-A0 在 工厂 里 的 工作 人员 为了 工作 , 每天 吸 了 不少 的 有毒 气体 , 经过 了 一 年 多 的 时间 , 连 工作 人员 也 得了 严重 的 病 , 更 不用 说 住 得 离 这家 工厂 近 的 家庭 。
A 9 10|||R:CONJ|||-NONE-|||REQUIRED|||-NONE-|||0
A 15 16|||S:OTHER|||有毒 气体|||REQUIRED|||-NONE-|||0
A 33 34|||S:PUNCT|||,|||REQUIRED|||-NONE-|||0
A 38 39|||S:OTHER|||得 离|||REQUIRED|||-NONE-|||0
T1-A0 在 工厂 里 的 工作 人员 为了 工作 , 每天 吸 了 不少 的 有毒 气体 , 经过 了 一 年 多 的 时间 , 连 工作 人员 也 得了 严重 的 病 , 更 不用说 住 在 这家 工厂 附近 的 家庭 。
A 9 10|||R:CONJ|||-NONE-|||REQUIRED|||-NONE-|||1
A 15 16|||S:OTHER|||有毒 气体|||REQUIRED|||-NONE-|||1
A 33 34|||S:PUNCT|||,|||REQUIRED|||-NONE-|||1
A 41 42|||S:NOUN|||附近|||REQUIRED|||-NONE-|||1
S 沙尘暴 也 是 一 类 空气 污染 之一 。
T0-A0 沙尘暴 也 是 一 类 空气 污染 。
A 7 8|||R:PRON|||-NONE-|||REQUIRED|||-NONE-|||0
T1-A0 沙尘暴 也 是 空气 污染 之一 。
A 3 5|||R:OTHER|||-NONE-|||REQUIRED|||-NONE-|||1
S 不 官 是 从 口 、 眼 、 鼻子 进去 这样 会 伤害 身体 的 建康 。
T0-A0 不管 是 从 口 、 眼 还是 鼻子 进去 , 都 会 伤害 身体 的 健康 。
A 0 2|||S:SPELL|||不管|||REQUIRED|||-NONE-|||0
A 7 8|||S:CONJ|||还是|||REQUIRED|||-NONE-|||0
A 10 11|||S:OTHER|||, 都|||REQUIRED|||-NONE-|||0
A 15 16|||S:SPELL|||健康|||REQUIRED|||-NONE-|||0
S 这样 做 会 避免 受到 沙尘暴 。
T0-A0 这样 做 会 避免 受到 沙尘暴 的 危害 。
A 6 6|||M:OTHER|||的 危害|||REQUIRED|||-NONE-|||0
S 最后 , 要 关主 一些 关于 天气 预报 的 新闻 。
T0-A0 最后 , 要 关注 一些 关于 天气 预报 的 新闻 。
A 3 4|||S:SPELL|||关注|||REQUIRED|||-NONE-|||0
S 中国 , 悠久 的 历史 , 灿烂 的 文化 , 真是 在 历史 上 最 难忘 的 国家 。
T0-A0 中国 , 拥有 悠久 的 历史 , 灿烂 的 文化 , 真是 在 历史 上 让 人 最 难忘 的 国家 。
A 2 2|||M:VERB|||拥有|||REQUIRED|||-NONE-|||0
A 14 14|||M:OTHER|||让 人|||REQUIRED|||-NONE-|||0
S 对 一个 生名 来说 空气 污染 是 很 危害 的 问题 , 对 身体 不好 。
T0-A0 对 一个 生命 来说 空气 污染 是 有 很 大 危害 的 问题 , 对 身体 不好 。
A 2 3|||S:SPELL|||生命|||REQUIRED|||-NONE-|||0
A 7 7|||M:VERB|||有|||REQUIRED|||-NONE-|||0
A 8 8|||M:ADJ|||大|||REQUIRED|||-NONE-|||0
T1-A0 对 一个 生命 来说 空气 污染 是 很 有 危害 的 , 对 身体 不好 。
A 2 3|||S:SPELL|||生命|||REQUIRED|||-NONE-|||1
A 8 8|||M:VERB|||有|||REQUIRED|||-NONE-|||1
A 10 11|||R:NOUN|||-NONE-|||REQUIRED|||-NONE-|||1
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
<!DOCTYPE html>
<html>
<head>
<title>CSV评估系统</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
line-height: 1.6;
padding: 20px;
background: #f5f5f5;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 30px;
background: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
h2 {
color: #333;
margin-bottom: 20px;
}
.upload-form {
display: flex;
gap: 10px;
margin-bottom: 20px;
}
input[type="file"] {
flex: 1;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
}
button {
padding: 8px 20px;
background: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
transition: opacity 0.2s;
}
button:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.processing {
color: #ff6b6b;
margin: 10px 0;
font-weight: bold;
}
.result {
margin-top: 20px;
padding: 15px;
background: #f8f9fa;
border-radius: 4px;
white-space: pre-wrap;
}
.error {
color: #dc3545;
font-weight: bold;
}
.hidden {
display: none;
}
</style>
</head>
<body>
<div class="container">
<h2>CSV评估系统</h2>
<form id="uploadForm" class="upload-form">
<input type="file"
id="fileInput"
accept=".csv"
required>
<button type="submit" id="submitBtn">提交评估</button>
</form>
<div id="processing" class="processing hidden">
正在处理文件,请等待...
</div>
<div id="result" class="result hidden"></div>
</div>
<script>
const form = document.getElementById('uploadForm');
const fileInput = document.getElementById('fileInput');
const submitBtn = document.getElementById('submitBtn');
const processingDiv = document.getElementById('processing');
const resultDiv = document.getElementById('result');
let isProcessing = false;
async function handleSubmit(e) {
e.preventDefault();
if(isProcessing) {
alert('正在处理文件,请等待...');
return;
}
const file = fileInput.files[0];
if(!file) {
alert('请选择CSV文件');
return;
}
const formData = new FormData();
formData.append('file', file);
startProcessing();
try {
const response = await fetch('/evaluate', {
method: 'POST',
body: formData
});
const data = await response.json();
showResult(data);
} catch (error) {
showError('上传处理失败: ' + error.message);
} finally {
stopProcessing();
}
}
function startProcessing() {
isProcessing = true;
submitBtn.disabled = true;
fileInput.disabled = true;
processingDiv.classList.remove('hidden');
resultDiv.classList.add('hidden');
}
function stopProcessing() {
isProcessing = false;
submitBtn.disabled = false;
fileInput.disabled = false;
processingDiv.classList.add('hidden');
}
function showResult(data) {
resultDiv.classList.remove('hidden');
if(data.error) {
resultDiv.innerHTML = `<div class="error">错误: ${data.error}</div>`;
} else {
resultDiv.textContent = data.result;
}
}
function showError(message) {
resultDiv.classList.remove('hidden');
resultDiv.innerHTML = `<div class="error">${message}</div>`;
}
form.addEventListener('submit', handleSubmit);
</script>
</body>
</html>
\ No newline at end of file
MuCGEC @ 39221934
Subproject commit 39221934ee4ccf07801879136a75dd7e11319977
This source diff could not be displayed because it is too large. You can view the blob instead.
import pandas as pd
def analyze_csv(filepath):
# 读取CSV文件
df = pd.read_csv(filepath)
# 1. 计算所有错误内容节选的总字数
total_chars = df['错误内容节选'].str.len().sum()
# 2. 计算未引用文本的错误内容节选字数
no_quote_chars = df[df['是否引用文章节选(0/1)'] != 1]['错误内容节选'].str.len().sum()
print(f'总字数: {total_chars}')
print(f'未引用文本字数: {no_quote_chars}')
# 使用文件路径
filepath = '/nfs/zhanghanhaodi/HHDZ_projects/full_book_evaluate/battle_data/202501_book1.csv'
analyze_csv(filepath)
def analyze_csv(filepath):
df = pd.read_csv(filepath)
# 所有文字
total_stats = df[['文字扣分', '词语扣分', '语法扣分', '标点扣分']].sum()
total_all = total_stats.sum()
print('全部文字扣分统计:')
print(f'文字扣分: {total_stats["文字扣分"]:.2f}')
print(f'词语扣分: {total_stats["词语扣分"]:.2f}')
print(f'语法扣分: {total_stats["语法扣分"]:.2f}')
print(f'标点扣分: {total_stats["标点扣分"]:.2f}')
print(f'总扣分: {total_all:.2f}')
# 非引用文字
no_quote_df = df[df['是否引用文章节选(0/1)'] != 1]
no_quote_stats = no_quote_df[['文字扣分', '词语扣分', '语法扣分', '标点扣分']].sum()
no_quote_total = no_quote_stats.sum()
print('\n非引用文字扣分统计:')
print(f'文字扣分: {no_quote_stats["文字扣分"]:.2f}')
print(f'词语扣分: {no_quote_stats["词语扣分"]:.2f}')
print(f'语法扣分: {no_quote_stats["语法扣分"]:.2f}')
print(f'标点扣分: {no_quote_stats["标点扣分"]:.2f}')
print(f'总扣分: {no_quote_total:.2f}')
filepath = '/nfs/zhanghanhaodi/HHDZ_projects/full_book_evaluate/battle_data/202501_book1.csv'
analyze_csv(filepath)
# def process_csv(input_filepath, output_filepath):
# # 读取CSV文件
# df = pd.read_csv(input_filepath)
# # 筛选未引用的内容
# no_quote_df = df[df['是否引用文章节选(0/1)'] != 1]
# # 保存到新的CSV文件
# no_quote_df.to_csv(output_filepath, index=False)
# # 打印统计信息
# total_chars = no_quote_df['错误内容节选'].str.len().sum()
# print(f'未引用文本总字数: {total_chars}')
# print(f'未引用文本行数: {len(no_quote_df)}')
# input_file = '/nfs/zhanghanhaodi/HHDZ_projects/full_book_evaluate/battle_data/202501_book1.csv'
# output_file = '/nfs/zhanghanhaodi/HHDZ_projects/full_book_evaluate/battle_data/202501_book1_no_quote.csv'
# process_csv(input_file, output_file)
# def split_sentences(text):
# """
# 将文本分割成单独的句子,处理中文引号对和换行符
# """
# if pd.isna(text):
# return []
# text = str(text).strip()
# if not text:
# return []
# # 先按换行符分割
# paragraphs = text.split('\n')
# sentences = []
# for paragraph in paragraphs:
# current_sentence = ''
# in_quotes = False
# quote_stack = []
# for char in paragraph.strip():
# current_sentence += char
# if char == '“':
# in_quotes = True
# quote_stack.append('“')
# elif char == '”':
# if quote_stack and quote_stack[-1] == '“':
# quote_stack.pop()
# if not quote_stack:
# in_quotes = False
# elif char in '。!?' and not in_quotes:
# sentences.append(current_sentence.strip())
# current_sentence = ''
# if current_sentence.strip():
# sentences.append(current_sentence.strip())
# return sentences
# def process_samples(file_path):
# df = pd.read_csv(file_path, encoding='utf-8-sig')
# new_samples = []
# total_error_sentences = 0
# total_correct_sentences = 0
# for index, row in df.iterrows():
# error_sentences = split_sentences(row['错误内容节选'])
# correct_sentences = split_sentences(row['纠正后的内容【注意标点符号全半角的问题】'])
# total_error_sentences += len(error_sentences)
# total_correct_sentences += len(correct_sentences)
# # 取两个列表中较长的那个长度
# max_len = max(len(error_sentences), len(correct_sentences))
# # 如果长度不一致,用空字符串填充较短的列表
# if len(error_sentences) < max_len:
# error_sentences.extend([''] * (max_len - len(error_sentences)))
# if len(correct_sentences) < max_len:
# correct_sentences.extend([''] * (max_len - len(correct_sentences)))
# for err_sent, corr_sent in zip(error_sentences, correct_sentences):
# new_row = row.copy()
# new_row['错误内容节选'] = err_sent
# new_row['纠正后的内容【注意标点符号全半角的问题】'] = corr_sent
# new_samples.append(new_row)
# new_df = pd.DataFrame(new_samples)
# output_path = '202501_book1_no_quote_split.csv'
# new_df.to_csv(output_path, index=False, encoding='utf-8-sig')
# print(f"原始样本数: {len(df)}")
# print(f"错误句子总数: {total_error_sentences}")
# print(f"正确句子总数: {total_correct_sentences}")
# print(f"处理后样本数: {len(new_df)}")
# return new_df
# try:
# processed_df = process_samples('battle_data/202501_book1_no_quote.csv')
# except Exception as e:
# print(f"处理过程中出现错误: {e}")
# import pandas as pd
# def process_csv(file_path):
# # 读取CSV
# df = pd.read_csv(file_path, encoding='utf-8-sig')
# # 删除错误内容节选为空的行
# df = df.dropna(subset=['错误内容节选'])
# # 对比文本并更新扣分
# mask = df['错误内容节选'] == df['纠正后的内容【注意标点符号全半角的问题】']
# df.loc[mask, ['文字扣分', '词语扣分', '语法扣分', '标点扣分']] = 0
# # 保存结果
# output_path = 'evaluate_data.csv'
# df.to_csv(output_path, index=False, encoding='utf-8-sig')
# print(f"原始行数: {len(df)}")
# print(f"处理后行数: {len(df)}")
# print(f"已保存到: {output_path}")
# return df
# try:
# df = process_csv('battle_data/202501_book1_no_quote_split_recheck.csv')
# except Exception as e:
# print(f"错误: {e}")
# import pandas as pd
# def extract_text(input_path, output_path):
# # 读取原CSV
# df = pd.read_csv(input_path, encoding='utf-8-sig')
# # 创建新DataFrame只包含错误内容节选列并重命名
# new_df = pd.DataFrame()
# new_df['ori_text'] = df['错误内容节选']
# # 保存结果
# new_df.to_csv(output_path, index=False, encoding='utf-8-sig')
# print(f"提取的行数: {len(new_df)}")
# try:
# extract_text('evaluate_data.csv', 'ori_text_data.csv')
# except Exception as e:
# print(f"错误: {e}")
import pandas as pd
import json
def merge_data(result_path, evaluate_path, output_path):
# 读取文件
result_df = pd.read_csv(result_path, encoding='utf-8-sig')
evaluate_df = pd.read_csv(evaluate_path, encoding='utf-8-sig')
# 解析生成结果JSON,提取字词部分
result_df['字词结果'] = result_df['生成结果'].apply(lambda x: json.loads(x)['字词'])
result_df['标点结果'] = result_df['生成结果'].apply(lambda x: json.loads(x)['标点'])
result_df['语法结果'] = result_df['生成结果'].apply(lambda x: json.loads(x)['语法'])
# 选择需要的列创建新DataFrame
new_df = pd.DataFrame({
'错误内容': evaluate_df['错误内容节选'],
'正确内容': evaluate_df['纠正后的内容【注意标点符号全半角的问题】'],
'字词结果': result_df['字词结果'],
'标点结果': result_df['标点结果'],
'语法结果': result_df['语法结果'],
'文字扣分': evaluate_df['文字扣分'],
'词语扣分': evaluate_df['词语扣分'],
'语法扣分': evaluate_df['语法扣分'],
'标点扣分': evaluate_df['标点扣分']
})
# 保存结果
new_df.to_csv('merged_data.csv', index=False, encoding='utf-8-sig')
try:
merge_data('/nfs/zhanghanhaodi/HHDZ_projects/full_book_evaluate/result_data/result (7).csv', 'evaluate_data.csv', 'merged_data.csv')
except Exception as e:
print(f"错误: {e}")
\ No newline at end of file
This diff is collapsed. Click to expand it.
import requests
API_BASE1 = "http://8.209.215.15/api/openai/v1/chat/completions"
API_BASE2 = "https://api.openai.com/v1"
API_BASE3 = "http://47.251.63.29:8083/api/openai/"
OPENAI_API_KEY0 = "sk-svcacct-Cnz3hjiTXZzXuwUXnThVSyjPSC66byKALZzJrUOOcUOjT3BlbkFJn2b1V5pfBMdx_M52dW_o9oPp1q-uXdwz4fUwouuXRWZJgA"
OPENAI_API_KEY1 = "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"
OPENAI_API_KEY2 = "sk-ling-agent-server-efdvHRcWdNWo5ftZ88vxT3BlbkFJUgWXoYOeRKnsIfpa5TKN"
# 配置 OpenAI API 密钥和代理 URL
# openai_key = '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'
# openai_proxy_url = 'http://47.251.70.106:8080/proxy/v1.0/chatgpt/chat'
# openai_proxy_url_v2 = 'https://api.gptsapi.net/v1/chat/completions'
openai_key = OPENAI_API_KEY1
openai_proxy_url = API_BASE1
def call_openai_api(prompt, use_v2=False):
"""
调用 OpenAI API,获取模型的响应。
参数:
- prompt: 用户输入的提示信息。
- use_v2: 是否使用 openai_proxy_url_v2。
返回:
- 模型的响应内容。
"""
# 选择使用的代理 URL
url = openai_proxy_url
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {openai_key}'
}
# 构建请求数据
data = {
'model': 'gpt-3.5-turbo', # 可以根据需要更改模型名称
'messages': [
{'role': 'user', 'content': prompt}
],
'temperature': 0.7,
'max_tokens': 150,
'n': 1,
'stop': None,
}
try:
# 发送 POST 请求
response = requests.post(url, headers=headers, json=data)
response.raise_for_status() # 如果响应状态码不是 200,抛出异常
# 解析响应数据
result = response.json()
content = result['choices'][0]['message']['content']
return content.strip()
except requests.exceptions.HTTPError as http_err:
print(f"HTTP 错误:{http_err}")
except Exception as err:
print(f"其他错误:{err}")
return None
# 示例用法
if __name__ == "__main__":
prompt = "请为我写一首关于春天的诗。"
response = call_openai_api(prompt)
if response:
print("模型的回答:")
print(response)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment