def generate_src_word_accuracy_report(ref, outs, src, ref_align_file=None, out_align_files=None,
                          acc_type='fmeas', bucket_type='freq', bucket_cutoffs=None,
                          freq_count_file=None, freq_corpus_file=None,
                          label_set=None,
                          src_labels=None,
                          title=None,
                          case_insensitive=False):
  """
  Generate a report for source word analysis in both plain text and graphs.

  Args:
    ref: Tokens from the reference
    outs: Tokens from the output file(s)
    src: Tokens from the source
    ref_align_file: Alignment file for the reference
    out_align_files: Alignment file for the output file
    acc_type: The type of accuracy to show (prec/rec/fmeas). Can also have multiple separated by '+'.
    bucket_type: A string specifying the way to bucket words together to calculate F-measure (freq/tag)
    bucket_cutoffs: The boundaries between buckets, specified as a colon-separated string.
    freq_corpus_file: When using "freq" as a bucketer, which corpus to use to calculate frequency.
                      By default this uses the frequency in the reference test set, but it's often more informative
                      se the frequency in the training set, in which case you specify the path of the target side
                      he training corpus.
    freq_count_file: An alternative to freq_corpus that uses a count file in "word\tfreq" format.
    src_labels: either a filename of a file full of source labels, or a list of strings corresponding to `ref`.
    title: A string specifying the caption of the printed table
    case_insensitive: A boolean specifying whether to turn on the case insensitive option
  """
  case_insensitive = True if case_insensitive == 'True' else False

  if not src or not ref_align_file or not out_align_files:
    raise ValueError("Must specify the source and the alignment files when performing source analysis.")

  ref_align = corpus_utils.load_tokens(ref_align_file) 
  out_aligns = [corpus_utils.load_tokens(x) for x in arg_utils.parse_files(out_align_files)]

  if len(out_aligns) != len(outs):
    raise ValueError(f'The number of output files should be equal to the number of output alignment files.')

  bucketer = bucketers.create_word_bucketer_from_profile(bucket_type,
                                                         bucket_cutoffs=bucket_cutoffs,
                                                         freq_count_file=freq_count_file,
                                                         freq_corpus_file=freq_corpus_file,
                                                         freq_data=src,
                                                         label_set=label_set,
                                                         case_insensitive=case_insensitive)
  src_labels = corpus_utils.load_tokens(src_labels) if type(src_labels) == str else src_labels
  matches = [bucketer.calc_source_bucketed_matches(src, ref, out, ref_align, out_align, src_labels=src_labels) for out, out_align in zip(outs, out_aligns)]

  reporter = reporters.WordReport(bucketer=bucketer, matches=matches,
                                  acc_type=acc_type, header="Source Word Accuracy Analysis", 
                                  title=title)
  reporter.generate_report(output_fig_file=f'src-word-acc',
                           output_fig_format='pdf', 
                           output_directory='outputs')
  return reporter 
