6
votes

Utilisez Spacy pour trouver le lemme du russe (ces langages qui n'ont pas de modèle)

J'ai téléchargé le modèle Spacy English et trouve le lemme en utilisant ce code.

Two 11711838292424000352 two
apples 8566208034543834098 apple

Sortie:

import spacy
nlp = spacy.load('en')
doc = nlp(u'Two apples')
for token in doc:
    print(token, token.lemma, token.lemma_)

Maintenant, je voulais faire la même chose pour la langue russe . Mais Spacy n'a pas de modèles pour la langue russe. Mais je vois leur code GitHub pour la langue russe et je pense ce code pourrait être utilisé pour trouver un lemme.

Je suis nouveau sur Spacy. Will avait besoin d'un point de départ pour les langages qui n'ont pas de modèles. J'ai également noté que pour certaines langues, disons pour URDU, ils ont fourni un recherchez le dictionnaire pour la lemmatisation.

Je veux étendre cette chose à toutes les langues qui n'ont pas de modèles.

Remarque: Dans le code ci-dessus, je Je pense que cela pourrait être encore amélioré car dans mon cas, je n'avais besoin que de lemme, alors quelles sont les choses que je peux désactiver et comment?


5 commentaires

L'utilisation peut utiliser le package Spacy multilingue et voir la précision


@RahulAgarwal J'ai vérifié que ce n'était pas utile.


Est-ce que convertir le russe en anglais à l'aide de Google Translate, puis trouver le lemme et le reconvertir en anglais ...


Pas une solution réalisable dans mon cas.


Hmm Ils ont donné du code sur GitHub, j'ai du mal à savoir comment l'utiliser. Si vous voyez ci-dessus le code GitHub et que vous pouvez partager un exemple de code simple qui vous sera utile.


4 Réponses :


10
votes
  • Ce ne sera pas optimal en spacy si un modèle n'est pas présent.
  • StanfordNLP offre une couverture linguistique plus étendue et propose des modèles en russe: https: //stanfordnlp.github. io / stanfordnlp / installation_download.html
  •  entrez la description de l'image ici - spaCy a récemment lancé un wrapper pratique sur Stanford NLP, afin que vous puissiez utiliser les goodies StanfordNLP de manière transparente dans les pipelines spaCy:

    https://github.com/explosion/spacy-stanfordnlp

    Le code ressemblerait à ceci (non testé):

    import stanfordnlp
    from spacy_stanfordnlp import StanfordNLPLanguage
    
    stanfordnlp.download("ru")
    
    snlp = stanfordnlp.Pipeline(lang="ru")
    nlp = StanfordNLPLanguage(snlp)
    
    doc = nlp("Привет мир, это Россия")
    for token in doc:
        print(token.text, token.lemma_, token.pos_, token.dep_)
    

3 commentaires

Stanford CoreNLP prend en charge le lemme pour la langue anglaise uniquement. Consultez ce lien: stanfordnlp.github.io/CoreNLP/human-languages.html


Les résultats de l'analyse comparative indiquent que les modèles de langue russe prennent en charge le lemme -> stanfordnlp.github.io/stanfordnlp/ performance.html


Merci d'avoir partagé. J'ai également découvert ce lien plus tard.



6
votes

Vous pouvez utiliser Spacy avec le modèle russe ru2 de ce projet . Cela fonctionne.


0 commentaires

2
votes

Vous pouvez maintenant utiliser Stanza (anciennement StandfordNLP) pour ce

import stanza
from spacy_stanza import StanzaLanguage

stanza.download('ru')  # will take a while

snlp = stanza.Pipeline(lang="ru")
nlp = StanzaLanguage(snlp)

text = "Андре́й Серге́евич Арша́вин (род. 29 мая 1981[4], Ленинград) — российский футболист, бывший капитан сборной России, заслуженный мастер спорта России (2008)."
doc = nlp(text)

for token in doc:
    print(token, token.lemma, token.lemma_)

Tous les modèles disponibles sont répertoriés ici https://stanfordnlp.github.io/stanza/models.html


1 commentaires

J'obtiens ImportError: Le lemmatizer russe nécessite la bibliothèque pymorphy2 . La strophe est-elle juste un wrapper pour la bibliothèque pymorphy2?



2
votes

Vous pouvez utiliser le lemmatizer russe de spaCy. Suite à ce tutoriel , le résultat sera:

'андре́ серге́евич арша́вин (род. 29 ма 1981[4], ленинград) — российск футболист, бывш капита сборн россии, заслужен мастер спорт росс (2008).'

import nltk
from nltk.stem.snowball import SnowballStemmer

stemmer = SnowballStemmer(language='russian')
tokenizer = nltk.tokenize.WhitespaceTokenizer()

def stemming(text):
   tokens = [stemmer.stem(w) for w in tokenizer.tokenize(text)]
   return " ".join(tokens)

stemming(text)

Il peut également être utile d'utiliser la racine après la lemmatisation:

'Андре́й серге́ Арша́вин ( род . 29 мая 1981[4 ] , Ленинград ) — российский футболист , бывший капитан сборной России , заслуженный мастер спорт России ( 2008 ) .'

from spacy.lang.ru import Russian
nlp = Russian()

def lemmatization(text):
   doc = nlp(text)
   for token in doc:
      print(token, token.lemma, token.lemma_)
   tokens = [token.lemma_ for token in doc]
   return " ".join(tokens)

text = "Андре́й Серге́евич Арша́вин (род. 29 мая 1981[4], Ленинград) — российский футболист, бывший капитан сборной России, заслуженный мастер спорта России (2008)."
lemmatization(text)


0 commentaires