Skip to main content

Bindings to NameTag library

Project description

ufal.nametag

The ufal.nametag is a Python binding to NameTag library <http://ufal.mff.cuni.cz/nametag>.

The bindings is a straightforward conversion of the C++ bindings API. Python >=3 is supported.

Wrapped C++ API

The C++ API being wrapped follows. For a API reference of the original C++ API, see <http://ufal.mff.cuni.cz/nametag/api-reference>.

Helper Structures
-----------------

  typedef vector<string> Forms;

  struct TokenRange {
    size_t start;
    size_t length;
  };
  typedef vector<TokenRange> TokenRanges;

  struct NamedEntity {
    size_t start;
    size_t length;
    string type;

    NamedEntity();
    NamedEntity(size_t start, size_t length, const string& type);
  };
  typedef vector<NamedEntity> NamedEntities;


Main Classes
------------

  class Version {
   public:
    unsigned major;
    unsigned minor;
    unsigned patch;
    string prerelease;

    static Version current();
  };

  class Tokenizer {
   public:
    virtual void setText(const char* text);
    virtual bool nextSentence(Forms* forms, TokenRanges* tokens);

    static Tokenizer* newVerticalTokenizer();
  };

  class Ner {
    static ner* load(const char* fname);

    virtual void recognize(Forms& forms, NamedEntities& entities) const;

    virtual void entityTypes(Forms& types) const;
    virtual void gazetteers(Forms& gazetteers, Ints& gazetteer_types) const;

    virtual Tokenizer* newTokenizer() const;
  };

Examples

run_ner

Simple example performing named entity recognition:

import sys

from ufal.nametag import *

def encode_entities(text):
  return text.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;')

def sort_entities(entities):
  return sorted(entities, key=lambda entity: (entity.start, -entity.length))

# In Python2, wrap sys.stdin and sys.stdout to work with unicode.
if sys.version_info[0] < 3:
  import codecs
  import locale
  encoding = locale.getpreferredencoding()
  sys.stdin = codecs.getreader(encoding)(sys.stdin)
  sys.stdout = codecs.getwriter(encoding)(sys.stdout)

if len(sys.argv) == 1:
  sys.stderr.write('Usage: %s recognizer_model\n' % sys.argv[0])
  sys.exit(1)

sys.stderr.write('Loading ner: ')
ner = Ner.load(sys.argv[1])
if not ner:
  sys.stderr.write("Cannot load recognizer from file '%s'\n" % sys.argv[1])
  sys.exit(1)
sys.stderr.write('done\n')

forms = Forms()
tokens = TokenRanges()
entities = NamedEntities()
sortedEntities = []
openEntities = []
tokenizer = ner.newTokenizer()
if tokenizer is None:
  sys.stderr.write("No tokenizer is defined for the supplied model!")
  sys.exit(1)

not_eof = True
while not_eof:
  text = ''

  # Read block
  while True:
    line = sys.stdin.readline()
    not_eof = bool(line)
    if not not_eof: break
    line = line.rstrip('\r\n')
    text += line
    text += '\n';
    if not line: break

  # Tokenize and recognize
  tokenizer.setText(text)
  t = 0
  while tokenizer.nextSentence(forms, tokens):
    ner.recognize(forms, entities)
    sortedEntities = sort_entities(entities)

    # Write entities
    e = 0
    for i in range(len(tokens)):
      sys.stdout.write(encode_entities(text[t:tokens[i].start]))
      if (i == 0): sys.stdout.write("<sentence>")

      # Open entities starting at current token
      while (e < len(sortedEntities) and sortedEntities[e].start == i):
        sys.stdout.write('<ne type="%s">' % encode_entities(sortedEntities[e].type))
        openEntities.append(sortedEntities[e].start + sortedEntities[e].length - 1)
        e = e + 1

      # The token itself
      sys.stdout.write('<token>%s</token>' % encode_entities(text[tokens[i].start : tokens[i].start + tokens[i].length]))

      # Close entities ending after current token
      while openEntities and openEntities[-1] == i:
        sys.stdout.write('</ne>')
        openEntities.pop()
      if (i + 1 == len(tokens)): sys.stdout.write("</sentence>")
      t = tokens[i].start + tokens[i].length
  # Write rest of the text
  sys.stdout.write(encode_entities(text[t:]))

AUTHORS

Milan Straka <straka@ufal.mff.cuni.cz>

Jana Straková <strakova@ufal.mff.cuni.cz>

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ufal.nametag-1.2.1.1.tar.gz (193.1 kB view hashes)

Uploaded Source

Built Distributions