def generate_word_accuracy_report(ref, outs,
                          acc_type='fmeas', bucket_type='freq', bucket_cutoffs=None,
                          freq_count_file=None, freq_corpus_file=None,
                          label_set=None,
                          ref_labels=None, out_labels=None,
                          title=None,
                          case_insensitive=False):
  """
  Generate a report comparing the word accuracy in both plain text and graphs.

  Args:
    ref: Tokens from the reference
    outs: Tokens from the output file(s)
    acc_type: The type of accuracy to show (prec/rec/fmeas). Can also have multiple separated by '+'.
    bucket_type: A string specifying the way to bucket words together to calculate F-measure (freq/tag)
    bucket_cutoffs: The boundaries between buckets, specified as a colon-separated string.
    freq_corpus_file: When using "freq" as a bucketer, which corpus to use to calculate frequency.
                      By default this uses the frequency in the reference test set, but it's often more informative
                      to use the frequency in the training set, in which case you specify the path of the
                      training corpus.
    freq_count_file: An alternative to freq_corpus that uses a count file in "word\tfreq" format.
    ref_labels: either a filename of a file full of reference labels, or a list of strings corresponding to `ref`.
    out_labels: output labels. must be specified if ref_labels is specified.
    title: A string specifying the caption of the printed table
    case_insensitive: A boolean specifying whether to turn on the case insensitive option
  """
  case_insensitive = True if case_insensitive == 'True' else False

  if out_labels is not None:
    out_labels = arg_utils.parse_files(out_labels)
    if len(out_labels) != len(outs):
      raise ValueError(f'The number of output files should be equal to the number of output labels.')

  bucketer = bucketers.create_word_bucketer_from_profile(bucket_type,
                                                         bucket_cutoffs=bucket_cutoffs,
                                                         freq_count_file=freq_count_file,
                                                         freq_corpus_file=freq_corpus_file,
                                                         freq_data=ref,
                                                         label_set=label_set,
                                                         case_insensitive=case_insensitive)
  ref_labels = corpus_utils.load_tokens(ref_labels) if type(ref_labels) == str else ref_labels
  out_labels = [corpus_utils.load_tokens(out_labels[i]) if not out_labels is None else None for i in range(len(outs))]
  matches = [bucketer.calc_bucketed_matches(ref, out, ref_labels=ref_labels, out_labels=out_label) for out, out_label in zip(outs, out_labels)]
  
  reporter = reporters.WordReport(bucketer=bucketer, matches=matches,
                                  acc_type=acc_type, header="Word Accuracy Analysis", 
                                  title=title)
  reporter.generate_report(output_fig_file=f'word-acc',
                           output_fig_format='pdf', 
                           output_directory='outputs')
  return reporter 
Exemple #3
0
def print_word_likelihood_report(ref,
                                 lls,
                                 bucket_type='freq',
                                 bucket_cutoffs=None,
                                 freq_count_file=None,
                                 freq_corpus_file=None,
                                 label_corpus=None,
                                 label_set=None,
                                 case_insensitive=False):
    """
  Print a report comparing the word log likelihood.

  Args:
  ref: the ref of words over which the likelihoods are computed
  lls: likelihoods corresponding to each word in ref from the systems
  bucket_type: A string specifying the way to bucket words together to calculate average likelihood
  bucket_cutoffs: The boundaries between buckets, specified as a colon-separated string.
  freq_corpus_file: When using "freq" as a bucketer, which corpus to use to calculate frequency.
  freq_count_file: An alternative to freq_corpus that uses a count file in "word\tfreq" format.
  label_corpus: When using "label" as bucket type, the corpus containing the labels
                corresponding to each word in the corpus
  label_set: the permissible set of labels when using "label" as a bucket type
  case_insensitive: A boolean specifying whether to turn on the case insensitive option
  """
    case_insensitive = True if case_insensitive == 'True' else False

    bucketer = bucketers.create_word_bucketer_from_profile(
        bucket_type=bucket_type,
        bucket_cutoffs=bucket_cutoffs,
        freq_count_file=freq_count_file,
        freq_corpus_file=freq_corpus_file,
        label_set=label_set,
        case_insensitive=case_insensitive)

    if type(label_corpus) == str:
        label_corpus = corpus_utils.load_tokens(label_corpus)

    if label_corpus is not None:
        ref = label_corpus

    lls_out = [[l for l in bucketer.calc_bucketed_likelihoods(ref, ll)]
               for ll in lls]

    print(f'--- average word log likelihood by {bucketer.name()} bucket')
    for i, bucket_str in enumerate(bucketer.bucket_strs):
        print(bucket_str + "\t", end='')
        for ll_out in lls_out:
            print(f"{formatting.fmt(ll_out[i])}\t", end="")
        print()
