Entité de remplacement avec son étiquette d'entité utilisant spacy
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
IIUC, vous pouvez réaliser ce que vous voulez avec:
- Lire vos textes à partir d'un fichier, chaque texte sur sa propre ligne
- Traitement des résultats en remplaçant les entités, le cas échéant, par leurs balises
- É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 MONEYMONEY
motif.
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=''