Closed jfilter closed 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):
offset += 1
span = text[offset:]`
in the Tokenizer (line 106) tries to find the string "les" in the sentence and loops indefinitely.
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).
But would in this case "des"
become "de les"
in the doc.text?
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.
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 :))))
It works with other text but running this code will cause an infinite loop. It does not like "im Anhang".