Exemple #4
0
def generate_src_word_accuracy_report(ref,
                                      outs,
                                      src,
                                      ref_align_file=None,
                                      acc_type='rec',
                                      bucket_type='freq',
                                      bucket_cutoffs=None,
                                      freq_count_file=None,
                                      freq_corpus_file=None,
                                      label_set=None,
                                      src_labels=None,
                                      title=None,
                                      case_insensitive=False,
                                      output_bucket_details=False,
                                      to_cache=False,
                                      cache_dicts=None):
    """
  Generate a report for source word analysis in both plain text and graphs.

  Args:
    ref: Tokens from the reference
    outs: Tokens from the output file(s)
    src: Tokens from the source
    ref_align_file: Alignment file for the reference
    acc_type: The type of accuracy to show (prec/rec/fmeas). Can also have multiple separated by '+'.
    bucket_type: A string specifying the way to bucket words together to calculate F-measure (freq/tag)
    bucket_cutoffs: The boundaries between buckets, specified as a colon-separated string.
    freq_corpus_file: When using "freq" as a bucketer, which corpus to use to calculate frequency.
                      By default this uses the frequency in the reference test set, but it's often more informative
                      se the frequency in the training set, in which case you specify the path of the target side
                      he training corpus.
    freq_count_file: An alternative to freq_corpus that uses a count file in "word\tfreq" format.
    src_labels: either a filename of a file full of source labels, or a list of strings corresponding to `ref`.
    title: A string specifying the caption of the printed table
    case_insensitive: A boolean specifying whether to turn on the case insensitive option
    output_bucket_details: A boolean specifying whether to output the number of words in each bucket
    to_cache: Return a list of computed statistics if True
    cache_dicts: A list of dictionaries that store cached statistics for each output
  """
    # check and set parameters
    if type(case_insensitive) == str:
        case_insensitive = True if case_insensitive == 'True' else False
    if type(output_bucket_details) == str:
        output_bucket_details = True if output_bucket_details == 'True' else False

    if acc_type != 'rec':
        raise ValueError(
            "Source word analysis can only use recall as an accuracy type")
    if not src or not ref_align_file:
        raise ValueError(
            "Must specify the source and the alignment file when performing source analysis."
        )
    if type(src_labels) == str:
        src_labels = corpus_utils.load_tokens(src_labels)

    ref_align = corpus_utils.load_alignments(ref_align_file)

    # compute statistics
    bucketer = bucketers.create_word_bucketer_from_profile(
        bucket_type,
        bucket_cutoffs=bucket_cutoffs,
        freq_count_file=freq_count_file,
        freq_corpus_file=freq_corpus_file,
        freq_data=src,
        label_set=label_set,
        case_insensitive=case_insensitive)

    cache_key_list = [
        'statistics', 'my_ref_total_list', 'my_out_totals_list',
        'my_out_matches_list'
    ]
    statistics, my_ref_total_list, my_out_totals_list, my_out_matches_list = cache_utils.extract_cache_dicts(
        cache_dicts, cache_key_list, len(outs))
    if cache_dicts is not None:
        my_ref_total_list = my_ref_total_list[0]
        my_out_totals_list = list(np.concatenate(my_out_totals_list, 1))
        my_out_matches_list = list(np.concatenate(my_out_matches_list, 1))
    else:
        statistics, my_ref_total_list, my_out_totals_list, my_out_matches_list = bucketer.calc_statistics(
            ref, outs, src=src, src_labels=src_labels, ref_aligns=ref_align)
    examples = bucketer.calc_examples(len(ref), len(outs), statistics,
                                      my_ref_total_list, my_out_matches_list)

    bucket_cnts, bucket_intervals = bucketer.calc_bucket_details(
        my_ref_total_list, my_out_totals_list,
        my_out_matches_list) if output_bucket_details else (None, None)

    if to_cache:
        cache_dict = cache_utils.return_cache_dict(cache_key_list, [
            statistics, [my_ref_total_list], [my_out_totals_list],
            [my_out_matches_list]
        ])
        return cache_dict

    # generate reports
    reporter = reporters.WordReport(bucketer=bucketer,
                                    statistics=statistics,
                                    examples=examples,
                                    bucket_cnts=bucket_cnts,
                                    bucket_intervals=bucket_intervals,
                                    src_sents=src,
                                    ref_sents=ref,
                                    ref_aligns=ref_align,
                                    out_sents=outs,
                                    src_labels=src_labels,
                                    acc_type=acc_type,
                                    header="Source Word Accuracy Analysis",
                                    title=title)

    reporter.generate_report(output_fig_file=f'src-word-acc',
                             output_fig_format='pdf',
                             output_directory='outputs')
    return reporter
