2017-01-26 1 views
1

문자열을 토큰화할 때 spacy의 토크 나이저가 특정 하위 문자열을 분할하지 못하게하려면 어떻게해야합니까?문자열을 토큰화할 때 spacy의 토크 나이저가 특정 하위 문자열을 분할하지 못하게하려면 어떻게해야합니까?

이 등록되면, 폴더 멀리 쉘에서 갔다 :

은보다 구체적으로, 나는이 문장이있다. 로 토큰 화됩니다

는 [번/등록 /, /은/폴더/간/거리 /에서//그녀/LL /.] scapy 1.6.0에 의해. 서브 문자열 shell을 두 개의 서로 다른 토큰 shell으로 잘라 내고 싶지 않습니다.

# 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 받을수 여기


제가 사용하는 코드이다.

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_)) 

출력한다 : 다음과 같이 토크 나이에 의해 분할되는 문자열 shell을 방지하기 위해 예외를 추가

nlp.tokenizer.add_special_case 수행 할 수 있습니다

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", "]"의 3 개의 토큰이됩니다. 모든 문자열에 대해 작동하지 않아야합니까? – singleton

+0

@singleton 두 개의 테스트되지 않은 아이디어 : 1.'add_special_case'는 구두점을 무시합니다. 2.'add_special_case'는 정규식을 인수로 취합니다. –

+1

Spacy가 정상적으로 작동합니다. spacy 사이트에서 토큰 화 예제를 복사하여 붙여 넣는 동안 실수를 한 것으로 보입니다. 건배. – singleton

관련 문제