ускорение Spacy с помощью Cython - PullRequest
1 голос
/ 16 октября 2019

Недавно я читал некоторые посты о написании кода на Cython, чтобы добиться лучшей производительности для целей НЛП, и я немного запутался. https://medium.com/huggingface/100-times-faster-natural-language-processing-in-python-ee32033bdced например, здесь они используют Cython для циклического перебора элементов документа и подсчета записей конкретных слов;

cdef struct DocElement:
TokenC* c
int length

cdef int fast_loop(DocElement* docs, int n_docs, hash_t word, hash_t tag):
    cdef int n_out = 0
    for doc in docs[:n_docs]:
        for c in doc.c[:doc.length]:
            if c.lex.lower == word and c.tag == tag:
                n_out += 1
    return n_out

def main_nlp_fast(doc_list):
    cdef int i, n_out, n_docs = len(doc_list)
    cdef Pool mem = Pool()
    cdef DocElement* docs = <DocElement*>mem.alloc(n_docs, sizeof(DocElement))
    cdef Doc doc
    for i, doc in enumerate(doc_list): # Populate our database structure
        docs[i].c = doc.c
        docs[i].length = (<Doc>doc).length
    word_hash = doc.vocab.strings.add('run')
    tag_hash = doc.vocab.strings.add('NN')
    n_out = fast_loop(docs, n_docs, word_hash, tag_hash)
    print(n_out)

этот подход приводит к значительно лучшей скорости по сравнению с чистым Python, но в этом примере предполагается, что у нас есть объект Doc, созданный ранее. Но создание Doc из простого текста - это та часть, где я уже получаю довольно медленную программу для не очень длинных документов (примерно того же размера, о которых они упоминают в посте), даже если я удалю из конвейера все, кроме Tokenizer. Есть ли способ ускорить этот процесс с помощью Cython? Я не знаю, имеет ли мой вопрос какой-либо смысл, но мне действительно нужны некоторые разъяснения по этому вопросу

...