Exemple #5
0
def generate_word_accuracy_report(ref,
                                  outs,
                                  src=None,
                                  acc_type='fmeas',
                                  bucket_type='freq',
                                  bucket_cutoffs=None,
                                  freq_count_file=None,
                                  freq_corpus_file=None,
                                  label_set=None,
                                  ref_labels=None,
                                  out_labels=None,
                                  title=None,
                                  case_insensitive=False,
                                  to_cache=False,
                                  cache_dicts=None):
    """
  Generate a report comparing the word accuracy in both plain text and graphs.

  Args:
    ref: Tokens from the reference
    outs: Tokens from the output file(s)
    src: Tokens from the source
    acc_type: The type of accuracy to show (prec/rec/fmeas). Can also have multiple separated by '+'.
    bucket_type: A string specifying the way to bucket words together to calculate F-measure (freq/tag)
    bucket_cutoffs: The boundaries between buckets, specified as a colon-separated string.
    freq_corpus_file: When using "freq" as a bucketer, which corpus to use to calculate frequency.
                      By default this uses the frequency in the reference test set, but it's often more informative
                      to use the frequency in the training set, in which case you specify the path of the
                      training corpus.
    freq_count_file: An alternative to freq_corpus that uses a count file in "word\tfreq" format.
    ref_labels: either a filename of a file full of reference labels, or a list of strings corresponding to `ref`.
    out_labels: output labels. must be specified if ref_labels is specified.
    title: A string specifying the caption of the printed table
    case_insensitive: A boolean specifying whether to turn on the case insensitive option
    to_cache: Return a list of computed statistics if True
    cache_dicts: A list of dictionaries that store cached statistics for each output
  """
    # check and set parameters
    if type(case_insensitive) == str:
        case_insensitive = True if case_insensitive == 'True' else False

    if type(ref_labels) == str:
        ref_labels = corpus_utils.load_tokens(ref_labels)
    if out_labels is not None:
        out_label_files = arg_utils.parse_files(out_labels)
        out_labels = [corpus_utils.load_tokens(x) for x in out_label_files]
        if len(out_labels) != len(outs):
            raise ValueError(
                f'The number of output files should be equal to the number of output labels.'
            )
        for i, (o, ol) in enumerate(zip(outs, out_labels)):
            if len(o) != len(ol):
                raise ValueError(
                    f'The labels in {out_label_files[i]} do not match the length of the output file {outs[i]}.'
                )

    # compute statistics
    bucketer = bucketers.create_word_bucketer_from_profile(
        bucket_type,
        bucket_cutoffs=bucket_cutoffs,
        freq_count_file=freq_count_file,
        freq_corpus_file=freq_corpus_file,
        freq_data=ref,
        label_set=label_set,
        case_insensitive=case_insensitive)

    cache_key_list = ['statistics', 'my_ref_total_list', 'my_out_matches_list']
    statistics, my_ref_total_list, my_out_matches_list = cache_utils.extract_cache_dicts(
        cache_dicts, cache_key_list, len(outs))
    if cache_dicts is None:
        statistics, my_ref_total_list, my_out_matches_list = bucketer.calc_statistics(
            ref, outs, ref_labels=ref_labels, out_labels=out_labels)
    else:
        my_ref_total_list = my_ref_total_list[0]
        my_out_matches_list = list(np.concatenate(my_out_matches_list, 1))
    examples = bucketer.calc_examples(len(ref), len(outs), statistics,
                                      my_ref_total_list, my_out_matches_list)

    if to_cache:
        cache_dict = cache_utils.return_cache_dict(
            cache_key_list,
            [statistics, [my_ref_total_list], [my_out_matches_list]])
        return cache_dict

    # generate reports
    reporter = reporters.WordReport(bucketer=bucketer,
                                    statistics=statistics,
                                    examples=examples,
                                    src_sents=src,
                                    ref_sents=ref,
                                    ref_labels=ref_labels,
                                    out_sents=outs,
                                    out_labels=out_labels,
                                    acc_type=acc_type,
                                    header="Word Accuracy Analysis",
                                    title=title)
    reporter.generate_report(output_fig_file=f'word-acc',
                             output_fig_format='pdf',
                             output_directory='outputs')
    return reporter