Publications markdown generator for academicpages¶

Takes a set of bibtex of publications and converts them for use with academicpages.github.io. This is an interactive Jupyter notebook (see more info here).

The core python code is also in pubsFromBibs.py. Run either from the markdown_generator folder after replacing updating the publist dictionary with:

  • bib file names
  • specific venue keys based on your bib file preferences
  • any specific pre-text for specific files
  • Collection Name (future feature)

TODO: Make this work with other databases of citations, TODO: Merge this with the existing TSV parsing solution

In [1]:
from pybtex.database.input import bibtex
import pybtex.database.input.bibtex 
from time import strptime
import string
import html
import os
import re
from unidecode import unidecode
In [2]:
#todo: incorporate different collection types rather than a catch all publications, requires other changes to template
publist = {
    "proceeding": {
        "file" : "/home/lensenandr/publications/lensen.bib",
        "venuekey": ["booktitle","journal"],
        "venue-pretext": "",
        "collection" : {"name":"publications",
                        "permalink":"/publication/"}
    }
}
In [3]:
html_escape_table = {
    "&": "&",
    '"': """,
    "'": "'"
    }

def html_escape(text):
    """Produce entities within text."""
    return "".join(html_escape_table.get(c,c) for c in text)
In [4]:
for pubsource in publist:
    parser = bibtex.Parser()
    bibdata = parser.parse_file(publist[pubsource]["file"])

    #loop through the individual references in a given bibtex file
    for bib_id in bibdata.entries:
        #reset default date
        pub_year = "1900"
        pub_month = "01"
        pub_day = "01"
        
        b = bibdata.entries[bib_id].fields
        
        try:
            pub_year = f'{b["year"]}'

            #todo: this hack for month and day needs some cleanup
            if "month" in b.keys(): 
                if(len(b["month"])<3):
                    pub_month = "0"+b["month"]
                    pub_month = pub_month[-2:]
                elif(b["month"] not in range(12)):
                    tmnth = strptime(b["month"][:3],'%b').tm_mon   
                    pub_month = "{:02d}".format(tmnth) 
                else:
                    pub_month = str(b["month"])
            if "day" in b.keys(): 
                pub_day = str(b["day"])

                
            pub_date = pub_year+"-"+pub_month+"-"+pub_day
            
            #strip out {} as needed (some bibtex entries that maintain formatting)
            clean_title = b["title"].replace("{", "").replace("}","").replace("\\","").replace(" ","-")    

            print(clean_title)
            #macrons etc
            clean_title = unidecode(clean_title)
            url_slug = re.sub("\\[.*\\]|[^a-zA-Z0-9_-]", "", clean_title)
            url_slug = url_slug.replace("--","-")
            print(url_slug)
            md_filename = (str(pub_date) + "-" + url_slug + ".md").replace("--","-")
            html_filename = (str(pub_date) + "-" + url_slug).replace("--","-")
            print(html_filename)
            #Build Citation from text
            citation = ""

            #citation authors - todo - add highlighting for primary author?
            for author in bibdata.entries[bib_id].persons["author"]:
                citation = citation+(" "+author.first_names[0]+" "+author.last_names[0]+", ").replace("{", "").replace("}","").replace("\\","")

            #citation title
            citation = citation + "\"" + html_escape(b["title"].replace("{", "").replace("}","").replace("\\","")) + ".\""

            #add venue logic depending on citation type
            venue = publist[pubsource]["venue-pretext"]
            for k in publist[pubsource]["venuekey"]:
                if k in b:
                    venue = venue + b[k].replace("{", "").replace("}","").replace("\\","")
                    break
            #venue = publist[pubsource]["venue-pretext"]+b[publist[pubsource]["venuekey"]].replace("{", "").replace("}","").replace("\\","")

            citation = citation + " " + html_escape(venue)
            citation = citation + ", " + pub_year + "."
            if "note" in b.keys():
                citation = citation + " " + html_escape(b['note']) + "."
            
            ## YAML variables
            md = "---\ntitle: \""   + html_escape(b["title"].replace("{", "").replace("}","").replace("\\","")) + '"\n'
            
            md += """collection: """ +  publist[pubsource]["collection"]["name"]

            md += """\npermalink: """ + publist[pubsource]["collection"]["permalink"]  + html_filename
            
            note = False
            if "note" in b.keys():
                if len(str(b["note"])) > 5:
                    #md += "\nexcerpt: '" + html_escape(b["note"]) + "'"
                    note = True

            md += "\ndate: " + str(pub_date) 

            md += "\nvenue: '" + html_escape(venue) + "'"
            
            b["url"] = '/files/{}.pdf'.format(bib_id)
            
            url = False
            if "url" in b.keys():
                if len(str(b["url"])) > 5:
            #this is annoying??
                    #md += "\npaperurl: '" + b["url"] + "'"
                    url = True

            md += "\ncitation: '" + html_escape(citation) + "'"

            md += "\n---"

            
            ## Markdown description for individual page
            #if note:
            #    md += "\n" + html_escape(b["note"]) + "\n"

            if url:
                md += "\n[Access paper here](" + b["url"] + "){:target=\"_blank\"}\n" 
            #else:
            #    md += "\nUse [Google Scholar](https://scholar.google.com/scholar?q="+html.escape(clean_title.replace("-","+"))+"){:target=\"_blank\"} for full citation"
            #print(md_filename)
            md_filename = os.path.basename(md_filename)
            print(md_filename)
            with open("../_publications/" + md_filename, 'w') as f:
                f.write(md)
            print(f'SUCESSFULLY PARSED {bib_id}: \"', b["title"][:60],"..."*(len(b['title'])>60),"\"")
        # field may not exist for a reference
        except KeyError as e:
            print(f'WARNING Missing Expected Field {e} from entry {bib_id}: \"', b["title"][:30],"..."*(len(b['title'])>30),"\"")
            continue
New-Representations-in-Genetic-Programming-for-Feature-Construction-in-k-Means-Clustering
New-Representations-in-Genetic-Programming-for-Feature-Construction-in-k-Means-Clustering
2017-11-10-New-Representations-in-Genetic-Programming-for-Feature-Construction-in-k-Means-Clustering
2017-11-10-New-Representations-in-Genetic-Programming-for-Feature-Construction-in-k-Means-Clustering.md
SUCESSFULLY PARSED lensen2017New: " New Representations in Genetic Programming for Feature Const ... "
Genetic-Programming-for-Region-Detection,-Feature-Extraction,-Feature-Construction-and-Classification-in-Image-Data
Genetic-Programming-for-Region-Detection-Feature-Extraction-Feature-Construction-and-Classification-in-Image-Data
2016-03-30-Genetic-Programming-for-Region-Detection-Feature-Extraction-Feature-Construction-and-Classification-in-Image-Data
2016-03-30-Genetic-Programming-for-Region-Detection-Feature-Extraction-Feature-Construction-and-Classification-in-Image-Data.md
SUCESSFULLY PARSED lensen2016Genetic: " Genetic Programming for Region Detection, Feature Extraction ... "
Genetic-Programming-for-algae-detection-in-river-images
Genetic-Programming-for-algae-detection-in-river-images
2015-05-25-Genetic-Programming-for-algae-detection-in-river-images
2015-05-25-Genetic-Programming-for-algae-detection-in-river-images.md
SUCESSFULLY PARSED lensen2015Genetic: " Genetic Programming for algae detection in river images  "
A-hybrid-Genetic-Programming-approach-to-feature-detection-and-image-classification
A-hybrid-Genetic-Programming-approach-to-feature-detection-and-image-classification
2015-11-23-A-hybrid-Genetic-Programming-approach-to-feature-detection-and-image-classification
2015-11-23-A-hybrid-Genetic-Programming-approach-to-feature-detection-and-image-classification.md
SUCESSFULLY PARSED lensen2015hybrid: " A hybrid Genetic Programming approach to feature detection a ... "
Improving-k-means-clustering-with-genetic-programming-for-feature-construction
Improving-k-means-clustering-with-genetic-programming-for-feature-construction
2017-04-19-Improving-k-means-clustering-with-genetic-programming-for-feature-construction
2017-04-19-Improving-k-means-clustering-with-genetic-programming-for-feature-construction.md
SUCESSFULLY PARSED lensen2017Improving: " Improving {k}-means clustering with genetic programming for  ... "
GPGC:-genetic-programming-for-automatic-clustering-using-a-flexible-non-hyper-spherical-graph-based-approach
GPGC-genetic-programming-for-automatic-clustering-using-a-flexible-non-hyper-spherical-graph-based-approach
2017-07-15-GPGC-genetic-programming-for-automatic-clustering-using-a-flexible-non-hyper-spherical-graph-based-approach
2017-07-15-GPGC-genetic-programming-for-automatic-clustering-using-a-flexible-non-hyper-spherical-graph-based-approach.md
SUCESSFULLY PARSED lensen2017GPGC: " {GPGC:} genetic programming for automatic clustering using a ... "
Using-Particle-Swarm-Optimisation-and-the-Silhouette-Metric-to-Estimate-the-Number-of-Clusters,-Select-Features,-and-Perform-Clustering
Using-Particle-Swarm-Optimisation-and-the-Silhouette-Metric-to-Estimate-the-Number-of-Clusters-Select-Features-and-Perform-Clustering
2017-04-19-Using-Particle-Swarm-Optimisation-and-the-Silhouette-Metric-to-Estimate-the-Number-of-Clusters-Select-Features-and-Perform-Clustering
2017-04-19-Using-Particle-Swarm-Optimisation-and-the-Silhouette-Metric-to-Estimate-the-Number-of-Clusters-Select-Features-and-Perform-Clustering.md
SUCESSFULLY PARSED lensen2017Using: " Using Particle Swarm Optimisation and the Silhouette Metric  ... "
Particle-Swarm-Optimisation-Representations-for-Simultaneous-Clustering-and-Feature-Selection
Particle-Swarm-Optimisation-Representations-for-Simultaneous-Clustering-and-Feature-Selection
2016-12-6-Particle-Swarm-Optimisation-Representations-for-Simultaneous-Clustering-and-Feature-Selection
2016-12-6-Particle-Swarm-Optimisation-Representations-for-Simultaneous-Clustering-and-Feature-Selection.md
SUCESSFULLY PARSED lensen2016Particle: " Particle Swarm Optimisation Representations for Simultaneous ... "
Generating-Redundant-Features-with-Unsupervised-Multi-tree-Genetic-Programming
Generating-Redundant-Features-with-Unsupervised-Multi-tree-Genetic-Programming
2018-04-4-Generating-Redundant-Features-with-Unsupervised-Multi-tree-Genetic-Programming
2018-04-4-Generating-Redundant-Features-with-Unsupervised-Multi-tree-Genetic-Programming.md
SUCESSFULLY PARSED lensen2018generating: " Generating Redundant Features with Unsupervised Multi-tree G ... "
Automatically-Evolving-Difficult-Benchmark-Feature-Selection-Datasets-with-Genetic-Programming
Automatically-Evolving-Difficult-Benchmark-Feature-Selection-Datasets-with-Genetic-Programming
2018-07-15-Automatically-Evolving-Difficult-Benchmark-Feature-Selection-Datasets-with-Genetic-Programming
2018-07-15-Automatically-Evolving-Difficult-Benchmark-Feature-Selection-Datasets-with-Genetic-Programming.md
SUCESSFULLY PARSED lensen2018automatically: " Automatically Evolving Difficult Benchmark Feature Selection ... "
Particle-Swarm-Optimisation-for-Feature-Selection-and-Weighting-in-High-Dimensional-Clustering
Particle-Swarm-Optimisation-for-Feature-Selection-and-Weighting-in-High-Dimensional-Clustering
2018-07-8-Particle-Swarm-Optimisation-for-Feature-Selection-and-Weighting-in-High-Dimensional-Clustering
2018-07-8-Particle-Swarm-Optimisation-for-Feature-Selection-and-Weighting-in-High-Dimensional-Clustering.md
SUCESSFULLY PARSED oneill2018particle: " Particle Swarm Optimisation for Feature Selection and Weight ... "
Can-Genetic-Programming-Do-Manifold-Learning-Too?
Can-Genetic-Programming-Do-Manifold-Learning-Too
2019-04-24-Can-Genetic-Programming-Do-Manifold-Learning-Too
2019-04-24-Can-Genetic-Programming-Do-Manifold-Learning-Too.md
SUCESSFULLY PARSED lensen2019can: " Can Genetic Programming Do Manifold Learning Too?  "
A-survey-on-evolutionary-machine-learning
A-survey-on-evolutionary-machine-learning
2019-04-15-A-survey-on-evolutionary-machine-learning
2019-04-15-A-survey-on-evolutionary-machine-learning.md
SUCESSFULLY PARSED alsahaf2019survey: " A survey on evolutionary machine learning  "
Genetic-Programming-for-Evolving-Similarity-Functions-for-Clustering:-Representations-and-Analysis
Genetic-Programming-for-Evolving-Similarity-Functions-for-Clustering-Representations-and-Analysis
2020-12-1-Genetic-Programming-for-Evolving-Similarity-Functions-for-Clustering-Representations-and-Analysis
2020-12-1-Genetic-Programming-for-Evolving-Similarity-Functions-for-Clustering-Representations-and-Analysis.md
SUCESSFULLY PARSED lensen2019genetic: " Genetic Programming for Evolving Similarity Functions for Cl ... "
Multi-Objective-Genetic-Programming-for-Manifold-Learning:-Balancing-Quality-and-Dimensionality
Multi-Objective-Genetic-Programming-for-Manifold-Learning-Balancing-Quality-and-Dimensionality
2020-02-5-Multi-Objective-Genetic-Programming-for-Manifold-Learning-Balancing-Quality-and-Dimensionality
2020-02-5-Multi-Objective-Genetic-Programming-for-Manifold-Learning-Balancing-Quality-and-Dimensionality.md
SUCESSFULLY PARSED lensen2019multi: " Multi-Objective Genetic Programming for Manifold Learning: B ... "
Genetic-Programming-for-Evolving-a-Front-of-Interpretable-Models-for-Data-Visualisation
Genetic-Programming-for-Evolving-a-Front-of-Interpretable-Models-for-Data-Visualisation
2021-11-9-Genetic-Programming-for-Evolving-a-Front-of-Interpretable-Models-for-Data-Visualisation
2021-11-9-Genetic-Programming-for-Evolving-a-Front-of-Interpretable-Models-for-Data-Visualisation.md
SUCESSFULLY PARSED lensen2020genetic: " Genetic Programming for Evolving a Front of Interpretable Mo ... "
Genetic-Programming-for-Manifold-Learning:-Preserving-Local-Topology
Genetic-Programming-for-Manifold-Learning-Preserving-Local-Topology
2022-08-23-Genetic-Programming-for-Manifold-Learning-Preserving-Local-Topology
2022-08-23-Genetic-Programming-for-Manifold-Learning-Preserving-Local-Topology.md
SUCESSFULLY PARSED lensen2021genetic: " Genetic Programming for Manifold Learning: Preserving Local  ... "
Evolving-Simpler-Constructed-Features-for-Clustering-Problems-with-Genetic-Programming
Evolving-Simpler-Constructed-Features-for-Clustering-Problems-with-Genetic-Programming
2020-07-19-Evolving-Simpler-Constructed-Features-for-Clustering-Problems-with-Genetic-Programming
2020-07-19-Evolving-Simpler-Constructed-Features-for-Clustering-Problems-with-Genetic-Programming.md
SUCESSFULLY PARSED schofield2020evolving: " Evolving Simpler Constructed Features for Clustering Problem ... "
Mining-Feature-Relationships-in-Data
Mining-Feature-Relationships-in-Data
2021-04-7-Mining-Feature-Relationships-in-Data
2021-04-7-Mining-Feature-Relationships-in-Data.md
SUCESSFULLY PARSED lensen2021mining: " Mining Feature Relationships in Data  "
Genetic-Programming-for-Evolving-Similarity-Functions-Tailored-to-Clustering-Algorithms
Genetic-Programming-for-Evolving-Similarity-Functions-Tailored-to-Clustering-Algorithms
2021-06-28-Genetic-Programming-for-Evolving-Similarity-Functions-Tailored-to-Clustering-Algorithms
2021-06-28-Genetic-Programming-for-Evolving-Similarity-Functions-Tailored-to-Clustering-Algorithms.md
SUCESSFULLY PARSED andersen2021genetic: " Genetic Programming for Evolving Similarity Functions Tailor ... "
Using-Genetic-Programming-to-Find-Functional-Mappings-for-UMAP-Embeddings
Using-Genetic-Programming-to-Find-Functional-Mappings-for-UMAP-Embeddings
2021-06-28-Using-Genetic-Programming-to-Find-Functional-Mappings-for-UMAP-Embeddings
2021-06-28-Using-Genetic-Programming-to-Find-Functional-Mappings-for-UMAP-Embeddings.md
SUCESSFULLY PARSED schofield2021using: " Using Genetic Programming to Find Functional Mappings for UM ... "
Large-Scale-Image-Classification-Using-GPU-based-Genetic-Programming
Large-Scale-Image-Classification-Using-GPU-based-Genetic-Programming
2022-07-9-Large-Scale-Image-Classification-Using-GPU-based-Genetic-Programming
2022-07-9-Large-Scale-Image-Classification-Using-GPU-based-Genetic-Programming.md
SUCESSFULLY PARSED zeng2022large: " Large Scale Image Classification Using {GPU}-based Genetic P ... "
Improving-the-Search-of-Learning-Classifier-Systems-Through-Interpretable-Feature-Clustering
Improving-the-Search-of-Learning-Classifier-Systems-Through-Interpretable-Feature-Clustering
2022-07-9-Improving-the-Search-of-Learning-Classifier-Systems-Through-Interpretable-Feature-Clustering
2022-07-9-Improving-the-Search-of-Learning-Classifier-Systems-Through-Interpretable-Feature-Clustering.md
SUCESSFULLY PARSED andersen2022improving: " Improving the Search of Learning Classifier Systems Through  ... "
Evolving-Counterfactual-Explanations-with-Particle-Swarm-Optimization-and-Differential-Evolution
Evolving-Counterfactual-Explanations-with-Particle-Swarm-Optimization-and-Differential-Evolution
2022-07-18-Evolving-Counterfactual-Explanations-with-Particle-Swarm-Optimization-and-Differential-Evolution
2022-07-18-Evolving-Counterfactual-Explanations-with-Particle-Swarm-Optimization-and-Differential-Evolution.md
SUCESSFULLY PARSED andersen2022evolving: " Evolving Counterfactual Explanations with Particle Swarm Opt ... "
Explainable-Artificial-Intelligence-for-Assault-Sentence-Prediction-in-New-Zealand
Explainable-Artificial-Intelligence-for-Assault-Sentence-Prediction-in-New-Zealand
2022-08-15-Explainable-Artificial-Intelligence-for-Assault-Sentence-Prediction-in-New-Zealand
2022-08-15-Explainable-Artificial-Intelligence-for-Assault-Sentence-Prediction-in-New-Zealand.md
SUCESSFULLY PARSED rodger2022explainable: " Explainable Artificial Intelligence for Assault Sentence Pre ... "
Using-Neural-Networks-to-Automate-Monitoring-of-Fish-Stocks
Using-Neural-Networks-to-Automate-Monitoring-of-Fish-Stocks
2022-12-4-Using-Neural-Networks-to-Automate-Monitoring-of-Fish-Stocks
2022-12-4-Using-Neural-Networks-to-Automate-Monitoring-of-Fish-Stocks.md
SUCESSFULLY PARSED stanley2022using: " Using Neural Networks to Automate Monitoring of Fish Stocks  "
Speeding-up-Genetic-Programming-Based-Symbolic-Regression-Using-GPUs
Speeding-up-Genetic-Programming-Based-Symbolic-Regression-Using-GPUs
2022-11-10-Speeding-up-Genetic-Programming-Based-Symbolic-Regression-Using-GPUs
2022-11-10-Speeding-up-Genetic-Programming-Based-Symbolic-Regression-Using-GPUs.md
SUCESSFULLY PARSED zhang2022speeding: " Speeding up Genetic Programming Based Symbolic Regression Us ... "
Evolutionary-Feature-Manipulation-in-Unsupervised-Learning
Evolutionary-Feature-Manipulation-in-Unsupervised-Learning
2019-09-01-Evolutionary-Feature-Manipulation-in-Unsupervised-Learning
2019-09-01-Evolutionary-Feature-Manipulation-in-Unsupervised-Learning.md
SUCESSFULLY PARSED lensen2019thesis: " Evolutionary Feature Manipulation in Unsupervised Learning  "
Explainable-Artificial-Intelligence-by-Genetic-Programming:-A-Survey
Explainable-Artificial-Intelligence-by-Genetic-Programming-A-Survey
2022-11-25-Explainable-Artificial-Intelligence-by-Genetic-Programming-A-Survey
2022-11-25-Explainable-Artificial-Intelligence-by-Genetic-Programming-A-Survey.md
SUCESSFULLY PARSED mei2022explainable: " Explainable Artificial Intelligence by Genetic Programming:  ... "
A-Genetic-Programming-Encoder-for-Increasing-Autoencoder-Interpretability
A-Genetic-Programming-Encoder-for-Increasing-Autoencoder-Interpretability
2023-04-12-A-Genetic-Programming-Encoder-for-Increasing-Autoencoder-Interpretability
2023-04-12-A-Genetic-Programming-Encoder-for-Increasing-Autoencoder-Interpretability.md
SUCESSFULLY PARSED schofield2023genetic: " A Genetic Programming Encoder for Increasing Autoencoder Int ... "
Feature-based-Image-Matching-for-Identifying-Individual-Kākā
Feature-based-Image-Matching-for-Identifying-Individual-Kaka
2023-01-17-Feature-based-Image-Matching-for-Identifying-Individual-Kaka
2023-01-17-Feature-based-Image-Matching-for-Identifying-Individual-Kaka.md
SUCESSFULLY PARSED osullivan2023feature: " Feature-based Image Matching for Identifying Individual Kākā  "
In [5]:
bibdata
Out[5]:
BibliographyData(
  entries=OrderedCaseInsensitiveDict([
    ('lensen2017New', Entry('inproceedings',
      fields=[
        ('title', 'New Representations in Genetic Programming for Feature Construction in k-Means Clustering'), 
        ('booktitle', 'Proceedings of the 11th International Conference on Simulated Evolution and Learning ({SEAL})'), 
        ('year', '2017'), 
        ('month', '11'), 
        ('day', '10'), 
        ('volume', '10593'), 
        ('series', 'Lecture Notes in Computer Science'), 
        ('pages', '543--555'), 
        ('publisher', 'Springer'), 
        ('url', '/files/lensen2017New.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('lensen2016Genetic', Entry('inproceedings',
      fields=[
        ('title', 'Genetic Programming for Region Detection, Feature Extraction, Feature Construction and Classification in Image Data'), 
        ('booktitle', 'Proceedings of the European Conference on Genetic Programming (EuroGP)'), 
        ('year', '2016'), 
        ('month', '3'), 
        ('day', '30'), 
        ('volume', '9594'), 
        ('series', 'Lecture Notes in Computer Science'), 
        ('pages', '51--67'), 
        ('publisher', 'Springer'), 
        ('url', '/files/lensen2016Genetic.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Al{-}Sahaf, Harith'), Person('Zhang, Mengjie'), Person('Xue, Bing')])]))), 
    ('lensen2015Genetic', Entry('inproceedings',
      fields=[
        ('title', 'Genetic Programming for algae detection in river images'), 
        ('booktitle', 'Proceedings of the {IEEE} Congress on Evolutionary Computation (CEC)'), 
        ('year', '2015'), 
        ('month', '5'), 
        ('day', '25'), 
        ('pages', '2468--2475'), 
        ('publisher', '{IEEE}'), 
        ('url', '/files/lensen2015Genetic.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Al{-}Sahaf, Harith'), Person('Zhang, Mengjie'), Person('Verma, Brijesh')])]))), 
    ('lensen2015hybrid', Entry('inproceedings',
      fields=[
        ('title', 'A hybrid Genetic Programming approach to feature detection and image classification'), 
        ('booktitle', 'Proceedings of the International Conference on Image and Vision Computing New Zealand (IVCNZ)'), 
        ('year', '2015'), 
        ('month', '11'), 
        ('day', '23'), 
        ('pages', '1--6'), 
        ('publisher', '{IEEE}'), 
        ('url', '/files/lensen2015hybrid.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Al{-}Sahaf, Harith'), Person('Zhang, Mengjie'), Person('Xue, Bing')])]))), 
    ('lensen2017Improving', Entry('inproceedings',
      fields=[
        ('title', 'Improving {k}-means clustering with genetic programming for feature construction'), 
        ('booktitle', 'Proceedings of the Genetic and Evolutionary Computation Conference (GECCO) Companion'), 
        ('year', '2017'), 
        ('month', '4'), 
        ('day', '19'), 
        ('pages', '237--238'), 
        ('publisher', '{ACM}'), 
        ('url', '/files/lensen2017Improving.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('lensen2017GPGC', Entry('inproceedings',
      fields=[
        ('title', '{GPGC:} genetic programming for automatic clustering using a flexible non-hyper-spherical graph-based approach'), 
        ('booktitle', 'Proceedings of the Genetic and Evolutionary Computation Conference (GECCO)'), 
        ('year', '2017'), 
        ('month', '7'), 
        ('day', '15'), 
        ('pages', '449--456'), 
        ('publisher', '{ACM}'), 
        ('url', '/files/lensen2017GPGC.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('lensen2017Using', Entry('inproceedings',
      fields=[
        ('title', 'Using Particle Swarm Optimisation and the Silhouette Metric to Estimate the Number of Clusters, Select Features, and Perform Clustering'), 
        ('booktitle', 'Proceedings of the European Conference on the Applications of Evolutionary Computation (EvoApplications), Part {I}'), 
        ('year', '2017'), 
        ('month', '4'), 
        ('day', '19'), 
        ('volume', '10199'), 
        ('series', 'Lecture Notes in Computer Science'), 
        ('pages', '538--554'), 
        ('publisher', 'Springer'), 
        ('url', '/files/lensen2017Using.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('lensen2016Particle', Entry('inproceedings',
      fields=[
        ('title', 'Particle Swarm Optimisation Representations for Simultaneous Clustering and Feature Selection'), 
        ('booktitle', 'Proceedings of the Symposium Series on Computational Intelligence (SSCI)'), 
        ('year', '2016'), 
        ('month', '12'), 
        ('day', '6'), 
        ('pages', '1--8'), 
        ('publisher', '{IEEE}'), 
        ('url', '/files/lensen2016Particle.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('lensen2018generating', Entry('inproceedings',
      fields=[
        ('title', 'Generating Redundant Features with Unsupervised Multi-tree Genetic Programming'), 
        ('booktitle', 'Proceedings of the European Conference on Genetic Programming (EuroGP)'), 
        ('pages', '84--100'), 
        ('year', '2018'), 
        ('month', '4'), 
        ('day', '4'), 
        ('series', 'Lecture Notes in Computer Science'), 
        ('volume', '10781'), 
        ('publisher', 'Springer'), 
        ('url', '/files/lensen2018generating.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('lensen2018automatically', Entry('inproceedings',
      fields=[
        ('title', 'Automatically Evolving Difficult Benchmark Feature Selection Datasets with Genetic Programming'), 
        ('booktitle', 'Proceedings of the Genetic and Evolutionary Computation Conference (GECCO)'), 
        ('pages', '458--465'), 
        ('year', '2018'), 
        ('month', '7'), 
        ('day', '15'), 
        ('publisher', '{ACM}'), 
        ('url', '/files/lensen2018automatically.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('oneill2018particle', Entry('inproceedings',
      fields=[
        ('title', 'Particle Swarm Optimisation for Feature Selection and Weighting in High-Dimensional Clustering'), 
        ('booktitle', 'Proceedings of the {IEEE} Congress on Evolutionary Computation (CEC)'), 
        ('year', '2018'), 
        ('month', '7'), 
        ('day', '8'), 
        ('publisher', '{IEEE}'), 
        ('pages', '1--8'), 
        ('url', '/files/oneill2018particle.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person("O'Neill, Damien"), Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('lensen2019can', Entry('inproceedings',
      fields=[
        ('title', 'Can Genetic Programming Do Manifold Learning Too?'), 
        ('booktitle', 'Proceedings of the European Conference on Genetic Programming (EuroGP)'), 
        ('year', '2019'), 
        ('month', '4'), 
        ('day', '24'), 
        ('volume', '11451'), 
        ('series', 'Lecture Notes in Computer Science'), 
        ('publisher', 'Springer'), 
        ('pages', '114--130'), 
        ('note', 'Best paper'), 
        ('url', '/files/lensen2019can.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('alsahaf2019survey', Entry('article',
      fields=[
        ('title', 'A survey on evolutionary machine learning'), 
        ('journal', 'Journal of the Royal Society of New Zealand'), 
        ('volume', '49'), 
        ('number', '2'), 
        ('pages', '205-228'), 
        ('year', '2019'), 
        ('month', '4'), 
        ('day', '15'), 
        ('publisher', 'Taylor & Francis'), 
        ('url', '/files/alsahaf2019survey.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Al-Sahaf, Harith'), Person('Bi, Ying'), Person('Chen, Qi'), Person('Lensen, Andrew'), Person('Mei, Yi'), Person('Sun, Yanan'), Person('Tran, Binh'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('lensen2019genetic', Entry('article',
      fields=[
        ('title', 'Genetic Programming for Evolving Similarity Functions for Clustering: Representations and Analysis'), 
        ('journal', 'Evolutionary Computation'), 
        ('volume', '28'), 
        ('number', '4'), 
        ('pages', '531--561'), 
        ('year', '2020'), 
        ('month', '12'), 
        ('day', '1'), 
        ('publisher', 'MIT Press'), 
        ('url', '/files/lensen2019genetic.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('lensen2019multi', Entry('article',
      fields=[
        ('title', 'Multi-Objective Genetic Programming for Manifold Learning: Balancing Quality and Dimensionality'), 
        ('journal', 'Genetic Programming and Evolvable Machines'), 
        ('volume', '21'), 
        ('number', '3'), 
        ('pages', '399--431'), 
        ('year', '2020'), 
        ('month', '2'), 
        ('day', '5'), 
        ('publisher', 'Springer'), 
        ('url', '/files/lensen2019multi.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Zhang, Mengjie'), Person('Xue, Bing')])]))), 
    ('lensen2020genetic', Entry('article',
      fields=[
        ('title', 'Genetic Programming for Evolving a Front of Interpretable Models for Data Visualisation'), 
        ('journal', '{IEEE} Transactions on Cybernetics'), 
        ('pages', '5468--5482'), 
        ('year', '2021'), 
        ('month', '11'), 
        ('day', '9'), 
        ('volume', '51'), 
        ('number', '11'), 
        ('publisher', 'IEEE'), 
        ('url', '/files/lensen2020genetic.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('lensen2021genetic', Entry('article',
      fields=[
        ('title', 'Genetic Programming for Manifold Learning: Preserving Local Topology'), 
        ('journal', '{IEEE} Transactions on Evolutionary Computation'), 
        ('pages', '661--675'), 
        ('year', '2022'), 
        ('month', '8'), 
        ('day', '23'), 
        ('volume', '26'), 
        ('number', '4'), 
        ('publisher', 'IEEE'), 
        ('url', '/files/lensen2021genetic.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('schofield2020evolving', Entry('inproceedings',
      fields=[
        ('title', 'Evolving Simpler Constructed Features for Clustering Problems with Genetic Programming'), 
        ('booktitle', 'Proceedings of the {IEEE} Congress on Evolutionary Computation (CEC)'), 
        ('year', '2020'), 
        ('month', '7'), 
        ('day', '19'), 
        ('publisher', '{IEEE}'), 
        ('pages', '1--8'), 
        ('url', '/files/schofield2020evolving.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Schofield, Finn'), Person('Lensen, Andrew')])]))), 
    ('lensen2021mining', Entry('inproceedings',
      fields=[
        ('title', 'Mining Feature Relationships in Data'), 
        ('booktitle', 'Proceedings of the European Conference on Genetic Programming (EuroGP)'), 
        ('year', '2021'), 
        ('month', '4'), 
        ('day', '7'), 
        ('volume', '12691'), 
        ('series', 'Lecture Notes in Computer Science'), 
        ('publisher', 'Springer'), 
        ('pages', '247--262'), 
        ('url', '/files/lensen2021mining.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew')])]))), 
    ('andersen2021genetic', Entry('inproceedings',
      fields=[
        ('title', 'Genetic Programming for Evolving Similarity Functions Tailored to Clustering Algorithms'), 
        ('booktitle', 'Proceedings of the {IEEE} Congress on Evolutionary Computation (CEC)'), 
        ('year', '2021'), 
        ('month', '6'), 
        ('day', '28'), 
        ('publisher', '{IEEE}'), 
        ('pages', '688--695'), 
        ('url', '/files/andersen2021genetic.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Andersen, Hayden'), Person('Lensen, Andrew'), Person('Xue, Bing')])]))), 
    ('schofield2021using', Entry('inproceedings',
      fields=[
        ('title', 'Using Genetic Programming to Find Functional Mappings for UMAP Embeddings'), 
        ('booktitle', 'Proceedings of the {IEEE} Congress on Evolutionary Computation (CEC)'), 
        ('year', '2021'), 
        ('month', '6'), 
        ('day', '28'), 
        ('publisher', '{IEEE}'), 
        ('pages', '704--711'), 
        ('url', '/files/schofield2021using.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Schofield, Finn'), Person('Lensen, Andrew')])]))), 
    ('zeng2022large', Entry('inproceedings',
      fields=[
        ('title', 'Large Scale Image Classification Using {GPU}-based Genetic Programming'), 
        ('booktitle', 'Proceedings of the Genetic and Evolutionary Computation Conference (GECCO) Companion'), 
        ('year', '2022'), 
        ('month', '7'), 
        ('day', '9'), 
        ('pages', '619--622'), 
        ('publisher', '{ACM}'), 
        ('url', '/files/zeng2022large.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Zeng, Peng'), Person('Lensen, Andrew'), Person('Sun, Yanan')])]))), 
    ('andersen2022improving', Entry('inproceedings',
      fields=[
        ('title', 'Improving the Search of Learning Classifier Systems Through Interpretable Feature Clustering'), 
        ('booktitle', 'Proceedings of the Genetic and Evolutionary Computation Conference (GECCO) Companion'), 
        ('year', '2022'), 
        ('month', '7'), 
        ('day', '9'), 
        ('pages', '1752--1756'), 
        ('publisher', '{ACM}'), 
        ('url', '/files/andersen2022improving.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Andersen, Hayden'), Person('Lensen, Andrew'), Person('Browne, {Will N.}')])]))), 
    ('andersen2022evolving', Entry('inproceedings',
      fields=[
        ('title', 'Evolving Counterfactual Explanations with Particle Swarm Optimization and Differential Evolution'), 
        ('booktitle', 'Proceedings of the {IEEE} Congress on Evolutionary Computation (CEC)'), 
        ('year', '2022'), 
        ('month', '7'), 
        ('day', '18'), 
        ('pages', '1--8'), 
        ('publisher', '{IEEE}'), 
        ('url', '/files/andersen2022evolving.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Andersen, Hayden'), Person('Lensen, Andrew'), Person('Browne, {Will N.}'), Person('Mei, Yi')])]))), 
    ('rodger2022explainable', Entry('article',
      fields=[
        ('title', 'Explainable Artificial Intelligence for Assault Sentence Prediction in New Zealand'), 
        ('journal', 'Journal of the Royal Society of New Zealand'), 
        ('year', '2022'), 
        ('month', '8'), 
        ('pages', '1--15'), 
        ('day', '15'), 
        ('publisher', 'Taylor & Francis'), 
        ('note', 'doi: 10.1080/03036758.2022.2114506'), 
        ('url', '/files/rodger2022explainable.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Rodger, Harry'), Person('Lensen, Andrew'), Person('Betkier, Marcin')])]))), 
    ('stanley2022using', Entry('inproceedings',
      fields=[
        ('title', 'Using Neural Networks to Automate Monitoring of Fish Stocks'), 
        ('booktitle', 'Proceedings of the Symposium Series on Computational Intelligence (SSCI)'), 
        ('year', '2022'), 
        ('month', '12'), 
        ('day', '4'), 
        ('pages', '1--6'), 
        ('publisher', '{IEEE}'), 
        ('url', '/files/stanley2022using.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Stanley, Michael'), Person('Lensen, Andrew'), Person('Zhang, Mengjie')])]))), 
    ('zhang2022speeding', Entry('inproceedings',
      fields=[
        ('title', 'Speeding up Genetic Programming Based Symbolic Regression Using GPUs'), 
        ('booktitle', 'Proceedings of the Pacific Rim International Conference on Artificial Intelligence (PRICAI)'), 
        ('year', '2022'), 
        ('month', '11'), 
        ('day', '10'), 
        ('pages', '1--14'), 
        ('publisher', '{IEEE}'), 
        ('url', '/files/zhang2022speeding.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Zhang, Rui'), Person('Lensen, Andrew'), Person('Sun, Yanan')])]))), 
    ('lensen2019thesis', Entry('phdthesis',
      fields=[
        ('title', 'Evolutionary Feature Manipulation in Unsupervised Learning'), 
        ('year', '2019'), 
        ('month', '9'), 
        ('pages', '268'), 
        ('institution', 'Te Herenga Waka---Victoria University of Wellington'), 
        ('url', '/files/lensen2019thesis.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Lensen, Andrew')])]))), 
    ('mei2022explainable', Entry('article',
      fields=[
        ('title', 'Explainable Artificial Intelligence by Genetic Programming: A Survey'), 
        ('journal', '{IEEE} Transactions on Evolutionary Computation'), 
        ('pages', '1--21'), 
        ('year', '2022'), 
        ('month', '11'), 
        ('day', '25'), 
        ('publisher', 'IEEE'), 
        ('doi', '10.1109/TEVC.2022.3225509'), 
        ('note', 'Early Access'), 
        ('url', '/files/mei2022explainable.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Mei, Yi'), Person('Chen, Qi'), Person('Lensen, Andrew'), Person('Xue, Bing'), Person('Zhang, Mengjie')])]))), 
    ('schofield2023genetic', Entry('inproceedings',
      fields=[
        ('title', 'A Genetic Programming Encoder for Increasing Autoencoder Interpretability'), 
        ('booktitle', 'Proceedings of the European Conference on Genetic Programming (EuroGP)'), 
        ('year', '2023'), 
        ('month', '4'), 
        ('day', '12'), 
        ('series', 'Lecture Notes in Computer Science'), 
        ('publisher', 'Springer'), 
        ('pages', '1--16'), 
        ('note', 'To Appear'), 
        ('url', '/files/schofield2023genetic.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person('Schofield, Finn'), Person('Lensen, Andrew'), Person('Slyfield, Luis')])]))), 
    ('osullivan2023feature', Entry('article',
      fields=[
        ('title', 'Feature-based Image Matching for Identifying Individual Kākā'), 
        ('year', '2023'), 
        ('note', 'https://doi.org/10.48550/arXiv.2301.06678'), 

        ('eprinttype', 'arXiv'), ('eprint', '2301.06678'), 
        ('journal', 'arXiv'), 
        ('month', '1'), 
        ('day', '17'), 
        ('url', '/files/osullivan2023feature.pdf')],
      persons=OrderedCaseInsensitiveDict([('author', [Person("O'Sullivan, Fintan"), Person('Escott, Kirita{-}Rose'), Person('Shaw, Rachael'), Person('Lensen, Andrew')])])))]),

  preamble=[])