Добрый день, ТАК,
Я пытаюсь пост-обрабатывать дефисные слова, которые токенизируются в отдельные токены, когда они предположительно были одним токеном.Например:
Example:
Sentence: "up-scaled"
Tokens: ['up', '-', 'scaled']
Expected: ['up-scaled']
На данный момент мое решение состоит в том, чтобы использовать средство сопоставления:
matcher = Matcher(nlp.vocab)
pattern = [{'IS_ALPHA': True, 'IS_SPACE': False},
{'ORTH': '-'},
{'IS_ALPHA': True, 'IS_SPACE': False}]
matcher.add('HYPHENATED', None, pattern)
def quote_merger(doc):
# this will be called on the Doc object in the pipeline
matched_spans = []
matches = matcher(doc)
for match_id, start, end in matches:
span = doc[start:end]
matched_spans.append(span)
for span in matched_spans: # merge into one token after collecting all matches
span.merge()
#print(doc)
return doc
nlp.add_pipe(quote_merger, first=True) # add it right after the tokenizer
doc = nlp(text)
Однако это приведет к ожидаемой проблеме ниже:
Example 2:
Sentence: "I know I will be back - I had a very pleasant time"
Tokens: ['i', 'know', 'I', 'will', 'be', 'back - I', 'had', 'a', 'very', 'pleasant', 'time']
Expected: ['i', 'know', 'I', 'will', 'be', 'back', '-', 'I', 'had', 'a', 'very', 'pleasant', 'time']
Есть ли способ, где я могу обрабатывать только слова, разделенные дефисами, которые не имеют пробелов между символами?Таким образом, такие слова, как «масштабированный», будут сопоставлены и объединены в один токен, но не «… назад - я ..»
Большое спасибо
РЕДАКТИРОВАТЬ: У меня естьпопробовал решение, опубликованное: Почему spaCy не сохраняет дефисы внутри слова во время токенизации, как это делает Stanford CoreNLP?
Однако я не использовал это решение, потому что оно привело к неправильному токенизациислова с апострофами (') и числа с десятичными числами:
Sentence: "It's"
Tokens: ["I", "t's"]
Expected: ["It", "'s"]
Sentence: "1.50"
Tokens: ["1", ".", "50"]
Expected: ["1.50"]
Именно поэтому я использовал Matcher вместо того, чтобы пытаться редактировать регулярное выражение.