Как вы заказываете аннотации по смещению в Brat?
При использовании инструмента быстрого аннотатора создается впечатление, что созданный файл аннотаций будет представлять аннотацию в том порядке, в котором аннотации были выполнены пользователем. Если вы начинаете с начала документа и до конца выполняете аннотацию, то аннотации, естественно, будут в правильном порядке смещения. Однако, если вам нужно перейти к документу раньше и добавить еще одну аннотацию, порядок смещения аннотаций в выходном файле.ann будет не в порядке.
Как тогда вы можете переставить файл.ann так, чтобы аннотации были в порядке смещения, когда вы закончите? Есть ли какая-то опция в brat, которая позволяет вам делать это, или это то, что нужно написать свой собственный скрипт для выполнения?
1 ответ
Ничего не слыша, я написал скрипт на python, чтобы выполнить то, что я намеревался сделать. Сначала я переупорядочиваю все аннотации по индексу начала. Во-вторых, я повторно упорядочиваю номера меток, чтобы они снова оказались в порядке возрастания.
import optparse, sys
splitchar1 = '\t'
splitchar2 = ' '
# for brat, overlapped is not permitted (or at least a warning is generated)
# we could use this simplification in sorting by simply sorting on begin. it is
# probably a good idea anyway.
class AnnotationRecord:
label = 'T0'
type = ''
begin = -1
end = -1
text = ''
def __repr__(self):
return self.label + splitchar1 + self.type + splitchar2 + str(self.begin) + splitchar2 + str(self.end) + splitchar1 + self.text
def create_record(parts):
record = AnnotationRecord()
record.label = parts[0]
middle_parts = parts[1].split(splitchar2)
record.type = middle_parts[0]
record.begin = middle_parts[1]
record.end = middle_parts[2]
record.text = parts[2]
return record
def main(filename, out_filename):
fo = open(filename, 'r')
lines = fo.readlines()
fo.close()
annotation_records = []
for line in lines:
parts = line.split(splitchar1)
annotation_records.append(create_record(parts))
# sort based upon begin
sorted_annotation_records = sorted(annotation_records, key=lambda a: int(a.begin))
# now relabel based upon the sorted order
label_value = 1
for sorted_record in sorted_annotation_records:
sorted_record.label = 'T' + str(label_value)
label_value += 1
# now write the resulting file to disk
fo = open(out_filename, 'w')
for sorted_record in sorted_annotation_records:
fo.write(sorted_record.__repr__())
fo.close()
#format of .ann file is T# Type Start End Text
#args are input file, output file
if __name__ == '__main__':
parser = optparse.OptionParser(formatter=optparse.TitledHelpFormatter(), usage=globals()['__doc__'], version='$Id$')
parser.add_option ('-v', '--verbose', action='store_true', default=False, help='verbose output')
(options, args) = parser.parse_args()
if len(args) < 2:
parser.error ('missing argument')
main(args[0], args[1])
sys.exit(0)