Специальный пользовательский токенайзер, включающий в качестве токенов только дефисные слова, использующие регулярное выражение Infix - PullRequest
0 голосов
/ 24 июня 2018

Я хочу включить дефисные слова, например: долгосрочные, самооценка и т. Д., В качестве одного токена в Spacy.Посмотрев несколько похожих постов в Stackoverflow, Github , его документации и в других местах , я также написал собственный токенизатор, как показано ниже.

import re
from spacy.tokenizer import Tokenizer

prefix_re = re.compile(r'''^[\[\("']''')
suffix_re = re.compile(r'''[\]\)"']$''')
infix_re = re.compile(r'''[.\,\?\:\;\...\‘\’\`\“\”\"\'~]''')

def custom_tokenizer(nlp):
    return Tokenizer(nlp.vocab, prefix_search=prefix_re.search,
                                suffix_search=suffix_re.search,
                                infix_finditer=infix_re.finditer,
                                token_match=None)

nlp = spacy.load('en_core_web_lg')
nlp.tokenizer = custom_tokenizer(nlp)

doc = nlp(u'Note: Since the fourteenth century the practice of “medicine” has become a profession; and more importantly, it\'s a male-dominated profession.')
[token.text for token in doc]

Итак, для этого предложения: «Примечание: с четырнадцатого века практика« медицины »стала профессией;и что еще более важно, это профессия, в которой доминируют мужчины.

Теперь токены после включения пользовательского Spacy Tokenizer:

'Примечание', ':',' С ',' the ',' четырнадцатый ',' столетие ',' the ',' практика ',' of ', ' 'медицина', '', «имеет», «;», «стать», «а», «профессия», «,», «и», «еще», «важно», «,», «это», 'a', ' с преобладанием мужчин ', 'профессия', '.'

Ранее токены до этого изменения были:

'Примечание', ':', 'С', 'the', 'четырнадцатый', 'столетие', 'the', 'практика', 'of', '', ' медицина ',' ',' имеет ',' стал ',' a ',' профессией ','; ',' и ',' more ',' важно ',', ',' it ', "' s ", 'a', ' male ', ' - ', ' преобладают ',' профессия ','. '

И ожидаемые токены должны быть:

' Примечание ',': ','С тех пор как «,», «четырнадцатый», «век», «,» практикаice ',' of ',' ',' Medicine ',' ',' has ',' становиться ',' a ','профессия ','; ',' и ',' more ',' важно ',', ',' it ', "' s ", 'a', ' с преобладанием мужчин ',' профессия ','. '

Как видно, слово дефис включено, как и другие знаки препинания, за исключением двойных кавычек и апострофов.Но теперь апостроф и двойные кавычки не имеют более раннего или ожидаемого поведения.Я пробовал разные перестановки и комбинации для регулярных выражений компиляции для Infix, но не смог решить эту проблему.Следовательно, любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 25 июня 2018

Использование значений по умолчанию prefix_re и suffix_re дает ожидаемый результат:

import re
import spacy
from spacy.tokenizer import Tokenizer
from spacy.util import compile_prefix_regex, compile_infix_regex, compile_suffix_regex

def custom_tokenizer(nlp):
    infix_re = re.compile(r'''[.\,\?\:\;\...\‘\’\`\“\”\"\'~]''')
    prefix_re = compile_prefix_regex(nlp.Defaults.prefixes)
    suffix_re = compile_suffix_regex(nlp.Defaults.suffixes)

    return Tokenizer(nlp.vocab, prefix_search=prefix_re.search,
                                suffix_search=suffix_re.search,
                                infix_finditer=infix_re.finditer,
                                token_match=None)

nlp = spacy.load('en')
nlp.tokenizer = custom_tokenizer(nlp)

doc = nlp(u'Note: Since the fourteenth century the practice of “medicine” has become a profession; and more importantly, it\'s a male-dominated profession.')
[token.text for token in doc]

['Note', ':', 'Since', 'the', 'четырнадцатый', 'столетие', ''',' практика ',' из ',' '', 'медицина', '' ',' имеет ',' стал ',' a ',' профессией ','; ',' и ',' more ', 'важно', ',', 'это', '' s ',' a ',' преобладают мужчины ',' профессия ','. ']

Если вы хотите понять, почемуВаши регулярные выражения работали не так, как в SpaCy, вот ссылки на соответствующий исходный код:

Префиксы и суффиксы, определенные здесь:

https://github.com/explosion/spaCy/blob/master/spacy/lang/punctuation.py

Применительно к символам (например, кавычки, дефисы и т. д.), определенные здесь:

https://github.com/explosion/spaCy/blob/master/spacy/lang/char_classes.py

И функции, используемые для их компиляции (например, compile_prefix_regex):

https://github.com/explosion/spaCy/blob/master/spacy/util.py

...