Как проверить значение атрибута Part of Speech при использовании паттерна с библиотекой Spacy? - PullRequest
0 голосов
/ 16 июня 2020

Я использую spacy, чтобы идентифицировать различные типы узоров. шаблон в основном имеет такую ​​форму:


pattern = [{"POS": "ADV"}, 

           {"POS": "AUX"}, 

           {"LOWER": "pas"}, 

           {"POS": "ADV"},]  # ADV, NOUN, ADJ



pattern2 = [{"POS": "ADV"}, 

           {"POS": "AUX"}, 

           {"LOWER": "pas"}, 

           {"POS": "ADJ"},]``



Я пытаюсь проверить значение последнего тега сообщения моего шаблона в лексиконе. Как видите, это либо прил., Либо нар. Итак, если слово в этом месте есть в моем словаре. Я могу добавить предложения в мой новый список.

Я даю вам небольшую правку моего кода, потому что он возвращает мне пустой список. Итак, если вы можете помочь понять, как это сделать, я буду признателен за любую помощь.


import spacy.attrs

from spacy.attrs import POS

import spacy

from spacy.lang.fr import French

from spacy.tokenizer import Tokenizer

from spacy.util import compile_prefix_regex, compile_infix_regex, compile_suffix_regex



nlp = spacy.load("fr_core_news_md")

from spacy.matcher import Matcher



 

sentence = ["Voyons ce n'est pas mal ce que vous faites", "Vive la vie.", " Vous n'êtes pas bien.", 

            "Je ne suis pas mauvaise","Jeune gens mangez bien", "Ce n'est pas mauvais", "il est peu scrupuleux", 

            " il manque d'amour ou de conséridation",

           " il est sans merci",

           " il est trop cher"

            " il est de mauvaise qualité",

           "il est dépourvu de sens",

           ]






pattern = [{"POS": "ADV"}, 

           {"POS": "AUX"}, 

           {"LOWER": "pas"}, 

           {"POS": "ADV"},]  # ADV, NOUN, ADJ



pattern2 = [{"POS": "ADV"}, 

           {"POS": "AUX"}, 

           {"LOWER": "pas"}, 

           {"POS": "ADJ"},]





pattern3 = [{"LOWER": "peu"},  

           {"POS": "ADJ"},]





matcher = Matcher(nlp.vocab)  

matcher.add("matching_1", None, pattern, pattern3, pattern2) 

lexique =['bien', 'gentil', 'long','scrupuleux']



f = open("file.txt", "w")

print("token --> lemme --> dep -->pos ")

for sent in sentence:

    doc=nlp(sent)

    for tok in doc:



        print(tok.text, "\t", tok.lemma_, "-->", tok.dep_, "-->", tok.pos_)



sent_extract=[]



for sent in sentence:

    doc=nlp(sent)

    print([t.text for t in doc])



    matches= matcher(doc)



    for match_id, start, end in matches:

        span = doc[start:end]



        print("found match:", span)



        if span.text in sent:

            if span.text[-1] in lexique:

                sent_extract.append(sent)



print(sent_extract)







Печать sent_extract дает:




['Voyons', 'ce', "n'", 'est', 'pas', 'mal', 'ce', 'que', 'vous', 'faites']

found match: n'est pas mal

['Vive', 'la', 'vie', '.']

[' ', 'Vous', "n'", 'êtes', 'pas', 'bien', '.']

found match: n'êtes pas bien

['Je', 'ne', 'suis', 'pas', 'mauvaise']

found match: ne suis pas mauvaise

['Jeune', 'gens', 'mangez', 'bien']

['Ce', "n'", 'est', 'pas', 'mauvais']

found match: n'est pas mauvais

['il', 'est', 'peu', 'scrupuleux']

found match: peu scrupuleux

[' ', 'il', 'manque', "d'", 'amour', 'ou', 'de', 'conséridation']

# Result : 

[]



Как видите, "scrupuleux" найдено в моем лексиконе, но возвращенный список пуст. Прошу вас, помогите мне найти, что я делаю не так?

...