Entité de remplacement avec son étiquette d'entité utilisant spacy

Dec 17 2020

Je veux faire pour mes données en remplaçant chaque entité par son étiquette en utilisant Spacy et j'ai 3000 lignes de texte nécessaires pour remplacer les entités par leur entité d'étiquette,

par example:

«La Géorgie est récemment devenue le premier État américain à« interdire la culture musulmane ».

Et je veux devenir comme ça:

«Le GPE est récemment devenu l'État ORDINAL du GPE pour« interdire la culture NORP. "

Je veux que le code remplace plus de lignes de texte.

Merci beaucoup.

Par exemple ces codes mais pour une phrase, je veux modifier s (chaîne) en colonne contenant 3000 lignes

Premier: from ( Remplacez l'entité par son étiquette dans SpaCy )

s= "His friend Nicolas J. Smith is here with Bart Simpon and Fred."
doc = nlp(s)
newString = s
for e in reversed(doc.ents): #reversed to not modify the offsets of other entities when substituting
    start = e.start_char
    end = start + len(e.text)
    newString = newString[:start] + e.label_ + newString[end:]
print(newString)
#His friend PERSON is here with PERSON and PERSON.

Deuxième: from ( Fusion des balises dans mon fichier à l'aide de l'annotation d'entité nommée )

import spacy

nlp = spacy.load("en_core_web_sm")
s ="Apple is looking at buying U.K. startup for $1 billion" doc = nlp(s) def replaceSubstring(s, replacement, position, length_of_replaced): s = s[:position] + replacement + s[position+length_of_replaced:] return(s) for ent in reversed(doc.ents): #print(ent.text, ent.start_char, ent.end_char, ent.label_) replacement = "<{}>{}</{}>".format(ent.label_,ent.text, ent.label_) position = ent.start_char length_of_replaced = ent.end_char - ent.start_char s = replaceSubstring(s, replacement, position, length_of_replaced) print(s) #<ORG>Apple</ORG> is looking at buying <GPE>U.K.</GPE> startup for <MONEY>$1 billion</MONEY>

Réponses

1 SergeyBushmanov Dec 17 2020 at 13:45

IIUC, vous pouvez réaliser ce que vous voulez avec:

  1. Lire vos textes à partir d'un fichier, chaque texte sur sa propre ligne
  2. Traitement des résultats en remplaçant les entités, le cas échéant, par leurs balises
  3. Écriture des résultats sur le disque, chaque texte sur sa propre ligne

Démo:

import spacy
nlp = spacy.load("en_core_web_md")

#read txt file, each string on its own line
with open("./try.txt","r") as f:
    texts = f.read().splitlines()

#substitute entities with their TAGS
docs = nlp.pipe(texts)
out = []
for doc in docs:
    out_ = ""
    for tok in doc:
        text = tok.text
        if tok.ent_type_:
            text = tok.ent_type_
        out_ += text + tok.whitespace_
    out.append(out_)

# write to file
with open("./out_try.txt","w") as f:
    f.write("\n".join(out))

Contenu du fichier d'entrée:

La Géorgie est récemment devenue le premier État américain à «interdire la culture musulmane.
Son ami Nicolas J. Smith est ici avec Bart Simpon et Fred.
Apple envisage d'acheter une start-up britannique pour 1 milliard de dollars.

Contenu du fichier de sortie:

Le GPE est récemment devenu l'État ORDINAL du GPE pour "interdire la culture NORP.
Son ami PERSON PERSON PERSON est ici avec PERSON PERSON et PERSON.
ORG envisage d'acheter une startup du GPE pour MONEYMONEY MONEY

Notez le MONEYMONEYmotif.

Ceci est dû au fait:

doc = nlp("Apple is looking at buying U.K. startup for $1 billion")
for tok in doc:
    print(f"{tok.text}, {tok.ent_type_}, whitespace='{tok.whitespace_}'")

Apple, ORG, whitespace=' '
is, , whitespace=' '
looking, , whitespace=' '
at, , whitespace=' '
buying, , whitespace=' '
U.K., GPE, whitespace=' '
startup, , whitespace=' '
for, , whitespace=' '
$, MONEY, whitespace='' # <-- no whitespace between $ and 1
1, MONEY, whitespace=' '
billion, MONEY, whitespace=''