Entitas pengganti dengan label entitasnya menggunakan spacy
Saya ingin melakukan untuk data saya dengan mengganti setiap entitas dengan labelnya menggunakan Spacy dan saya memiliki 3000 baris teks yang diperlukan untuk mengganti entitas dengan entitas label mereka,
sebagai contoh:
"Georgia baru-baru ini menjadi negara bagian AS pertama yang" melarang budaya Muslim. "
Dan ingin menjadi seperti ini:
"GPE baru-baru ini menjadi negara bagian GPE ORDINAL untuk" melarang budaya NORP. "
Saya ingin kode menggantikan lebih dari baris teks.
Terima kasih banyak.
Misalnya kode-kode ini tetapi untuk satu kalimat, saya ingin mengubah s (string) menjadi kolom berisi 3000 baris
Yang pertama: dari ( Ganti entitas dengan labelnya di 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.
Yang kedua: dari ( Menggabungkan tag ke dalam file saya menggunakan anotasi entitas bernama )
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>
Jawaban
IIUC, Anda dapat mencapai apa yang Anda inginkan dengan:
- Membaca teks Anda dari file, setiap teks di barisnya sendiri
- Memproses hasil dengan mengganti entitas, jika ada, dengan tag mereka
- Hasil penulisan ke disk, setiap teks pada barisnya sendiri
Demo:
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))
Isi file masukan:
Georgia baru-baru ini menjadi negara bagian AS pertama yang "melarang budaya Muslim.
Temannya Nicolas J. Smith ada di sini bersama Bart Simpon dan Fred.
Apple berencana membeli perusahaan rintisan Inggris seharga $ 1 miliar
Isi file keluaran:
GPE baru-baru ini menjadi negara bagian ORDINAL GPE untuk "melarang budaya NORP.
Temannya PERSON PERSON PERSON ada di sini bersama PERSON PERSON dan PERSON.
ORG akan membeli startup GPE untuk MONEYMONEY MONEY
Perhatikan MONEYMONEY
polanya.
Hal ini karena:
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=''