[PYTHON] Grenzwerte, die mit MeCab sofort analysiert werden können

Ich habe zufällig [Artikel] gesehen (https://qiita.com/Sak1361/items/2519f29af82ffe965652#mecab%E3%81%AE%E3%83%90%E3%82%B0%E5%AF%BE%E7%AD Das Memo, das ich überprüft habe, weil es in% 96 als Mecab-Fehler geschrieben wurde.

Fazit: ** 2.621.440 Zeichen ** ist das Limit

Dies kann anhand des in [common.h] definierten Werts ** MAX_INPUT_BUFFER_SIZE ** (https://github.com/taku910/mecab/blob/3a07c4eefaffb4e7a0690a7f4e5e0263d3ddb8a3/mecab/rc).

#define NBEST_MAX 512
#define NODE_FREELIST_SIZE 512
#define PATH_FREELIST_SIZE 2048
#define MIN_INPUT_BUFFER_SIZE 8192
#define MAX_INPUT_BUFFER_SIZE (8192*640)
#define BUF_SIZE 8192

Es ist ersichtlich, dass es wahrscheinlich maximal 8192 x 640 Datenbytes empfängt. Mit anderen Worten, 8192 x 640/2 = ** 2.621.440 Zeichen **. das ist alles.

Bonus

size_t ibufsize = std::min(MAX_INPUT_BUFFER_SIZE,
                             std::max(param.get<int>
                                            ("input-buffer-size"),
                                            MIN_INPUT_BUFFER_SIZE));

  const bool partial = param.get<bool>("partial");
  if (partial) {
    ibufsize *= 8;
  }

  MeCab::scoped_array<char> ibuf_data(new char[ibufsize]);
  char *ibuf = ibuf_data.get();

  MeCab::scoped_ptr<MeCab::Tagger> tagger(model->createTagger());

  if (!tagger.get()) {
    WHAT_ERROR("cannot create tagger");
  }

  for (size_t i = 0; i < rest.size(); ++i) {
    MeCab::istream_wrapper ifs(rest[i].c_str());
    if (!*ifs) {
      WHAT_ERROR("no such file or directory: " << rest[i]);
    }

    while (true) {
      if (!partial) {
        ifs->getline(ibuf, ibufsize);
      } else {
        std::string sentence;
        MeCab::scoped_fixed_array<char, BUF_SIZE> line;
        for (;;) {
          if (!ifs->getline(line.get(), line.size())) {
            ifs->clear(std::ios::eofbit|std::ios::badbit);
            break;
          }
          sentence += line.get();
          sentence += '\n';
          if (std::strcmp(line.get(), "EOS") == 0 || line[0] == '\0') {
            break;
          }
        }
        std::strncpy(ibuf, sentence.c_str(), ibufsize);
      }
      if (ifs->eof() && !ibuf[0]) {
        return false;
      }
      if (ifs->fail()) {
        std::cerr << "input-buffer overflow. "
                  << "The line is split. use -b #SIZE option." << std::endl;
        ifs->clear();
      }
      const char *r = (nbest >= 2) ? tagger->parseNBest(nbest, ibuf) :
          tagger->parse(ibuf);
      if (!r)  {
        WHAT_ERROR(tagger->what());
      }
      *ofs << r << std::flush;
    }
  }

  return EXIT_SUCCESS;

#undef WHAT_ERROR

Aus diesem Code ist ersichtlich, dass die Verarbeitung von MeCab.Tagger.parse () maximal ** MAX_INPUT_BUFFER_SIZE ** überschreitet. Als Nächstes string_buffer.h und [tagger.cpp]. /blob/3a07c4eefaffb4e7a0690a7f4e5e0263d3ddb8a3/mecab/src/tagger.cpp) Informationen zur Gitteranalyse. (string_buffer.h: Auszug aus den Zeilen 15-37)

bool StringBuffer::reserve(size_t length) {
  if (!is_delete_) {
    error_ = (size_ + length >= alloc_size_);
    return (!error_);
  }

  if (size_ + length >= alloc_size_) {
    if (alloc_size_ == 0) {
      alloc_size_ = DEFAULT_ALLOC_SIZE;
      ptr_ = new char[alloc_size_];
    }
    size_t len = size_ + length;
    do {
      alloc_size_ *= 2;
    } while (len >= alloc_size_);
    char *new_ptr = new char[alloc_size_];
    std::memcpy(new_ptr, ptr_, size_);
    delete [] ptr_;
    ptr_ = new_ptr;
  }

  return true;
}

Diese Reserve, die das Gebiet erwirbt, wird nur in tagger.cpp aufgerufen. (tagger.cpp: Auszug aus den Zeilen 733-741)

LatticeImpl::LatticeImpl(const Writer *writer)
    : sentence_(0), size_(0), theta_(kDefaultTheta), Z_(0.0),
      request_type_(MECAB_ONE_BEST),
      writer_(writer),
      ostrs_(0),
      allocator_(new Allocator<Node, Path>) {
  begin_nodes_.reserve(MIN_INPUT_BUFFER_SIZE);
  end_nodes_.reserve(MIN_INPUT_BUFFER_SIZE);
}

Und LatticeImpl wird (glaube ich) ausgeführt, wenn Lattice materialisiert wird. (tagger.cpp: 227-239 Auszug)

class LatticeImpl : public Lattice {
 public:
  explicit LatticeImpl(const Writer *writer = 0);
  ~LatticeImpl();

  // clear internal lattice
  void clear();

  bool is_available() const {
    return (sentence_ &&
            !begin_nodes_.empty() &&
            !end_nodes_.empty());
  }

Aus diesen Dingen ist ersichtlich, dass es in der Gitteranalyse keine Grenzen zu geben scheint, da es den Anschein hat, dass die Fläche von memcpy verdoppelt und erfasst wird, wenn der Speicher nicht ausreicht (natürlich sollte sie enden, wenn der Speicher verbraucht ist, aber vorher Es scheint bei MAX_INPUT_BUFFER_SIZE anzuhalten.

andere Referenzen

mecab.h: Definition von Strukturen wie Gitter usw. libmecab.cpp: [tagger.cpp](https:// /3a07c4eefaffb4e7a0690a7f4e5e0263d3ddb8a3/mecab/src/tagger.cpp) mutable_lattice () und die Definition von Funktionen, die dem Modell zugeordnet sind, wie mecab_model_new_lattice () usw.

END.

Recommended Posts

Grenzwerte, die mit MeCab sofort analysiert werden können
Dateitypen, die mit Go verwendet werden können
Listen Sie Pakete auf, die mit pip aktualisiert werden können
Liste der Farben, die mit tkinter (Denkmal) eingestellt werden können
Hinweise zu Python-Kenntnissen, die mit AtCoder verwendet werden können
Ich habe die Vorbehandlung untersucht, die mit PyCaret durchgeführt werden kann
Lassen Sie uns ein Diagramm erstellen, auf das mit IPython geklickt werden kann
[Python] Erstellen Sie ein Diagramm, das mit Plotly verschoben werden kann
Erstellen Sie eine Spinbox, die mit Tkinter in Binär angezeigt werden kann
Ich habe die Jumbo-Lotterie zum Jahresende mit Python gekauft und analysiert, die in Colaboratory ausgeführt werden kann
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
Bestätigung, dass rkhunter installiert werden kann
Erstellen Sie ein Währungsdiagramm, das mit Plotly (2) verschoben werden kann.
Ersetzen Sie alles auf einmal durch sed
Vergleich von 4 Stilen, die mit set_context an seaborn übergeben werden können
Erstellen Sie eine Spinbox, die mit Tkinter in HEX angezeigt werden kann
Erstellen Sie ein Währungsdiagramm, das mit Plotly (1) verschoben werden kann.
[Python] Code, der zu Beginn beim Scraping als Anfänger mit Hirntod geschrieben werden kann
Akustisches Signalverarbeitungsmodul, das mit Python-Sounddevice ASIO [Anwendung] verwendet werden kann
Erstellen Sie eine Web-App, die mit Plotly Dash einfach visualisiert werden kann
Python-Sound Gerät ASIO akustisches Signalverarbeitungsmodul [Basic]
Es wurde ein Fehler behoben, bei dem node.surface mit python3 + mecab nicht abgerufen werden konnte
Konvertieren Sie Memos sofort mit Python 2to3
Senden Sie Newsletter auf einmal mit Google Mail
[Python3] Code, der verwendet werden kann, wenn Sie die Erweiterung eines Bildes sofort ändern möchten
Hinweise zum Erstellen von Zahlen, die mit matplotlib in Zeitschriften veröffentlicht werden können
Raspberry Pi aus der Ferne verschoben, damit es mit Python LED-verbunden werden kann
Formatieren Sie DataFrame-Daten mit Pytorch in ein Formular, das mit NN trainiert werden kann
Bis Sie youtube-dl mit Synology (DS120j) verwenden können
Funktionen, die in der for-Anweisung verwendet werden können
Erstellen von Sphinx, das mit Markdown geschrieben werden kann
Löschen Sie Bilddateien sofort mit einem Liner
Aktualisieren Sie mehrere Tabellen gleichzeitig mit pandas to_sql
Konvertieren Sie mehrere Protodateien gleichzeitig mit Python
Einführung des Befehls "Glances", eines auf einen Blick verständlichen Überwachungstools, auf den Mac
Konvertieren Sie Bilder aus dem FlyCapture SDK in ein Formular, das mit openCV verwendet werden kann
[auto-ohin] Einführung von auto-ohin, einem Befehlszeilenprogramm, das automatisch alle auf einmal stempeln kann [elektronischer Stempel]
[Python] Einführung in das WEB-Scraping | Zusammenfassung der Methoden, die mit dem Webdriver verwendet werden können
Morphologische Analyse und tfidf (mit Testcode), die in ca. 1 Minute durchgeführt werden können
Mit Raspberry Pi erstellter Dateifreigabeserver, der für Remote-Arbeiten verwendet werden kann