explosion / spacy-stanza

đź’Ą Use the latest Stanza (StanfordNLP) research models directly in spaCy
MIT License
722 stars 60 forks source link

Infinite loop if token texts don't match input text #2

Closed jfilter closed 5 years ago

jfilter commented 5 years ago

It works with other text but running this code will cause an infinite loop. It does not like "im Anhang".

snlp = stanfordnlp.Pipeline(lang="de")
nlp = StanfordNLPLanguage(snlp)

doc = nlp("im Anhang")
for token in doc:
    print(token.text, token.lemma_, token.pos_, token.dep_)
reboutli-crim commented 5 years ago

Same here with a French sentence ("Les jeux des enfants sont rangés") The problem is with the word "des" that is decomposed by stanfordnlp in "de les". The loop `while not span.startswith(token.text):

If we encounter leading whitespace, skip one character ahead

            offset += 1
            span = text[offset:]`

in the Tokenizer (line 106) tries to find the string "les" in the sentence and loops indefinitely.

ines commented 5 years ago

Ah, damn. And yes, this is because the token texts don't match the original input text.

Because the models don't return whitespace information, the wrapper needs to reconstruct the tokens based on the original text. It does account for additional whitespace that's swallowed, but it fails here because the produced tokens are different from the actual text. (This is also a concept that doesn't really exist in spaCy, because the tokenization itself is always non-destructive so the original text can always be reconstructed from a Doc.)

One option I can think of to solve this is to just take the tokens at face value and not try to reconstruct the whitespace. This means that the string "Hallo!" would become ["Hallo", "!"], but the doc.text would be "Hallo !" because we don't know whether the token is followed by whitespace (unless we check the original text).

reboutli-crim commented 5 years ago

But would in this case "des" become "de les" in the doc.text?

ines commented 5 years ago

Yes, in that case, "des enfants" would become a Doc consisting of the tokens ["de", "les", "enfants"] and doc.text would be "de les enfants". (So text == doc.text wouldn't hold true anymore, which is usually a fundamental principle in spaCy.)

Edit: Wrote a little fix and just trying it out with German. If this works, the compromise would be that if the tokens align with the text, you get tokens with whitespace information (token.whitespace, token.text_with_ws and by proxy Doc.text, Span.text). If the tokens do not align with the input text, you get the tokens but no aligned whitespace information, so Doc.text and Span.text may not be perfectly accurate.

Edit 2: The fix is now available in the latest release. I think it's an okay compromise.

scalleri commented 5 years ago

hey there first of all, thank you for the great work with spacy!! it's so nice :-) when trying out the stanfordnlp + spacy parser with the default parser for Italian and I get this result for prepositions with articles and apostrophes, I think the problem sometimes is the "wrong" apostrophe but maybe if the mwt would be accessible in any way (I couldn't figure out if it is), this could be solved? (here they solve it with a 'parent' structure: https://stanfordnlp.github.io/stanfordnlp/mwt.html) :

snlp_it = stanfordnlp.Pipeline(lang='it') 
nlp_it_stanford = StanfordNLPLanguage(snlp_it)

test_it = ["Lei non c'ha raccontato dell’idea."]

for text in test_it:
    doc1 = nlp_it_stanford(text)
    print(text)
    for token in doc1:

        print(token.text,"\t",token.pos_,"\t",token.tag_,"\t",token.dep_,"\t",token.lemma_)
    print()

Non posso certo ridurre il grande ritorno di Roger Federer vincitore dell’Open d’Australia con una finale vinta contro Rafa Nadal il maiorchino che in carriera gli ha pure dato molti dispiaceri con un temino di quelli che hanno assicurato finora una discreta fama al Federer fans club di via Collinetta.
Non      ADV     BN      advmod      non
posso    AUX     VM      aux     potere
certo    ADV     B   advmod      certo
ridurre      VERB    V   root    ridurre
il   DET     RD      det     il
grande   ADJ     A   amod    grande
ritorno      NOUN    S   obj     ritorno
di   ADP     E   case    di
Roger    PROPN   SP      nmod    Roger
Federer      PROPN   SP      flat:name   Federer
vincitore    NOUN    S   nmod    vincitore
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
Ă     ADP     _   case    Ă 
le   DET     _   det     le
de   ADP     _   case    de
les      DET     _   det     le
de   ADP     _   case    de
le   DET     _   det     le
Ă     ADP     _   case    Ă 
le   DET     _   det     le
de   ADP     _   case    de
les      DET     _   det     le
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
Ă     ADP     _   case    Ă 
le   DET     _   det     le
de   ADP     _   case    de
les      DET     _   det     le
de   ADP     _   case    de
le   DET     _   det     le
Ă     ADP     _   case    Ă 
le   DET     _   det     le
de   ADP     _   case    de
les      DET     _   det     le
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
Ă     ADP     _   case    Ă 
le   DET     _   det     le
de   ADP     _   case    de
les      DET     _   det     le
de   ADP     _   case    de
le   DET     _   det     le
Ă     ADP     _   case    Ă 
le   DET     _   det     le
de   ADP     _   case    de
les      DET     _   det     le
di   ADP     E   case    di
l’   DET     RD      det     il
a    ADP     E   case    a
il   DET     RD      det     il
Open     PROPN   SP      nmod    Open
d’   ADP     E   case    di
Australia    PROPN   SP      nmod    Australia
con      ADP     E   case    con
una      DET     RI      det     uno
finale   NOUN    S   obl     finale
vinta    VERB    V   acl     vincere
contro   ADP     E   case    contro
Rafa     PROPN   SP      obl     Rafa
Nadal    PROPN   SP      flat:name   Nadal
il   DET     RD      det     il
maiorchino   NOUN    S   obj     maiorchino
che      PRON    PR      nsubj   che
in   ADP     E   case    in
carriera     NOUN    S   obl     carriera
gli      PRON    PC      iobj    gli
ha   AUX     VA      aux     avere
pure     ADV     B   advmod      pure
dato     VERB    V   acl:relcl   dare
molti    DET     DI      det     molto
dispiaceri   NOUN    S   obj     dispiacere
con      ADP     E   case    con

I just had a quick look at the french one, and saw similar issues:

input: "En décembre , l'émir du Qatar , cheikh Tamim ben Hamad Al-Thani , a mis en garde en décembre contre les dangers de l'Etat-providence."

En   ADP     _   case    en
décembre     NOUN    _   obl:mod     décembre
,    PUNCT   _   punct   ,
l'   DET     _   det     le
Ă©mir     NOUN    _   nsubj   Ă©mir
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
Ă     ADP     _   case    Ă 
le   DET     _   det     le
de   ADP     _   case    de
les      DET     _   det     le
de   ADP     _   case    de
le   DET     _   det     le
Ă     ADP     _   case    Ă 
le   DET     _   det     le
de   ADP     _   case    de
les      DET     _   det     le
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
Ă     ADP     _   case    Ă 
le   DET     _   det     le
de   ADP     _   case    de
les      DET     _   det     le
de   ADP     _   case    de
le   DET     _   det     le
Ă     ADP     _   case    Ă 
le   DET     _   det     le
de   ADP     _   case    de
les      DET     _   det     le
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
di   ADP     E   case    di
l’   DET     RD      det     il
di   ADP     E   case    di
l'   DET     RD      det     il
Ă     ADP     _   case    Ă 
le   DET     _   det     le
de   ADP     _   case    de
les      DET     _   det     le
de   ADP     _   case    de
le   DET     _   det     le
Ă     ADP     _   case    Ă 
le   DET     _   det     le

thanks for the help :))))