2017-01-26 48 views
1

Как я могу предотвратить токенизатор spacy от разделения определенной подстроки при токенизации строки?Как я могу предотвратить токенизатор spacy от разделения конкретной подстроки при токенизации строки?

Более конкретно, у меня есть предложение:

После незарегистрированный папка ушла от оболочки.

который получает лексемы, как [После/незарегистрированный /,// ​​папка/пошел/прочь/из/в/она/Л.Л. /.] По scapy 1.6.0. Я не хочу, чтобы подстрока shell была разрезана на два разных токена she и ll.


Вот код, я использую:

# To install spacy: 
# sudo pip install spacy 
# sudo python -m spacy.en.download parser # will take 0.5 GB 

import spacy 
nlp = spacy.load('en') 

# https://spacy.io/docs/usage/processing-text 
document = nlp(u'Once unregistered, the folder went away from the shell.') 

for token in document: 
    print('token.i: {2}\ttoken.idx: {0}\ttoken.pos: {3:10}token.text: {1}'. 
     format(token.idx, token.text,token.i,token.pos_)) 

, который выводит:

token.i: 0  token.idx: 0 token.pos: ADV  token.text: Once 
token.i: 1  token.idx: 5 token.pos: ADJ  token.text: unregistered 
token.i: 2  token.idx: 17 token.pos: PUNCT  token.text: , 
token.i: 3  token.idx: 19 token.pos: DET  token.text: the 
token.i: 4  token.idx: 23 token.pos: NOUN  token.text: folder 
token.i: 5  token.idx: 30 token.pos: VERB  token.text: went 
token.i: 6  token.idx: 35 token.pos: ADV  token.text: away 
token.i: 7  token.idx: 40 token.pos: ADP  token.text: from 
token.i: 8  token.idx: 45 token.pos: DET  token.text: the 
token.i: 9  token.idx: 49 token.pos: PRON  token.text: she 
token.i: 10  token.idx: 52 token.pos: VERB  token.text: ll 
token.i: 11  token.idx: 54 token.pos: PUNCT  token.text: . 

ответ

2

ошалевший позволяет add exceptions to the tokenizer.

Добавление исключение, чтобы предотвратить строку shell от быть расщеплены токенизатор может быть сделано с nlp.tokenizer.add_special_case следующим образом:

import spacy 
from spacy.symbols import ORTH, LEMMA, POS 
nlp = spacy.load('en') 

nlp.tokenizer.add_special_case(u'shell', 
    [ 
     { 
      ORTH: u'shell', 
      LEMMA: u'shell', 
      POS: u'NOUN'} 
    ]) 

# https://spacy.io/docs/usage/processing-text 
document = nlp(u'Once unregistered, the folder went away from the shell.') 

for token in document: 
    print('token.i: {2}\ttoken.idx: {0}\ttoken.pos: {3:10}token.text: {1}'. 
     format(token.idx, token.text,token.i,token.pos_)) 

, который выводит:

token.i: 0  token.idx: 0 token.pos: ADV  token.text: Once 
token.i: 1  token.idx: 5 token.pos: ADJ  token.text: unregistered 
token.i: 2  token.idx: 17 token.pos: PUNCT  token.text: , 
token.i: 3  token.idx: 19 token.pos: DET  token.text: the 
token.i: 4  token.idx: 23 token.pos: NOUN  token.text: folder 
token.i: 5  token.idx: 30 token.pos: VERB  token.text: went 
token.i: 6  token.idx: 35 token.pos: ADV  token.text: away 
token.i: 7  token.idx: 40 token.pos: ADP  token.text: from 
token.i: 8  token.idx: 45 token.pos: DET  token.text: the 
token.i: 9  token.idx: 49 token.pos: NOUN  token.text: shell 
token.i: 10  token.idx: 54 token.pos: PUNCT  token.text: . 
+0

Любая идея, почему добавление особый случай строка «[LOCATION]» выводится на три маркера - «[», «LOCATION», «]»? Разве это не должно работать для всех строк? – singleton

+0

@singleton Две непроверенные идеи: 1. 'add_special_case' игнорирует пунктуацию 2.' add_special_case' принимает регулярное выражение как аргумент –

+1

Spacy отлично работает. Похоже, что я допустил ошибку, в то время как экземпляр вставляя токенизацию из веб-сайта spacy. Приветствия. – singleton