ufal.nametag-1.2.1.1-cp312-cp312-win_amd64.whl (511.8 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

ufal.nametag-1.2.1.1-cp312-cp312-win32.whl (413.9 kB view hashes)

Uploaded CPython 3.12 Windows x86

ufal.nametag-1.2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl (954.7 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ x86-64

ufal.nametag-1.2.1.1-cp312-cp312-musllinux_1_1_i686.whl (1.0 MB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ i686

ufal.nametag-1.2.1.1-cp312-cp312-musllinux_1_1_aarch64.whl (931.5 kB view hashes)

Uploaded CPython 3.12 musllinux: musl 1.1+ ARM64

ufal.nametag-1.2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (421.5 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

ufal.nametag-1.2.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl (441.8 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ i686

ufal.nametag-1.2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (413.8 kB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

ufal.nametag-1.2.1.1-cp312-cp312-macosx_11_0_arm64.whl (392.3 kB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

ufal.nametag-1.2.1.1-cp312-cp312-macosx_10_9_x86_64.whl (432.9 kB view hashes)

Uploaded CPython 3.12 macOS 10.9+ x86-64

ufal.nametag-1.2.1.1-cp311-cp311-win_amd64.whl (510.7 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

ufal.nametag-1.2.1.1-cp311-cp311-win32.whl (413.3 kB view hashes)

Uploaded CPython 3.11 Windows x86

ufal.nametag-1.2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl (952.4 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

ufal.nametag-1.2.1.1-cp311-cp311-musllinux_1_1_i686.whl (1.0 MB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

ufal.nametag-1.2.1.1-cp311-cp311-musllinux_1_1_aarch64.whl (930.8 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ ARM64

ufal.nametag-1.2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (419.9 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

ufal.nametag-1.2.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (439.9 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686

ufal.nametag-1.2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (412.9 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

ufal.nametag-1.2.1.1-cp311-cp311-macosx_11_0_arm64.whl (391.3 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

ufal.nametag-1.2.1.1-cp311-cp311-macosx_10_9_x86_64.whl (431.5 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

ufal.nametag-1.2.1.1-cp310-cp310-win_amd64.whl (510.7 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

ufal.nametag-1.2.1.1-cp310-cp310-win32.whl (413.2 kB view hashes)

Uploaded CPython 3.10 Windows x86

ufal.nametag-1.2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl (952.2 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

ufal.nametag-1.2.1.1-cp310-cp310-musllinux_1_1_i686.whl (1.0 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

ufal.nametag-1.2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl (930.6 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ ARM64

ufal.nametag-1.2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (419.9 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

ufal.nametag-1.2.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (439.9 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686

ufal.nametag-1.2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (412.9 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

ufal.nametag-1.2.1.1-cp310-cp310-macosx_11_0_arm64.whl (391.4 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

ufal.nametag-1.2.1.1-cp310-cp310-macosx_10_9_x86_64.whl (431.5 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

ufal.nametag-1.2.1.1-cp39-cp39-win_amd64.whl (510.7 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

ufal.nametag-1.2.1.1-cp39-cp39-win32.whl (413.2 kB view hashes)

Uploaded CPython 3.9 Windows x86

ufal.nametag-1.2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl (952.2 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

ufal.nametag-1.2.1.1-cp39-cp39-musllinux_1_1_i686.whl (1.0 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

ufal.nametag-1.2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl (930.6 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ ARM64

ufal.nametag-1.2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (420.0 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

ufal.nametag-1.2.1.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl (439.9 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686

ufal.nametag-1.2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (412.9 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

ufal.nametag-1.2.1.1-cp39-cp39-macosx_11_0_arm64.whl (391.3 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

ufal.nametag-1.2.1.1-cp39-cp39-macosx_10_9_x86_64.whl (431.5 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

ufal.nametag-1.2.1.1-cp38-cp38-win_amd64.whl (510.8 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

ufal.nametag-1.2.1.1-cp38-cp38-win32.whl (413.2 kB view hashes)

Uploaded CPython 3.8 Windows x86

ufal.nametag-1.2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl (952.3 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

ufal.nametag-1.2.1.1-cp38-cp38-musllinux_1_1_i686.whl (1.0 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

ufal.nametag-1.2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl (930.8 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ ARM64

ufal.nametag-1.2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (420.3 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

ufal.nametag-1.2.1.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl (440.2 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686

ufal.nametag-1.2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (413.0 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

ufal.nametag-1.2.1.1-cp38-cp38-macosx_11_0_arm64.whl (392.0 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ ARM64

ufal.nametag-1.2.1.1-cp38-cp38-macosx_10_9_x86_64.whl (432.5 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

ufal.nametag-1.2.1.1-cp37-cp37m-win_amd64.whl (510.8 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

ufal.nametag-1.2.1.1-cp37-cp37m-win32.whl (413.2 kB view hashes)

Uploaded CPython 3.7m Windows x86

ufal.nametag-1.2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl (953.2 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

ufal.nametag-1.2.1.1-cp37-cp37m-musllinux_1_1_i686.whl (1.0 MB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

ufal.nametag-1.2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl (931.1 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ ARM64

ufal.nametag-1.2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (420.2 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

ufal.nametag-1.2.1.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl (439.8 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686

ufal.nametag-1.2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (413.1 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

ufal.nametag-1.2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl (432.1 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ x86-64

ufal.nametag-1.2.1.1-cp36-cp36m-win_amd64.whl (538.8 kB view hashes)

Uploaded CPython 3.6m Windows x86-64

ufal.nametag-1.2.1.1-cp36-cp36m-win32.whl (433.7 kB view hashes)

Uploaded CPython 3.6m Windows x86

ufal.nametag-1.2.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl (953.2 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ x86-64

ufal.nametag-1.2.1.1-cp36-cp36m-musllinux_1_1_i686.whl (1.0 MB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ i686

ufal.nametag-1.2.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl (931.1 kB view hashes)

Uploaded CPython 3.6m musllinux: musl 1.1+ ARM64

ufal.nametag-1.2.1.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (420.2 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

ufal.nametag-1.2.1.1-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl (439.8 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ i686

ufal.nametag-1.2.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (413.1 kB view hashes)

Uploaded CPython 3.6m manylinux: glibc 2.17+ ARM64

ufal.nametag-1.2.1.1-cp36-cp36m-macosx_10_9_x86_64.whl (432.1 kB view hashes)

Uploaded CPython 3.6m macOS 10.9+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page