2017-06-16 6 views
1

Je souhaite ajouter un cas spécial pour tokenization dans spacy selon le documentation. La documentation montre comment des mots spécifiques peuvent être considérés comme des cas spéciaux. Je veux être en mesure de spécifier un motif (par exemple un suffixe). Par exemple, j'ai une chaîne comme cespacy ajouter des règles de tokenisation de cas spéciales par expression régulière ou par motif

text = "A sample string with <word-1> and <word-2>"

<word-i> spécifie un seul mot.

Je sais que je peux l'avoir pour un cas particulier à la fois par le code suivant. Mais comment puis-je spécifier un modèle pour cela?

import spacy 
from spacy.symbols import ORTH 
nlp = spacy.load('en', vectors=False,parser=False, entity=False) 
nlp.tokenizer.add_special_case(u'<WORD>', [{ORTH: u'<WORD>'}]) 

Répondre

3

Vous pouvez utiliser des allumettes regex pour trouver les limites de vos cordes de cas spéciaux, puis utiliser spacy's merge method pour les fusionner comme seul jeton. La commande add_special_case ne fonctionne que pour les mots définis. Voici un exemple:

>>> import spacy 
>>> import re 
>>> nlp = spacy.load('en') 
>>> my_str = u'Tweet hashtags #MyHashOne #MyHashTwo' 
>>> parsed = nlp(my_str) 
>>> [(x.text,x.pos_) for x in parsed] 
[(u'Tweet', u'PROPN'), (u'hashtags', u'NOUN'), (u'#', u'NOUN'), (u'MyHashOne', u'NOUN'), (u'#', u'NOUN'), (u'MyHashTwo', u'PROPN')] 
>>> indexes = [m.span() for m in re.finditer('#\w+',my_str,flags=re.IGNORECASE)] 
>>> indexes 
[(15, 25), (26, 36)] 
>>> for start,end in indexes: 
...  parsed.merge(start_idx=start,end_idx=end) 
... 
#MyHashOne 
#MyHashTwo 
>>> [(x.text,x.pos_) for x in parsed] 
[(u'Tweet', u'PROPN'), (u'hashtags', u'NOUN'), (u'#MyHashOne', u'NOUN'), (u'#MyHashTwo', u'PROPN')] 
>>>