The ML Conversational Analytic Tool is a proof of concept (POC) machine learning framework to automatically assess pull request comments and reviews for constructive and inclusive communication.
This repo contains experimental code for discussion and collaboration and is not ready for production use.
Constructive and inclusive communication ensures a productive and healthy working environment in open source communities. In open source, communication happens in many forms, including pull requests that are text-based conversations crucial to open source collaboration. The ML Conversational Analytic Tool identifies constructive and inclusive pull requests to foster a healthier open source community.
- Python 3.6+
A virtualenv or similar tools to create isolated Python environment is recommended for this project.
-
Install
virtualenvpip install virtualenv
-
Set up ML Conversational Analytic Tool in a virtualenv
python -m venv virtualenv-ml-conversational
-
Activate the virtualenv
source ./virtualenv-ml-conversational/bin/activate
-
Update pip
pip install --upgrade pip
-
Install required python libraries by running the command below
pip install -r requirements.txt
- Run all unit tests
python -m unittest discover -s tests
- Run an individual unit test
python -m unittest tests/<file_name>
- By using tox
python -m pip install --upgrade tox tox
The libraries used within the project are available in the requirements.txt.
githubDataExtraction.py extracts raw data from GitHub based on parameters passed in by the user. To successfully run the
script, a GitHub access token
is required and must be set as an environment variable.
Note: There is a rate limit associated with GitHub API. Please read more about GitHub API Rate Limits for details before extracting data from a GitHub repo.
export GH_TOKEN=<YOUR_TOKEN>
Run the script by passing in organization
python ./mcat/githubDataExtraction.py <organization>organizationis the name of the repository owner- (optional)
--repois the name of the repository; extracts all repositories in organization if not included. - (optional)
--reactionsis an optional flag to extract comment and review reactions.
github_data.py prepares your data for annotation use. Run the script by passing in path to rawdatafile.
python ./mcat/github_data.py <rawdatafile> --name <output_filename>rawdatafileis location of raw data csvname(optional) is the output filename.
The quality of the data and the model very much depends on annotation best practices. To annotate the raw data extracted we recommend using Data Annotator For Machine Learning.
featureVector.py creates feature vector based on the rawdatafile and optionally words file. Default features
include sentiment and code blocks. Words file contains words important in measuring inclusiveness and
constructiveness. This functionality could be used instead of manual annotation.
python ./mcat/featureVector.py <rawdatafile> --words <words_filename> --name <output_filename>words(optional) path to the words filename(optional) name of the output file.
After both raw and annotated datasets are available, models can be trained to predict Constructiveness and Inclusiveness.
There are two models available for training
BaseCNNBaseLSTM
To train, run the script with required parameters path to annotated_filename, dataset_filename, model, and outcome.
python ./mcat/run.py <annotated_filename> <dataset_filename> <model> <outcome>annotated_filenameis the location of the annotated dataset filedataset_filenameis the location of the raw datamodelis the type of model and can be 'LSTM' or 'CNN'outcomecan be 'Constructive', 'Inclusive' or 'Both'- (optional)
-save NAMESave the trained model, an outputNAMEmust be specified. The model is saved inmodels/name-outcomedirectory. - (optional)
-save_version VERSIONIf-save NAMEis specified, save the model using givenNAMEnadVERSIONThe parameter is ignored if-save NAMEis missing. By default, version001is used. - (optional)
-roleRelevantindicates that the encoding generated should be a stacked matrix representing user roles in conversation. If it is not set then a single matrix representing each comment/review without the role is generated. - (optional)
-padindicates that the number of comment/review should be padded to be a constant value. This argument is required to be set forCNNand not set forLSTM.
Both BaseCNN and BaseLSTM also have prediction explanation mechanisms that can be accessed through the
.explain(obs) method in both classes.
If you have ideas on how to improve the framework to assess text conversation for constructive and inclusive communication, we welcome your contributions!
Auto-generated API documentation can be found in docs/mcat directory.
Run the following command to update the API documentation
PYTHONPATH=./mcat pdoc --html --output-dir docs mcat- Measuring Constructiveness and Inclusivity in Open Source – Part 1
- Measuring Constructiveness and Inclusivity in Open Source – Part 2
- Measuring Constructiveness and Inclusivity in Open Source – Part 3
The ml-conversational-analytic-tool project team welcomes contributions from the community. If you wish to contribute code and you have not signed our contributor license agreement, our bot will update the issue when you open a Pull Request. For any questions about the CLA process, please refer to our FAQ. For more detailed information, refer to CONTRIBUTING.md.
Please remember to read our Code of Conduct and keep in mind during your collaboration.
Apache License v2.0: see LICENSE for details.