{ "info": { "author": "Tim Gianitsos", "author_email": "contact@qcrit.org", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6" ], "description": "Utilities for The Quantitative Criticism Lab\nhttps://www.qcrit.org\n\n## Installation\nWith `pip`:\n```bash\npip install qcrit\n```\nWith `pipenv`\n```bash\npipenv install qcrit\n```\n## About\n\nThe qcrit package contains utilities to facilitate processing and analyzing literature.\n\n### Feature extraction\n\nA feature is a number that results from processing literature. An example of a feature might be the number of definite articles, the mean sentence length, or the fraction of interrogative sentences. The word \"feature\" can also refer to a python function that computes such a value.\n\nTo compute features, you must 1) traverse each text in a corpus, 2) parse the text into tokens, 3) write logic to calculate features, and 4) output the results to the console or to a file. Also, this will run slowly unless you 5) cache tokenized text for features that use the same tokens.\n\nWith the `textual_feature` decorator, steps (1), (2), (4), and (5) are abstracted away - you just need to implement (3) the logic to calculate each feature.\n\nOnce you have written a feature as a `python` function, label it with the decorator `textual_feature`. Your feature must have exactly one parameter which is assumed to be the parsed text of a file.\n```python\nfrom qcrit.textual_feature import textual_feature\n@textual_feature()\ndef count_definite_article(text):\n\treturn text.count('the')\n```\n\nThe `textual_feature` module takes an argument that represents the type of tokenization.\n\nThere are four supported tokenization_types: 'sentences', 'words', 'sentence_words' and None. This tells the function in \nwhat format it will receive the 'text' parameter.\n- If None, the function will receive the text parameter as a string. \n- If 'sentences', the function will receive the text parameter as a list of sentences, each as a string\n- If 'words', the function will receive the text parameter as a list of words\n- If 'sentence_words', the function will recieve the text parameter as a list of sentences, each as a list of words\n\n```python\nfrom functools import reduce\n@textual_feature(tokenize_type='sentences')\ndef mean_sentence_len(text):\n\tsen_len = reduce(lambda cur_len, cur_sen: cur_len + len(cur_sen))\n\tnum_sentences = len(text)\n\treturn sen_len / num_sentences\n```\n\nUse `qcrit.extract_features.main` to run all the functions labeled with the decorators and output results into a file.\n\ncorpus_dir - the directory to search for files containing texts, this will traverse all sub-directories as well\n\nfile_extension_to_parse_function - map from file extension (e.g. 'txt', 'tess') of texts that you would like to parse to a function directing how to parse it\n\noutput_file - the file to output the results into, created to be analyzed during machine learning phase\n\nIn order for sentence tokenization to work correctly, setup_tokenizers() must be set to the \nterminal punctuation marks of the language being analyzed. Make sure this is done before features are declared.\n\n```python\nfrom qcrit.extract_features import main, parse_tess\nfrom qcrit.textual_feature import setup_tokenizers\nsetup_tokenizers(terminal_punctuation=('.', '?'))\nfrom somewhere_else import count_definite_article, mean_sentence_len\nmain(\n\tcorpus_dir='demo', file_extension_to_parse_function={'tess': parse_tess}, output_file='output.pickle'\n)\n\n```\nOutput:\n```bash\nExtracting features from .tess files in demo/\n100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 4/4 [00:00<00:00, 8.67it/s]\nFeature mining complete. Attempting to write feature results to \"output.pickle\"...\nSuccess!\n\n\nFeature mining elapsed time: 1.4919 seconds\n\n```\n\n### Analysis\n\nUse the `@model_analyzer()` decorator to label functions that analyze machine learning models\n\nInvoke `analyze_models.main('output.pickle', 'classifications.csv')` to\nrun all functions labeled with the `@model_analyzer()` decorator. To run only one function, include\nthe name of the function as the third parameter to analyze_models.main()\n\noutput.pickle: Now that the features have been extracted and output into output.pickle, we\ncan use machine learning models on them.\n\nclassifications.csv: The file classifications.csv contains the name of the file in the first column\nand the particular classification (prose or verse) in the second column for every file in the corpus.\n\n```python\nimport qcrit.analyze_models\nfrom qcrit.model_analyzer import model_analyzer\nfrom sklearn import ensemble\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\n\n@model_analyzer()\ndef feature_rankings(data, target, file_names, feature_names, labels_key):\n\tprint('-' * 40 + '\\nRandom Forest Classifier feature rankings\\n')\n\tfeatures_train, features_test, labels_train, _ = train_test_split(data, target, test_size=0.5, random_state=0)\n\tclf = ensemble.RandomForestClassifier(random_state=0, n_estimators=10)\n\tclf.fit(features_train, labels_train)\n\tclf.predict(features_test)\n\n\t#Display features in order of importance\n\tprint('Feature importances:')\n\tfor tup in sorted(zip(feature_names, clf.feature_importances_), key=lambda s: -s[1]):\n\t\tprint('\\t%f: %s' % (tup[1], tup[0]))\n\n@model_analyzer()\ndef classifier_accuracy(data, target, file_names, feature_names, labels_key):\n\tprint('-' * 40 + '\\nRandom Forest Classifier accuracy\\n')\n\tfeatures_train, features_test, labels_train, labels_test = train_test_split(\n\t\tdata, target, test_size=0.5, random_state=0\n\t)\n\tclf = ensemble.RandomForestClassifier(random_state=0, n_estimators=10)\n\tclf.fit(features_train, labels_train)\n\tresults = clf.predict(features_test)\n\n\tprint('Stats:')\n\tprint(\n\t\t'\\tNumber correct: ' + str(accuracy_score(labels_test, results, normalize=False)) +\n\t\t' / ' + str(len(results))\n\t)\n\tprint('\\tPercentage correct: ' + str(accuracy_score(labels_test, results) * 100) + '%')\n\n@model_analyzer()\ndef misclassified_texts(data, target, file_names, feature_names, labels_key):\n\tprint('-' * 40 + '\\nRandom Forest Classifier misclassified texts\\n')\n\tfeatures_train, features_test, labels_train, labels_test, idx_train, idx_test = train_test_split(\n\t\tdata, target, range(len(target)), test_size=0.5, random_state=0\n\t)\n\tprint('Train texts:\\n\\t' + '\\n\\t'.join(file_names[i] for i in idx_train) + '\\n')\n\tprint('Test texts:\\n\\t' + '\\n\\t'.join(file_names[i] for i in idx_test) + '\\n')\n\tclf = ensemble.RandomForestClassifier(random_state=0, n_estimators=10)\n\tclf.fit(features_train, labels_train)\n\tresults = clf.predict(features_test)\n\n\tprint('Misclassifications:')\n\tfor i, _ in enumerate(results):\n\t\tif results[i] != labels_test[i]:\n\t\t\tprint('\\t' + file_names[idx_test[i]])\n\nqcrit.analyze_models.main(\n\t'output.pickle', 'classifications.csv'\n)\n```\nOutput:\n```\n----------------------------------------\nRandom Forest Classifier feature rankings\n\nFeature importances:\n\t0.400000: num_conjunctions\n\t0.400000: num_interrogatives\n\t0.200000: mean_sentence_length\n\n\nElapsed time: 0.0122 seconds\n\n----------------------------------------\nRandom Forest Classifier accuracy\n\nStats:\n\tNumber correct: 1 / 2\n\tPercentage correct: 50.0%\n\n\nElapsed time: 0.0085 seconds\n\n----------------------------------------\nRandom Forest Classifier misclassified texts\n\nTrain texts:\n\tdemo/aristotle.poetics.tess\n\tdemo/aristophanes.ecclesiazusae.tess\n\nTest texts:\n\tdemo/euripides.heracles.tess\n\tdemo/plato.respublica.part.1.tess\n\nMisclassifications:\n\tdemo/plato.respublica.part.1.tess\n\n\nElapsed time: 0.0082 seconds\n```\n\n## Development\nTo activate the virtual environment, ensure that you have `pipenv` installed and `python` version 3.6 installed. Run the following:\n```bash\npipenv --python 3.6\npipenv shell\npipenv install --dev\n```\n\n### Demo\n```bash\npython demo/demo.py\n```\n\n## Submission\nThe following commands will submit the package to the `Python Package Index`. It may be necessary to increment the version number in `setup.py` and to delete any previously generated `dist/` and `build/` directories if they exist.\n```bash\npython setup.py bdist_wheel sdist\ntwine upload dist/*\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://www.qcrit.org", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "qcrit", "package_url": "https://pypi.org/project/qcrit/", "platform": "", "project_url": "https://pypi.org/project/qcrit/", "project_urls": { "Homepage": "https://www.qcrit.org", "Source Code": "https://github.com/QuantitativeCriticismLab/qcrit" }, "release_url": "https://pypi.org/project/qcrit/0.0.13/", "requires_dist": [ "numpy", "nltk", "tqdm" ], "requires_python": "", "summary": "Quantitative Criticism Lab", "version": "0.0.13" }, "last_serial": 5844071, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "a5766cacded63ba7b4e445887b56fc54", "sha256": "7b7677efe3e1b9d47996d0d1b2665f582f8ae972803b3db12357d2181df53a6e" }, "downloads": -1, "filename": "qcrit-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a5766cacded63ba7b4e445887b56fc54", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 1911, "upload_time": "2019-07-13T03:06:19", "url": "https://files.pythonhosted.org/packages/8f/c4/491eba82efe81400635c4055e39b647ecdcbd96ebcebe85858c52bc2fa7e/qcrit-0.0.1-py3-none-any.whl" } ], "0.0.10": [ { "comment_text": "", "digests": { "md5": "36b615722a271326901ea09ecac13dba", "sha256": "db7556da77eb36305250dbc52cf66c6db0c310863c64c9bf3d466c15042b31a3" }, "downloads": -1, "filename": "qcrit-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "36b615722a271326901ea09ecac13dba", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11616, "upload_time": "2019-08-06T15:10:03", "url": "https://files.pythonhosted.org/packages/3f/b2/7a457e1b30109948a3ab3ca2753cfd6858690821a3f7245f51e3b722baa6/qcrit-0.0.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6b284a123ff2be85274f6ea41bf0d5d9", "sha256": "133cdb7f13ab7bc4b9c89bbad6a5f68e268056df2976f894fbed023ea049354a" }, "downloads": -1, "filename": "qcrit-0.0.10.tar.gz", "has_sig": false, "md5_digest": "6b284a123ff2be85274f6ea41bf0d5d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12015, "upload_time": "2019-08-06T15:10:05", "url": "https://files.pythonhosted.org/packages/b5/4f/9cb5df834523cd7341103f2c3f30e03c5aa4c53f810488c0f3beb4f8fcf2/qcrit-0.0.10.tar.gz" } ], "0.0.11": [ { "comment_text": "", "digests": { "md5": "0ca318cb090ac7a4ce184e535dda131d", "sha256": "271b21c359fe33523a98f8069765e78e824cd72b10679a21f3748534fa95dcd6" }, "downloads": -1, "filename": "qcrit-0.0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "0ca318cb090ac7a4ce184e535dda131d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10757, "upload_time": "2019-08-15T19:27:22", "url": "https://files.pythonhosted.org/packages/4a/bd/4d40d5a3bb8efe94139aff76cef60963403c6d2d3367fefeb51a27cea9f4/qcrit-0.0.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "89f5a8e269b290e090515a241ffedbae", "sha256": "7dd3af4d507f36accb18a99cfeeedbbf1a832d00e4a3897266e83664c52b699e" }, "downloads": -1, "filename": "qcrit-0.0.11.tar.gz", "has_sig": false, "md5_digest": "89f5a8e269b290e090515a241ffedbae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9608, "upload_time": "2019-08-15T19:27:24", "url": "https://files.pythonhosted.org/packages/f7/0f/48ca2e728922e47cf9568b012bebffcc3e99485c782d0861cea645592c22/qcrit-0.0.11.tar.gz" } ], "0.0.12": [ { "comment_text": "", "digests": { "md5": "5adc7064d0544f0acdeda30c23da1b90", "sha256": "077ccde13b3a7f6b8ed075f96f0badb00c91d5c31f89190aa2156e8634d07268" }, "downloads": -1, "filename": "qcrit-0.0.12-py3-none-any.whl", "has_sig": false, "md5_digest": "5adc7064d0544f0acdeda30c23da1b90", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10885, "upload_time": "2019-08-25T12:37:58", "url": "https://files.pythonhosted.org/packages/15/e8/8196aaab78f3aa6879481ee0d90ea4bb68f3a6c9f9d88d83c53fb1f83f1e/qcrit-0.0.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6729950c4d8fc627b101f58faa217ae8", "sha256": "dd26733a1c297e15424c76941ee21732e12d95250687d8de6deeff5a1251082c" }, "downloads": -1, "filename": "qcrit-0.0.12.tar.gz", "has_sig": false, "md5_digest": "6729950c4d8fc627b101f58faa217ae8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9744, "upload_time": "2019-08-25T12:38:00", "url": "https://files.pythonhosted.org/packages/fa/4d/b5d5961bdf6d290deec2a93e5177099dce94d6d50841539ffd0f761f1a38/qcrit-0.0.12.tar.gz" } ], "0.0.13": [ { "comment_text": "", "digests": { "md5": "76b7a3763ef3a7c35a34d14a6d6ef3e5", "sha256": "d0275302c72ddf339b5ed03ad59c92582002fec1b2e5b3e83b9f6f0a15b92489" }, "downloads": -1, "filename": "qcrit-0.0.13-py3-none-any.whl", "has_sig": false, "md5_digest": "76b7a3763ef3a7c35a34d14a6d6ef3e5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11763, "upload_time": "2019-09-15T00:11:53", "url": "https://files.pythonhosted.org/packages/06/73/428b248714530ba19c1c3b75651c821fce426280f8335f71019e81d1b42d/qcrit-0.0.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0ea09e45ac66be87238ee2d235a69ac9", "sha256": "f0ddb114f6cf68527701a529225aea23f196267e8cadbc90238746d6346ba4cd" }, "downloads": -1, "filename": "qcrit-0.0.13.tar.gz", "has_sig": false, "md5_digest": "0ea09e45ac66be87238ee2d235a69ac9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12419, "upload_time": "2019-09-15T00:11:55", "url": "https://files.pythonhosted.org/packages/e6/75/8ca1fa320b498c1cdd0ecb00d2add42b85309cbec6120da9370dae6d49af/qcrit-0.0.13.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "1762f9621e69e103760f55098e0075c2", "sha256": "6730172e6694bc4a8c96aa0dc7bae06fd2ab0e6e5719fb0ad7bc02144cc21285" }, "downloads": -1, "filename": "qcrit-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1762f9621e69e103760f55098e0075c2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 1990, "upload_time": "2019-07-13T03:17:45", "url": "https://files.pythonhosted.org/packages/89/1a/a0e00e2e8bf21560e6b492177e5b05ec539e857f661ce9778936dec7d809/qcrit-0.0.2-py3-none-any.whl" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "6d007ccd79910df277e23cc235054e2c", "sha256": "2509234fbd6ecf1fe1f8abb868397be6a840f3f1937c52de89d873f5e6a6567e" }, "downloads": -1, "filename": "qcrit-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "6d007ccd79910df277e23cc235054e2c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 1992, "upload_time": "2019-07-13T03:25:03", "url": "https://files.pythonhosted.org/packages/e1/22/d1300bc5baea7216910fec64fb65bbaf23cf9426d11b8f84552a5b3453ad/qcrit-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "288dbe48a062b92cacecccdef2806a4e", "sha256": "e5aa82419837cfceaae0e8b625c36e06a229fed74a37d09cf8e6750018e096c4" }, "downloads": -1, "filename": "qcrit-0.0.3.tar.gz", "has_sig": false, "md5_digest": "288dbe48a062b92cacecccdef2806a4e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 974, "upload_time": "2019-07-13T03:25:05", "url": "https://files.pythonhosted.org/packages/63/cf/bc095d0682b6493259e3cc8c757b1d37cfb163d07cb002ba6203fe2cb3cf/qcrit-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "6395fd20d862e7edb49477eaf97e3c03", "sha256": "585f9dfbdc4cdd63aa11aeb21e6ff985f49e5c01cf589eb2b2331f0bda75f9fa" }, "downloads": -1, "filename": "qcrit-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "6395fd20d862e7edb49477eaf97e3c03", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2017, "upload_time": "2019-07-13T03:40:44", "url": "https://files.pythonhosted.org/packages/9f/51/416cdd1ae25a02bbcd6768d97c4d49f659138971f8a7475dc9d1728f95ef/qcrit-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d8f1c15bf2799074a8eadd70f6b0704c", "sha256": "eadac1d66cdc9deafcf22193622663b267429e336dac8cbe9d758788ffb11867" }, "downloads": -1, "filename": "qcrit-0.0.4.tar.gz", "has_sig": false, "md5_digest": "d8f1c15bf2799074a8eadd70f6b0704c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1002, "upload_time": "2019-07-13T03:40:46", "url": "https://files.pythonhosted.org/packages/6d/10/2275ed58d2e3afc8b6afee32d4c5394d835ab736c492a39e7234fe419e5a/qcrit-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "080cf6279cd0f3c2454c945beca611a1", "sha256": "9f996ec936b27217d48af8ada06e61ce463b23ed213211c0a97e1f2e10ea8d68" }, "downloads": -1, "filename": "qcrit-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "080cf6279cd0f3c2454c945beca611a1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2050, "upload_time": "2019-07-13T04:21:47", "url": "https://files.pythonhosted.org/packages/f5/69/b90befaf404056aff4638dff70bf4be28c9ab85b64b39d424399ad729d35/qcrit-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b4481442038221f2717fc544426091fd", "sha256": "e7fade11a193aa6a84705ffc191e0be46bb4f77f91d6cb3f872822b1dc4469a1" }, "downloads": -1, "filename": "qcrit-0.0.5.tar.gz", "has_sig": false, "md5_digest": "b4481442038221f2717fc544426091fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 1061, "upload_time": "2019-07-13T04:21:48", "url": "https://files.pythonhosted.org/packages/b2/4a/510d959e50c5d83abcceeb6c9d20ac43a615d2803ad61e74697685de4f1c/qcrit-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "41c16c120db59ed193c7c3302230eca3", "sha256": "ad2acaa29b2287e5830c7c454b8a8f1e85d6254023571656a540dc332534f4b9" }, "downloads": -1, "filename": "qcrit-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "41c16c120db59ed193c7c3302230eca3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13930, "upload_time": "2019-07-13T04:31:44", "url": "https://files.pythonhosted.org/packages/e5/82/6aab0b5e4cd4ee0664d2e9224dc6e021a878863a67d8446d9fbe51c45449/qcrit-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "db2822f7b6fba8bf4eab61f1fe5e8863", "sha256": "6f00a45e6fb67fa95ee0efad0d7df77681e275a144123d45474772e97882bbfb" }, "downloads": -1, "filename": "qcrit-0.0.6.tar.gz", "has_sig": false, "md5_digest": "db2822f7b6fba8bf4eab61f1fe5e8863", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10054, "upload_time": "2019-07-13T04:31:46", "url": "https://files.pythonhosted.org/packages/c8/40/e9a0e096b98a21a130b323e69ee659a48db4ed6b9450491b8d277b4d95e4/qcrit-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "7ea1b17f337e1e29538b8f6f57bc0f29", "sha256": "8a60081bde30b24c00282499f618c7067a7f838126bf50d79e732227a912f1e6" }, "downloads": -1, "filename": "qcrit-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "7ea1b17f337e1e29538b8f6f57bc0f29", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13931, "upload_time": "2019-07-13T04:44:07", "url": "https://files.pythonhosted.org/packages/3f/e5/6869daeed406d2e26487fa084d326f57478feffcdf0113c939d5263aee6f/qcrit-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3243556bbdd14ec6d6470ff58780864", "sha256": "83ffb95ff292f9fb1cc682b2591f6b92c6fa20296a0937cda37616051d6d304c" }, "downloads": -1, "filename": "qcrit-0.0.7.tar.gz", "has_sig": false, "md5_digest": "a3243556bbdd14ec6d6470ff58780864", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10051, "upload_time": "2019-07-13T04:44:09", "url": "https://files.pythonhosted.org/packages/3b/fc/929ab3b50624d5fbf87df4a506c6f4919d3ad1d0224e15d31c885101005f/qcrit-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "5f66353080cd57aaf0048e75f71adbc6", "sha256": "9e53a962b9258d81471f2f84752f09f9381c54c627c33fab5f0c3554eab1abc0" }, "downloads": -1, "filename": "qcrit-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "5f66353080cd57aaf0048e75f71adbc6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13972, "upload_time": "2019-07-13T04:49:33", "url": "https://files.pythonhosted.org/packages/a1/19/8dd72b563a00ebe5089e7480ab694204237d17cf034fe1b6a4fcf06abc08/qcrit-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4c0af8971634b135fcafe7b4b125349f", "sha256": "a6a495556be38a357e9022b5f00038faa35bbd4ee0169e4949264473bafbb660" }, "downloads": -1, "filename": "qcrit-0.0.8.tar.gz", "has_sig": false, "md5_digest": "4c0af8971634b135fcafe7b4b125349f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10418, "upload_time": "2019-07-13T04:49:36", "url": "https://files.pythonhosted.org/packages/07/03/33827edc3d7a1c62f3a612bfee9e2152e713e3ba9f050b0be8aca9815864/qcrit-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "42c020188d0d606b0e6375d2b460f5af", "sha256": "4547eceea9b3667ec63fd6a9ad20004d580801eca6d05e3b872bc792527919cd" }, "downloads": -1, "filename": "qcrit-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "42c020188d0d606b0e6375d2b460f5af", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9035, "upload_time": "2019-07-31T07:36:22", "url": "https://files.pythonhosted.org/packages/4d/be/be1cc98d44685d0cf2caa985b913629ca07bc95fa332c66485b90cc51d4d/qcrit-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "93a552cb67c1d2de117c82be8cfea89b", "sha256": "2cf310e48f623389cc948668d538c6943d316d4a081d0ec6ef9d459d937e43af" }, "downloads": -1, "filename": "qcrit-0.0.9.tar.gz", "has_sig": false, "md5_digest": "93a552cb67c1d2de117c82be8cfea89b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6635, "upload_time": "2019-07-31T07:36:23", "url": "https://files.pythonhosted.org/packages/eb/29/082f5f73cb45bce3d12f6fc87aad32a93231719c3a56f5be8da70132bf6d/qcrit-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "76b7a3763ef3a7c35a34d14a6d6ef3e5", "sha256": "d0275302c72ddf339b5ed03ad59c92582002fec1b2e5b3e83b9f6f0a15b92489" }, "downloads": -1, "filename": "qcrit-0.0.13-py3-none-any.whl", "has_sig": false, "md5_digest": "76b7a3763ef3a7c35a34d14a6d6ef3e5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11763, "upload_time": "2019-09-15T00:11:53", "url": "https://files.pythonhosted.org/packages/06/73/428b248714530ba19c1c3b75651c821fce426280f8335f71019e81d1b42d/qcrit-0.0.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0ea09e45ac66be87238ee2d235a69ac9", "sha256": "f0ddb114f6cf68527701a529225aea23f196267e8cadbc90238746d6346ba4cd" }, "downloads": -1, "filename": "qcrit-0.0.13.tar.gz", "has_sig": false, "md5_digest": "0ea09e45ac66be87238ee2d235a69ac9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12419, "upload_time": "2019-09-15T00:11:55", "url": "https://files.pythonhosted.org/packages/e6/75/8ca1fa320b498c1cdd0ecb00d2add42b85309cbec6120da9370dae6d49af/qcrit-0.0.13.tar.gz" } ] }