You can add another custom entity ruler to your pipeline by changing its name (to avoid name collision). Here is some code to illustrate, but please read the remark below:
import spacy
from spacy.pipeline import EntityRuler
nlp = spacy.load('en_core_web_sm', disable = ['ner'])
rulerPlants = EntityRuler(nlp, overwrite_ents=True)
flowers = ["rose", "tulip", "african daisy"]
for f in flowers:
rulerPlants.add_patterns([{"label": "flower", "pattern": f}])
animals = ["cat", "dog", "artic fox"]
rulerAnimals = EntityRuler(nlp, overwrite_ents=True)
for a in animals:
rulerAnimals.add_patterns([{"label": "animal", "pattern": a}])
rulerPlants.name = 'rulerPlants'
rulerAnimals.name = 'rulerAnimals'
nlp.add_pipe(rulerPlants)
nlp.add_pipe(rulerAnimals)
doc = nlp("cat and artic fox, plant african daisy")
for ent in doc.ents:
print(ent.text , '->', ent.label_)
#output:
#cat -> animal
#artic fox -> animal
#african daisy -> flower
We can verify that the pipeline does contain both entity rulers:
print(nlp.pipe_names)
# ['tagger', 'parser', 'rulerPlants', 'rulerAnimals']
Remark: I would suggest using the simpler and more natural approach of making a new entity ruler which contains the rules of both entity rulers:
rulerAll = EntityRuler(nlp)
rulerAll.add_patterns(rulerAnimals.patterns)
rulerAll.add_patterns(rulerPlants.patterns)
Finally concerning your question about best practices for entity labels, it is a common practice to use abbreviations written with capital letters (see Spacy NER documentation)
for example ORG, LOC, PERSON, etc..