{
"info": {
"author": "Alexandre Kabbach",
"author_email": "akb@3azouz.net",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 5 - Production/Stable",
"Environment :: Console",
"Intended Audience :: Developers",
"Intended Audience :: Education",
"Intended Audience :: Science/Research",
"License :: OSI Approved :: MIT License",
"Natural Language :: English",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Text Processing :: Linguistic"
],
"description": "# pyfn\n[![GitHub release][release-image]][release-url]\n[![PyPI release][pypi-image]][pypi-url]\n[![Build][travis-image]][travis-url]\n[![Requirements][req-image]][req-url]\n[![Code Coverage][coverage-image]][coverage-url]\n[![FrameNet][framenet-image]][framenet-url]\n[![MIT License][license-image]][license-url]\n\nWelcome to `pyfn`, a Python module to process FrameNet annotation.\n\n`pyfn` can be used to:\n\n1. [convert](#conversion) data to and from FRAMENET XML, SEMEVAL XML, SEMAFOR CoNLL, BIOS and CoNLL-X\n2. [preprocess](#preprocessing-and-frame-semantic-parsing) FrameNet data using a standardized state-of-the-art pipeline\n3. [run](#preprocessing-and-frame-semantic-parsing) the SEMAFOR, OPEN-SESAME and SIMPLEFRAMEID frame semantic parsers for frame and/or argument identification on the FrameNet 1.5, 1.6 and 1.7 datasets\n4. [build](#marshalling-and-unmarshalling-framenet-xml-data) your own frame semantic parser using a standard set of python models to marshall/unmarshall FrameNet XML data\n\nThis repository also accompanies the (Kabbach et al., 2018) paper:\n\n```tex\n@InProceedings{C18-1267,\n author = \t\"Kabbach, Alexandre\n\t\tand Ribeyre, Corentin\n\t\tand Herbelot, Aur{\\'e}lie\",\n title = \t\"Butterfly Effects in Frame Semantic Parsing: impact of data processing on model ranking\",\n booktitle = \t\"Proceedings of the 27th International Conference on Computational Linguistics\",\n year = \t\"2018\",\n publisher = \t\"Association for Computational Linguistics\",\n pages = \t\"3158--3169\",\n location = \t\"Santa Fe, New Mexico, USA\",\n url = \t\"http://aclweb.org/anthology/C18-1267\"\n}\n```\n\n## Dependencies\nOn Unix, you may need to install the following packages:\n```\nlibxml2 libxml2-dev libxslt1-dev python-3.x-dev\n```\n\n## Install\n```\npip3 install pyfn\n```\n\n## Use\nWhen using `pyfn`, your FrameNet splits directory structure should follow:\n```\n.\n|-- fndata-1.x-with-dev\n| |-- train\n| | |-- fulltext\n| | |-- lu\n| |-- dev\n| | |-- fulltext\n| | |-- lu\n| |-- test\n| | |-- fulltext\n| | |-- lu\n| |-- frame\n| |-- frRelation.xml\n| |-- semTypes.xml\n```\n\n## Conversion\n\n`pyfn` can be used to convert data to and from:\n- FRAMENET XML: the format of the released FrameNet XML data\n- SEMEVAL XML: the format of the SEMEVAL 2007 shared task 19 on frame semantic structure extraction\n- SEMAFOR CoNLL: the format used by the SEMAFOR parser\n- BIOS: the format used by the OPEN-SESAME parser\n- CoNLL-X: the format used by various state-of-the-art POS taggers and dependency\nparsers (see preprocessing considerations for frame semantic parsing\n[below](#preprocessing-and-frame-semantic-parsing))\n\nAs well as to generate the `.csv` hierarchy files used by both SEMAFOR and\nOPEN-SESAME parsers to integrate the hierarchy feature (see (Kshirsagar et al., 2015) for details).\n\nFor an exhaustive description of all formats, check out [FORMAT.md](FORMAT.md).\n\n### HowTo\n\nThe following sections provide examples of commands to convert FN data\nto and from different formats. All commands can make use of the following options:\n1. `--splits`: specify which splits should be converted. `--splits train` will generate all\ntrain/dev/test splits, according to data found under the fndata-1.x/{train/dev/test}\ndirectories. `--splits dev` will generate the dev and test splits according to data found under\nthe fndata-1.x/{dev/test} directories. This option will skip the train splits but generate the\nsame dev/test splits that would have been generated with `--splits train`. `--splits test` will\ngenerate the test splits according to data found under the fndata-1.x/test directory, and skip\nthe train/dev splits. The test splits generated with `--splits test` will be the same as those\ngenerated with the `--splits train` and `--splits dev`. Default to `--splits test`.\n2. `--output_sentences`: if specified, will output a `.sentences` file\nin the process, containing all raw annotated sentences, one sentence per line.\n3. `--with_exemplars`: if specified, will process the exemplars (data under\nthe `lu` directory) in addition to fulltext.\n4. `--filter`: specify data filtering options (see details below).\n\nFor details on `pyfn` usage, do:\n```bash\npyfn --help\npyfn generate --help\npyfn convert --help\n```\n\n### From FN XML to BIOS\nTo convert data from FrameNet XML format to BIOS format, do:\n\n```bash\npyfn convert \\\n --from fnxml \\\n --to bios \\\n --source /abs/path/to/fndata-1.x \\\n --target /abs/path/to/xp/data/output/dir \\\n --splits train \\\n --output_sentences \\\n --filter overlap_fes\n```\nUsing `--filter overlap_fes` will skip all annotationsets with overlapping\nframe elements, as those cases are not supported by the BIOS format.\n\n\n### From FN XML to SEMAFOR CoNLL\nTo generate the `train.frame.elements` file used to train SEMAFOR, and the\n`{dev,test}.frames` file used for decoding, do:\n\n```bash\npyfn convert \\\n --from fnxml \\\n --to semafor \\\n --source /abs/path/to/fndata-1.x \\\n --target /abs/path/to/xp/data/output/dir \\\n --splits train \\\n --output_sentences\n```\n\n### From FN XML to SEMEVAL XML\nTo generate the `{dev,test}.gold.xml` gold files in SEMEVAL format for scoring, do:\n\n```bash\npyfn convert \\\n --from fnxml \\\n --to semeval \\\n --source /abs/path/to/fndata-1.x \\\n --target /abs/path/to/xp/data/output/dir \\\n --splits {dev,test}\n```\n\n### From BIOS to SEMEVAL XML\nTo convert the decoded BIOS files `{dev,test}.bios.semeval.decoded` of\nOPEN-SESAME to SEMEVAL XML format for scoring, do:\n\n```bash\npyfn convert \\\n --from bios \\\n --to semeval \\\n --source /abs/path/to/{dev,test}.bios.semeval.decoded \\\n --target /abs/path/to/output/{dev,test}.predicted.xml \\\n --sent /abs/path/to/{dev,test}.sentences\n```\n\n### From SEMAFOR CoNLL to SEMEVAL XML\nTo convert the decoded `{dev,test}.frame.elements` files of SEMAFOR to\nSEMEVAL XML format for scoring, do:\n\n```bash\npyfn convert \\\n --from semafor \\\n --to semeval \\\n --source /abs/path/to/{dev,test}.frame.elements \\\n --target /abs/path/to/output/{dev,test}.predicted.xml \\\n --sent /abs/path/to/{dev,test}.sentences\n```\n\n### Generate the hierarchy `.csv` files\n```bash\npyfn generate \\\n --source /abs/path/to/fndata-1.x \\\n --target /abs/path/to/xp/data/output/dir\n```\nTo also process exemplars, add the `--with_exemplars` option\n\n\n## Preprocessing and Frame Semantic Parsing\n`pyfn` ships in with a set of bash scripts to preprocess FrameNet data with\nvarious POS taggers and dependency parsers, as well as to perform frame\nsemantic parsing with a variety of open-source parsers.\n\nCurrently supported POS taggers include:\n- MXPOST (Ratnaparkhi, 1996)\n- NLP4J (Choi, 2016)\n\nCurrently supported dependency parsers include:\n- MST (McDonald et al., 2006)\n- BIST BARCH (Kiperwasser and Goldberg, 2016)\n- BIST BMST (Kiperwasser and Goldberg, 2016)\n\nCurrently supported frame semantic parsers include:\n- SIMPLEFRAMEID (Hartmann et al., 2017) for frame identification\n- SEMAFOR (Kshirsagar et al., 2015) for argument identification\n- OPEN-SESAME (Swayamdipta et al., 2017) for argument identification\n\nTo request support for a POS tagger, a dependency parser or a frame semantic\nparser, please create an [issue](https://github.com/akb89/pyfn/issues) on Github/Gitlab.\n\n### Download\nTo run the preprocessing and frame semantic parsing scripts, first download:\n- `data.7z` containing all the FrameNet splits for FN 1.5 and FN 1.7\n```shell\nwget http://129.194.21.122/~kabbach/pyfn/data.7z\n```\n- `lib.7z` containing all the different external softwares (taggers, parsers, etc.)\n```shell\nwget http://129.194.21.122/~kabbach/pyfn/lib.7z\n```\n- `resources.7z` containing all the required resources\n```shell\nwget http://129.194.21.122/~kabbach/pyfn/resources.7z\n```\n- `scripts.7z` containing the set of bash scripts to call the different parsers and preprocessing toolkits\n```shell\nwget http://129.194.21.122/~kabbach/pyfn/scripts.7z\n```\n\nExtract the content of all the archives under a\ndirectory named `pyfn`. Your pyfn folder structure should look like:\n```\n.\n|-- pyfn\n| |-- data\n| | |-- fndata-1.5-with-dev\n| | |-- fndata-1.7-with-dev\n| |-- lib\n| | |-- bistparser\n| | |-- jmx\n| | |-- mstparser\n| | |-- nlp4j\n| | |-- open-sesame\n| | |-- semafor\n| | |-- semeval\n| |-- resources\n| | |-- bestarchybrid.model\n| | |-- bestarchybrid.params\n| | |-- bestfirstorder.model\n| | |-- bestfirstorder.params\n| | |-- config-decode-pos.xml\n| | |-- nlp4j.plemma.model.all.xz\n| | |-- sskip.100.vectors\n| | |-- wsj.model\n| |-- scripts\n| | |-- CoNLLizer.py\n| | |-- deparse.sh\n| | |-- flatten.sh\n| | |-- ...\n```\n\n**Please strictly follow this directory structure to avoid unexpected errors. `pyfn` relies on a lot of relative path resolutions to make scripts calls shorter, and changing this directory structure can break everything**\n\n### Setup NLP4J for POS tagging\n\nTo use NLP4J for POS tagging, modify the `resources/config-decode-pos.xml`\nfile by replacing the models.pos absolute path to\nyour `resources/nlp4j.plemma.model.all.xz`:\n```xml\n\n\t...\n\t\n\t\t/absolute/path/to/pyfn/resources/nlp4j.plemma.model.all.xz\n\t\n\n```\n\n### Setup DyNET for BIST or OPEN-SESAME\n\nIf you intend to use the BIST parser for dependency parsing or\nOPEN-SESAME for frame semantic parsing, you will need\nto install DyNET 2.0.2 via:\n```\npip install dynet=2.0.2\n```\nIf you experience problems installing DyNET via pip, follow:\n```\nhttps://dynet.readthedocs.io/en/2.0.2/python.html\n```\n\n### Setup SEMAFOR\nTo use the SEMAFOR frame semantic parser, modify the `scripts/setup.sh` file:\n```bash\n# SEMAFOR options to be changed according to your env\nexport JAVA_HOME_BIN=\"/abs/path/to/java/jdk/bin\"\nexport num_threads=2 # number of threads to use\nexport min_ram=4g # min RAM allocated to the JVM in GB. Corresponds to the -Xms argument\nexport max_ram=8g # max RAM allocated to the JVM in GB. Corresponds to the -Xmx argument\n\n# SEMAFOR hyperparameters\nexport kbest=1 # keep k-best parse\nexport lambda=0.000001 # hyperparameter for argument identification. Refer to Kshirsagar et al. (2015) for details.\nexport batch_size=4000 # number of batches processed at once for argument identification.\nexport save_every_k_batches=400 # for argument identification\nexport num_models_to_save=60 # for argument identification\n```\n\n### Setup SIMPLEFRAMEID\nIf you intend to use SIMPLEFRAMEID for frame identification, you will need to install the following packages (on python 2.7):\n```\npip install keras==2.0.6 lightfm==1.13 sklearn numpy==1.13.1 networkx==1.11 tensorflow==1.3.0\n```\n\n### Using the SEMEVAL PERL evaluation scripts\n\nIf you intend to use the SEMEVAL perl evaluation scripts, make sure\nto have the `App::cpanminus` and `XML::Parser` modules installed:\n```\ncpan App::cpanminus\ncpanm XML::Parser\n```\n\n### Using bash scripts\n\nEach script comes with a helper: check it out with `--help`!\n\n**Careful!** most scripts expect data output by `pyfn convert ...`\nto be located under `pyfn/experiments/xp_XYZ/data` where `XYZ` stands for\nthe experiments number and is specified using the `-x XYZ` argument, and where\nthe `experiments` directory is located at the same level as the `scripts`\ndirectory. This opinionated choice has proven extremely useful in launching\nscripts by batch on a large set of experiments as it avoids having to input\nthe full path each time.\n\n**Make sure to use**\n\n```bash\npyfn convert \\\n --from ... \\\n --to ... \\\n --source ... \\\n --target /abs/path/to/pyfn/experiments/xp_XYZ/data \\\n --splits ...\n```\n\n**BEFORE** calling `preprocess.sh`, `prepare.sh`, `semafor.sh` or\n`open-sesame.sh`\n\n### preprocess.sh\n\nUse `preprocess.sh` to POS-tag and dependency-parse FrameNet splits generated\nwith `pyfn convert ...`. The helper should display:\n\n```\nUsage: ${0##*/} [-h] -x XP_NUM -t {mxpost,nlp4j} -p {semafor,open-sesame} [-d {mst,bmst,barch}] [-v]\nPreprocess FrameNet train/dev/test splits.\n\n -h, --help display this help and exit\n -x, --xp XP_NUM xp number written as 3 digits (e.g. 001)\n -t, --tagger {mxpost,nlp4j} pos tagger to be used: 'mxpost' or 'nlp4j'\n -p, --parser {semafor,open-sesame} frame semantic parser to be used: 'semafor' or 'open-sesame'\n -d, --dep {mst,bmst,barch} dependency parser to be used: 'mst', 'bmst' or 'barch'\n -v, --dev if set, script will also preprocess dev splits\n```\n\nSuppose you generated FrameNet splits for SEMAFOR using:\n\n```bash\npyfn convert \\\n --from fnxml \\\n --to semafor \\\n --source /path/to/fndata-1.7-with-dev \\\n --target /path/to/experiments/xp_001/data \\\n --splits train \\\n --output_sentences\n```\n\nYou can preprocess those splits with NLP4J and BMST using\n\n```bash\n./preprocess.sh -x 001 -t nlp4j -d bmst -p semafor\n```\n\n### prepare.sh\n\nUse `prepare.sh` to automatically generate misc. data required by the\nframe semantic parsing pipeline, such as gold SEMEVAL XML files for scoring,\nthe `framenet.frame.element.map` and the hierarchy `.csv` files\nused by SEMAFOR, or the `frames.xml` and `frRelations.xml` files used by\nboth SEMAFOR and OPEN-SESAME. The helper should display:\n\n```\nUsage: ${0##*/} [-h] -x XP_NUM -p {semafor,open-sesame} -s {dev,test} -f FN_DATA_DIR [-u] [-e]\nPrepare misc. data for frame semantic parsing.\n\n -h, --help display this help and exit\n -x, --xp XP_NUM xp number written as 3 digits (e.g. 001)\n -p, --parser {semafor,open-sesame} frame semantic parser to be used: 'semafor' or 'open-sesame'\n -s, --splits {dev,test} which splits to score: dev or test\n -f, --fn FN_DATA_DIR absolute path to FrameNet data directory\n -u, --with_hierarchy if specified, will use the hierarchy feature\n -e, --with_exemplars if specified, will use the exemplars\n```\n\nSuppose you generated FrameNet splits for SEMAFOR using:\n\n```bash\npyfn convert \\\n --from fnxml \\\n --to semafor \\\n --source /path/to/fndata-1.7-with-dev \\\n --target /path/to/experiments/xp_001/data \\\n --splits train \\\n --output_sentences\n```\n\nYou can prepare SEMAFOR data using:\n\n```bash\n./prepare.sh -x 001 -p semafor -s test -f /path/to/fndata-1.7-with-dev\n```\n\n### frameid.sh\n\nUse `frameid.sh` to perform frame identification using SIMPLEFRAMEID.\nThe helper should display:\n\n```\nUsage: ${0##*/} [-h] -m {train,decode} -x XP_NUM [-p {semafor,open-sesame}]\nPerform frame identification.\n\n -h, --help display this help and exit\n -m, --mode train on all models or decode using a single model\n -x, --xp XP_NUM xp number written as 3 digits (e.g. 001)\n -p, --parser {semafor,open-sesame} formalize decoded frames for specified parser\n```\n\nSuppose you generated FrameNet splits for SEMAFOR using:\n\n```bash\npyfn convert \\\n --from fnxml \\\n --to semafor \\\n --source /path/to/fndata-1.7-with-dev \\\n --target /path/to/experiments/xp_101/data \\\n --splits train \\\n --output_sentences\n```\n\n*After preprocessing*, you can train the SIMPLEFRAMEID parser using:\n\n```bash\n./frameid.sh -m train -x 101\n```\n\nand decode (**before decoding argument identification**) using:\n\n```bash\n./frameid.sh -m decode -x 101 -p semafor\n```\n\n### semafor.sh\n\nUse `semafor.sh` to train the SEMAFOR parser or decode the test/dev splits.\nThe helper should display:\n\n```\nUsage: ${0##*/} [-h] -m {train,decode} -x XP_NUM [-s {dev,test}] [-u]\nTrain or decode with the SEMAFOR parser.\n\n -h, --help display this help and exit\n -m, --mode {train,decode} semafor mode to use: train or decode\n -x, --xp XP_NUM xp number written as 3 digits (e.g. 001)\n -s, --splits {dev,test} which splits to use in decode mode: dev or test\n -u, --with_hierarchy if specified, parser will use the hierarchy feature\n```\n\nSuppose you generated FrameNet splits for SEMAFOR using:\n\n```bash\npyfn convert \\\n --from fnxml \\\n --to semafor \\\n --source /path/to/fndata-1.7-with-dev \\\n --target /path/to/experiments/xp_001/data \\\n --splits train \\\n --output_sentences\n```\n\n*After preprocessing and preparation*, you can train the SEMAFOR parser using:\n\n```bash\n./semafor.sh -m train -x 001\n```\n\nand decode the test splits using:\n\n```bash\n./semafor.sh -m decode -x 001 -s test\n```\n\n### open-sesame.sh\n\nUse `open-sesame.sh` to train the OPEN-SESMAE parser or decode the test/dev splits.\nThe helper should display:\n\n```\nUsage: ${0##*/} [-h] -m {train,decode} -x XP_NUM [-s {dev,test}] [-d] [-u]\nTrain or decode with the OPEN-SESAME parser.\n\n -h, --help display this help and exit\n -m, --mode {train,decode} open-sesame mode to use: train or decode\n -x, --xp XP_NUM xp number written as 3 digits (e.g. 001)\n -s, --splits {dev,test} which splits to use in decode mode: dev or test\n -d, --with_dep_parses if specified, parser will use dependency parses\n -u, --with_hierarchy if specified, parser will use the hierarchy feature\n```\n\nSuppose you generated FrameNet splits for OPEN-SESAME using:\n\n```bash\npyfn convert \\\n --from fnxml \\\n --to bios \\\n --source /path/to/fndata-1.7-with-dev \\\n --target /path/to/experiments/xp_002/data \\\n --splits train \\\n --output_sentences \\\n --filter overlap_fes\n```\n\n*After preprocessing and preparation*, you can train the SEMAFOR parser using:\n\n```bash\n./open-sesame.sh -m train -x 002\n```\n\nand decode the test splits using:\n\n```bash\n./open-sesame.sh -m decode -x 002 -s test\n```\n\n### score.sh\n\nUse `score.sh` to obtain P/R/F1 scores for frame semantic parsing on\ndev/test splits with the SEMEVAL scoring script, using gold of predicted frames.\nThe helper should display:\n\n```\nUsage: ${0##*/} [-h] -x XP_NUM -p {semafor,open-sesame} -s {dev,test} -f {gold,predicted}\nScore frame semantic parsing with a modified version of the SEMEVAL scoring script.\n\n -h, --help display this help and exit\n -x, --xp XP_NUM xp number written as 3 digits (e.g. 001)\n -p, --parser {semafor,open-sesame} frame semantic parser to be used: 'semafor' or 'open-sesame'\n -s, --splits {dev,test} which splits to score: dev or test\n -f, --frames {gold,predicted} score with gold or predicted frames\n```\n\nNote that scoring is done with an updated version of the SEMEVAL perl script,\nin order to obtain more robust scores across setups. For a full account\nof the modifications, refer to (Kabbach et al., 2018) and to the perl scripts\nlocated under `lib/semeval/`.\n\nTo obtain scores for SEMAFOR using gold frames on test splits, use:\n\n```bash\n./score.sh -x XYZ -p semafor -s test -f gold\n```\n\nTo obtain scores for SEMAFOR using predicted frames on test splits, use:\n\n```bash\n./score.sh -x XYZ -p semafor -s test -f predicted\n```\n\n## Replication\n\nThe `experiments` directory provides a detailed set of instructions to\nreplicate all results reported in (Kabbach et al., 2018) on experimental\nbutterfly effects in frame semantic parsing. Those instructions can be used\nto compare the performances of different frame semantic parsers in various\nexperimental setups.\n\n\n## Marshalling and Unmarshalling FrameNet XML data\n\n`pyfn` provides a set of Python models to process FrameNet XML data.\nThose can be used to help you build you own frame semantic parser.\n\nThe core of the `pyfn` models is the `AnnotationSet` corresponding to an\nXML `` tag. It stores various information\nregarding a given set of FrameNet annotation for a given target in a given sentence.\nThe notable innovations are the `labelstore` and the `valenceunitstore`, which\nstore FrameNet labels (FE/PT/GF) in their original formats, and in custom\nformats which may prove useful for frame semantic parsing.\n\nExplore the various models under the `pyfn.models` directory of the `pyfn`\npackage.\n\n### Unmarshalling FrameNet XML data\n\nTo convert a list of fulltext.xml files and/or lu.xml files to a generator\nover `pyfn.AnnotationSet` objects, with no overlap between train/dev/test splits, use:\n\n```python\nimport pyfn.marshalling.unmarshallers.framenet as fn_unmarshaller\n\nif __name__ == '__main__':\n splits_dirpath = '/abs/path/to/framenet-1.x-with-dev/'\n splits = 'train'\n with_exemplars = False\n annosets_dict = fn_unmarshaller.get_annosets_dict(splits_dirpath,\n splits, with_exemplars)\n```\n`splits_dirpath` should point at the directory containing train/dev/test\nsplits directories (see detailed structure [above](#use)).\n\n`get_annosets_dict` will return a string to AnnotationSet generator dict.\nIt will ensure no overlap between train/dev/test splits.\n\nCalling `get_annosets_dict` on `splits='test'` will return a dictionary\nwith a single `'test'` key. Calling `get_annosets_dict` on `splits='dev'`\nwill return a dictionary with two keys: `'dev'` and `'test'`.\nCalling `get_annosets_dict` on `splits='train'` will return a dictionary\nwith three keys: `'train'`, `'dev'` and `'test'`.\n\nTo iterate over the list of AnnotationSet objects of each key, you can\nthen do:\n\n```python\nfor (splits, annosets) in annosets_dict.items():\n print('Iterating over annotationsets for splits: {}'.format(splits))\n for annoset in annosets:\n print('annoset with #id = {}'.format(annoset._id))\n```\n\nOr simply, to iterate over a specific key values (such as train annosets):\n\n```python\nfor annoset in annosets_dict['train']:\n print('annoset with #id = {}'.format(annoset._id))\n```\n\nNote that for performance, annosets is not a list but a generator.\n\n\n### Unmarshalling OPEN-SESAME BIOS data\n\nTo convert a `.bios` file with its corresponding `.sentences` file to\na generator over `pyfn.AnnotationSet` objects, use:\n\n```python\nimport pyfn.marshalling.unmarshallers.bios as bios_unmarshaller\n\nif __name__ == '__main__':\n bios_filepath = '/abs/path/to/.bios'\n sent_filepath = '/abs/path/to/.sentences'\n annosets = bios_unmarshaller.unmarshall_annosets(bios_filepath,\n sent_filepath)\n for annoset in annosets:\n print('annoset with #id = {}'.format(annoset._id))\n```\n\n**Important!** the `.bios` and `.sentences` files must have been generated\nwith `pyfn convert ... --to bios ...` with the `--filter overlap_fes`\nparameter.\n\n### Unmarshalling SEMAFOR CONLL data\n\nTo convert a `.frame.elements` file with its corresponding `.sentences`\nfile to a generator over `pyfn.AnnotationSet` objects, use:\n\n```python\nimport pyfn.marshalling.unmarshallers.semafor as semafor_unmarshaller\n\nif __name__ == '__main__':\n semafor_filepath = '/abs/path/to/.frame.elements'\n sent_filepath = '/abs/path/to/.sentences'\n annosets = semafor_unmarshaller.unmarshall_annosets(semafor_filepath,\n sent_filepath)\n for annoset in annosets:\n print('annoset with #id = {}'.format(annoset._id))\n```\n\n### Unmarshalling SEMEVAL XML data\n\nTo convert a SEMEVAL `.xml` file with its corresponding `.sentences`\nfile to a generator over `pyfn.AnnotationSet` objects, use:\n\n```python\nimport pyfn.marshalling.unmarshallers.semeval as semeval_unmarshaller\n\nif __name__ == '__main__':\n xml_filepath = '/abs/path/to/semeval/.xml'\n annosetss = semeval_unmarshaller.unmarshall_annosets(xml_filepath)\n```\n\nBy default `unmarshall_annosets` for SEMEVAL will return a generator over embedded annotationsets. To iterate over a single annotationset, use:\n\n```python\nfor annosets in annosetss:\n for annoset in annosets:\n print('annoset with #id = {}'.format(annoset._id))\n```\n\nTo return a 'flat' list of annosets, pass in the `flatten=True` parameter:\n\n```python\nimport pyfn.marshalling.unmarshallers.semeval as semeval_unmarshaller\n\nif __name__ == '__main__':\n xml_filepath = '/abs/path/to/semeval/.xml'\n annosets = semeval_unmarshaller.unmarshall_annosets(xml_filepath, flatten=True)\n for annoset in annosets:\n print('annoset with #id = {}'.format(annoset._id))\n```\n\n### Marshalling to OPEN-SESAME BIOS\n\nTo convert a dict of `splits` to `pyfn.AnnotationSet` objects to OPEN-SESAME-style `.bios`, refer to\n`pyfn.marshalling.marshallers.bios.marshall_annosets_dict`\n\n### Marshalling to SEMAFOR CONLL\n\nTo convert a dict of `splits` to `pyfn.AnnotationSet` objects to SEMAFOR-style `.frame.elements`, refer to\n`pyfn.marshalling.marshallers.semafor.marshall_annosets_dict`\n\n### Marshalling to SEMEVAL XML\n\nTo convert a list of `pyfn.AnnotationSet` objects to SEMEVAL-style `.xml`,\nrefer to `pyfn.marshalling.marshallers.semeval.marshall_annosets`\n\n### Marshalling to .csv hierarchy\n\nTo convert a list of relations to a `.csv` file, refer to\n`pyfn.marshalling.marshallers.hierarchy.marshall_relations`\n\n## Citation\n\nIf you use `pyfn` please cite:\n```tex\n@InProceedings{C18-1267,\n author = \t\"Kabbach, Alexandre\n\t\tand Ribeyre, Corentin\n\t\tand Herbelot, Aur{\\'e}lie\",\n title = \t\"Butterfly Effects in Frame Semantic Parsing: impact of data processing on model ranking\",\n booktitle = \t\"Proceedings of the 27th International Conference on Computational Linguistics\",\n year = \t\"2018\",\n publisher = \t\"Association for Computational Linguistics\",\n pages = \t\"3158--3169\",\n location = \t\"Santa Fe, New Mexico, USA\",\n url = \t\"http://aclweb.org/anthology/C18-1267\"\n}\n```\n\n\n[release-image]:https://img.shields.io/github/release/akb89/pyfn.svg?style=flat-square\n[release-url]:https://github.com/akb89/pyfn/releases/latest\n[pypi-image]:https://img.shields.io/pypi/v/pyfn.svg?style=flat-square\n[pypi-url]:https://pypi.org/project/pyfn/\n[travis-image]:https://img.shields.io/travis/akb89/pyfn.svg?style=flat-square\n[travis-url]:https://travis-ci.org/akb89/pyfn\n[coverage-image]:https://img.shields.io/coveralls/akb89/pyfn/master.svg?style=flat-square\n[coverage-url]:https://coveralls.io/github/akb89/pyfn?branch=master\n[framenet-image]:https://img.shields.io/badge/framenet-1.5%E2%87%A1-blue.svg?style=flat-square\n[framenet-url]:https://framenet.icsi.berkeley.edu/fndrupal\n[license-image]:http://img.shields.io/badge/license-MIT-000000.svg?style=flat-square\n[license-url]:LICENSE.txt\n[req-url]:https://requires.io/github/akb89/pyfn/requirements/?branch=master\n[req-image]:https://img.shields.io/requires/github/akb89/pyfn.svg?style=flat-square",
"description_content_type": "text/markdown",
"docs_url": null,
"download_url": "https://pypi.org/project/pyfn/#files",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://gitlab.com/akb89/pyfn",
"keywords": "framenet,xml,frame semantic parsing,preprocessing,coling2018,pipeline,semafor,open-sesame",
"license": "MIT",
"maintainer": "",
"maintainer_email": "",
"name": "pyfn",
"package_url": "https://pypi.org/project/pyfn/",
"platform": "any",
"project_url": "https://pypi.org/project/pyfn/",
"project_urls": {
"Download": "https://pypi.org/project/pyfn/#files",
"Homepage": "https://gitlab.com/akb89/pyfn"
},
"release_url": "https://pypi.org/project/pyfn/1.3.7/",
"requires_dist": null,
"requires_python": "",
"summary": "A python module to process data for Frame Semantic Parsing",
"version": "1.3.7"
},
"last_serial": 5370532,
"releases": {
"1.0.0rc1": [
{
"comment_text": "",
"digests": {
"md5": "cb927b34abeb443506cfb0a6959c0948",
"sha256": "9cc0149df40356df8ab79d4cf9cfcb6911d327629e390c38ea502b154e2b1e98"
},
"downloads": -1,
"filename": "pyfn-1.0.0rc1.tar.gz",
"has_sig": false,
"md5_digest": "cb927b34abeb443506cfb0a6959c0948",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27173,
"upload_time": "2018-06-06T10:50:52",
"url": "https://files.pythonhosted.org/packages/db/e0/861ea9cdd37a300dc92293dd813c59c26dc76320c4156a36f60353830ba1/pyfn-1.0.0rc1.tar.gz"
}
],
"1.0.0rc2": [
{
"comment_text": "",
"digests": {
"md5": "1e6f5f4a6d71d0474af43ca49da96047",
"sha256": "89e8a74457bda79e444ea685f854bf5f18eb326e1e9415ea479a9dfa65217825"
},
"downloads": -1,
"filename": "pyfn-1.0.0rc2.tar.gz",
"has_sig": false,
"md5_digest": "1e6f5f4a6d71d0474af43ca49da96047",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27337,
"upload_time": "2018-06-06T13:34:34",
"url": "https://files.pythonhosted.org/packages/56/70/fcaa08e445b855cd6a3bd3d595df3d15b02d5dcae6f12055cafcb0b69fdb/pyfn-1.0.0rc2.tar.gz"
}
],
"1.0.0rc3": [
{
"comment_text": "",
"digests": {
"md5": "88af45d82be8848f62fba930ff1bee45",
"sha256": "8696c24191e7291bf13dddef2544d72d51e1fdac4a76253f2478e9e568abb15d"
},
"downloads": -1,
"filename": "pyfn-1.0.0rc3.tar.gz",
"has_sig": false,
"md5_digest": "88af45d82be8848f62fba930ff1bee45",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27350,
"upload_time": "2018-06-06T13:45:12",
"url": "https://files.pythonhosted.org/packages/73/65/ad65bf927a6bd4b1d086d01b3ab959a4904b078e2831176f064c8f3ed4ff/pyfn-1.0.0rc3.tar.gz"
}
],
"1.0.0rc4": [
{
"comment_text": "",
"digests": {
"md5": "ea5d1c282048bdbbed77abc5187815fc",
"sha256": "9db2b55b1f3432f50e4432781728af857dad26a83e4ed269be393525111bb83b"
},
"downloads": -1,
"filename": "pyfn-1.0.0rc4.tar.gz",
"has_sig": false,
"md5_digest": "ea5d1c282048bdbbed77abc5187815fc",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27621,
"upload_time": "2018-06-06T14:38:59",
"url": "https://files.pythonhosted.org/packages/59/34/353d8cbdba0bd4acf7292028d7d04f8e2861ce4607faa9a62c3c8419d7cb/pyfn-1.0.0rc4.tar.gz"
}
],
"1.0.0rc5": [
{
"comment_text": "",
"digests": {
"md5": "f144f22d4f49544c0f6c3398592cac7e",
"sha256": "0c2f178d849038b03a3d0ca90f708e35b7f752ba379ce541649db079371d2ad3"
},
"downloads": -1,
"filename": "pyfn-1.0.0rc5.tar.gz",
"has_sig": false,
"md5_digest": "f144f22d4f49544c0f6c3398592cac7e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27620,
"upload_time": "2018-06-06T14:41:03",
"url": "https://files.pythonhosted.org/packages/b0/8f/0ce083fdf482adb45b5823fb8ec3863add2fe9d5ebdc414f1d36acf5d4a0/pyfn-1.0.0rc5.tar.gz"
}
],
"1.0.0rc6": [
{
"comment_text": "",
"digests": {
"md5": "e51db532ddd120fc380a27306276a3e2",
"sha256": "68768d1eda141d548880539620db09a8594ad6e16fa894c57387b57817177a2b"
},
"downloads": -1,
"filename": "pyfn-1.0.0rc6.tar.gz",
"has_sig": false,
"md5_digest": "e51db532ddd120fc380a27306276a3e2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 28446,
"upload_time": "2018-08-22T15:21:50",
"url": "https://files.pythonhosted.org/packages/39/25/81c3b53192c80ec0e07dff2336a2b873dbce62fe93f74050028e85aec1ec/pyfn-1.0.0rc6.tar.gz"
}
],
"1.0.0rc7": [
{
"comment_text": "",
"digests": {
"md5": "686b372cd6022503ac681b9867952589",
"sha256": "550444363929ee7ab4e15d065e436afadd8b750d273cc11ddb8d2fb08cf19b42"
},
"downloads": -1,
"filename": "pyfn-1.0.0rc7.tar.gz",
"has_sig": false,
"md5_digest": "686b372cd6022503ac681b9867952589",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 28449,
"upload_time": "2018-08-22T15:35:19",
"url": "https://files.pythonhosted.org/packages/1c/22/1b6888a383702cac149d517b68c5e7f32f3917b8f01bb683f02a819304a3/pyfn-1.0.0rc7.tar.gz"
}
],
"1.0.0rc8": [
{
"comment_text": "",
"digests": {
"md5": "9b531e02aa5a30aaed1638c1ef39f4a0",
"sha256": "d2533e8a7d20b0dfe75fb5fcc34a2a2a557c6329d8a535ee09407ca44e725053"
},
"downloads": -1,
"filename": "pyfn-1.0.0rc8.tar.gz",
"has_sig": false,
"md5_digest": "9b531e02aa5a30aaed1638c1ef39f4a0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 28500,
"upload_time": "2018-08-22T15:51:38",
"url": "https://files.pythonhosted.org/packages/34/06/e7cc242e884c91b9229b0fc54c2b915cc0541977c210c6bf268eab8c38e7/pyfn-1.0.0rc8.tar.gz"
}
],
"1.0.1": [
{
"comment_text": "",
"digests": {
"md5": "31333c51455787f60730aea65e5e1e97",
"sha256": "b3ecdee5343e183d5d9c3de6cc1fe891866314713d4e1826d2c35e2ab3fc9cc0"
},
"downloads": -1,
"filename": "pyfn-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "31333c51455787f60730aea65e5e1e97",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 28475,
"upload_time": "2018-08-22T19:02:05",
"url": "https://files.pythonhosted.org/packages/c5/8b/2443d617659bfed120ee8c9167bd9b3acecbd704901118e5433aa72166fd/pyfn-1.0.1.tar.gz"
}
],
"1.0.2": [
{
"comment_text": "",
"digests": {
"md5": "e2151cc6cfdb8556133b768ea3b33f51",
"sha256": "f3dadca946e1f28972a9f0d7607f4209bbcf91bc79ed5d3cbd248e7a33ae96eb"
},
"downloads": -1,
"filename": "pyfn-1.0.2.tar.gz",
"has_sig": false,
"md5_digest": "e2151cc6cfdb8556133b768ea3b33f51",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 29110,
"upload_time": "2018-08-24T17:53:06",
"url": "https://files.pythonhosted.org/packages/69/7f/3adaf5d9e9a015e281e914a11cb8e4c0c0cffe5d26e528afae09d345b832/pyfn-1.0.2.tar.gz"
}
],
"1.0.3": [
{
"comment_text": "",
"digests": {
"md5": "c6af30d62f0028b80e4e2412fa8e5366",
"sha256": "dcbcb9d5f66cdb954281b8b5780d4c9ca0094a47436cc71e4ee59cc568198528"
},
"downloads": -1,
"filename": "pyfn-1.0.3.tar.gz",
"has_sig": false,
"md5_digest": "c6af30d62f0028b80e4e2412fa8e5366",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 28653,
"upload_time": "2018-08-26T14:55:03",
"url": "https://files.pythonhosted.org/packages/18/79/799f178cec0b5e1cd15eb0bdffb724709c7ff7e3e29e70a529fea1f59ec8/pyfn-1.0.3.tar.gz"
}
],
"1.1.0": [
{
"comment_text": "",
"digests": {
"md5": "f9406f079efc24065afdf59cfa87c886",
"sha256": "cd1406cdfc256098140d11204012233430c5f8c9b37119aea4709131c97ceda0"
},
"downloads": -1,
"filename": "pyfn-1.1.0.tar.gz",
"has_sig": false,
"md5_digest": "f9406f079efc24065afdf59cfa87c886",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 28669,
"upload_time": "2018-08-26T15:13:37",
"url": "https://files.pythonhosted.org/packages/b2/c6/68552dc0599c274323b9e670cd5e2a666260994b93e10dbe5ae280c245a4/pyfn-1.1.0.tar.gz"
}
],
"1.1.1": [
{
"comment_text": "",
"digests": {
"md5": "d9a3882c1d35c92bd87723a0220f87cc",
"sha256": "e8246a4588380ebabb32f0ab69a7c9b21682788de220b8312ffe5df188ac6963"
},
"downloads": -1,
"filename": "pyfn-1.1.1.tar.gz",
"has_sig": false,
"md5_digest": "d9a3882c1d35c92bd87723a0220f87cc",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 29175,
"upload_time": "2018-08-26T16:07:26",
"url": "https://files.pythonhosted.org/packages/98/3c/bc786e82a98007bf404b71e564903892ca470b09cd669180e1b6cadcf417/pyfn-1.1.1.tar.gz"
}
],
"1.1.2": [
{
"comment_text": "",
"digests": {
"md5": "bdcb9b14161628272d8fcce09f8bbf55",
"sha256": "e925c2f251cd607749652e1fbf886224395b2f4ed75886556e2e6d9b97773750"
},
"downloads": -1,
"filename": "pyfn-1.1.2.tar.gz",
"has_sig": false,
"md5_digest": "bdcb9b14161628272d8fcce09f8bbf55",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 29570,
"upload_time": "2018-08-26T22:57:54",
"url": "https://files.pythonhosted.org/packages/1f/67/4aa68887eed54f0e6efcb34583d61963d7c0d5a2ffb58c478d59fb008823/pyfn-1.1.2.tar.gz"
}
],
"1.2.0": [
{
"comment_text": "",
"digests": {
"md5": "a9e354feb2f3a1651d0352f076ca31a2",
"sha256": "4d5b375911e9dc6b3277ae4df89aae2b4e713f9f90c4caf4c5474780d8971f9c"
},
"downloads": -1,
"filename": "pyfn-1.2.0.tar.gz",
"has_sig": false,
"md5_digest": "a9e354feb2f3a1651d0352f076ca31a2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45062,
"upload_time": "2018-08-30T21:09:10",
"url": "https://files.pythonhosted.org/packages/dc/78/e5fabc96c7648117d8a0d8f9d2c4ba94a5bd90b8d2310f20a960bb1bf9e0/pyfn-1.2.0.tar.gz"
}
],
"1.2.1": [
{
"comment_text": "",
"digests": {
"md5": "516951b61c1de64f71073448ae5a6f01",
"sha256": "471eceb1968bccb0a63221bc49aa5d89e9dea660a68ee638c3b60e460633a4c3"
},
"downloads": -1,
"filename": "pyfn-1.2.1.tar.gz",
"has_sig": false,
"md5_digest": "516951b61c1de64f71073448ae5a6f01",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45060,
"upload_time": "2018-08-30T21:58:28",
"url": "https://files.pythonhosted.org/packages/11/8e/d5e91e09e68b43ff7e86d01e3c0ca2fb33bf6319bd04bc2ce12333fc05d6/pyfn-1.2.1.tar.gz"
}
],
"1.2.2": [
{
"comment_text": "",
"digests": {
"md5": "50925cb9eb3f62e79fdfd15a31fd9758",
"sha256": "df97ff9fb3ba6eb637c95d502b47458cc08afbfb567b2ea5c3d376c23f07a3b9"
},
"downloads": -1,
"filename": "pyfn-1.2.2.tar.gz",
"has_sig": false,
"md5_digest": "50925cb9eb3f62e79fdfd15a31fd9758",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45096,
"upload_time": "2018-09-04T09:34:27",
"url": "https://files.pythonhosted.org/packages/3b/77/69a6b64705caba0b595ba06aac0738de02b673fd11e9a3d216ff5a382596/pyfn-1.2.2.tar.gz"
}
],
"1.2.3": [
{
"comment_text": "",
"digests": {
"md5": "20d6c979f2e65925b24991b2e1cb9bb1",
"sha256": "5a5a2802aaa71a54dd0c10fc238d53a50e7c92b4374bcd80327ea00123bc2b2d"
},
"downloads": -1,
"filename": "pyfn-1.2.3.tar.gz",
"has_sig": false,
"md5_digest": "20d6c979f2e65925b24991b2e1cb9bb1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45021,
"upload_time": "2018-09-18T12:19:20",
"url": "https://files.pythonhosted.org/packages/54/ab/beedd04315ad14aa496fe5a7b6f1f443185fc2813f46c573720c2cf6ed0f/pyfn-1.2.3.tar.gz"
}
],
"1.2.5": [
{
"comment_text": "",
"digests": {
"md5": "bfed0cc60effece93d4db59ce8fecaa9",
"sha256": "67a028100d53f876e952d8a2bb19da30e4d92bf082a9f6959437d01daec69297"
},
"downloads": -1,
"filename": "pyfn-1.2.5.tar.gz",
"has_sig": false,
"md5_digest": "bfed0cc60effece93d4db59ce8fecaa9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45050,
"upload_time": "2019-01-05T10:13:15",
"url": "https://files.pythonhosted.org/packages/bd/de/388c088a292f2d245e48b4fda1429cc23a047ef704a440103d75fa5e7e24/pyfn-1.2.5.tar.gz"
}
],
"1.2.6": [
{
"comment_text": "",
"digests": {
"md5": "e6a2a04379265b604f98434fa70ab6f3",
"sha256": "37e952fd456c95fbf0fbfe1dd85ebe0040809ab452680a2ea588f10156076e19"
},
"downloads": -1,
"filename": "pyfn-1.2.6.tar.gz",
"has_sig": false,
"md5_digest": "e6a2a04379265b604f98434fa70ab6f3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44887,
"upload_time": "2019-05-03T16:17:10",
"url": "https://files.pythonhosted.org/packages/4a/a0/ec8c33fd10de8e29a5eda9c2e3ecb1404bf1eba297eada0f510187258315/pyfn-1.2.6.tar.gz"
}
],
"1.3.0": [
{
"comment_text": "",
"digests": {
"md5": "532305921f91f088a68bd993d22cfeba",
"sha256": "ad0ce06d4e6720e5cd646f78f1818eed6d10dbce9218af365691a52ec619a4e6"
},
"downloads": -1,
"filename": "pyfn-1.3.0.tar.gz",
"has_sig": false,
"md5_digest": "532305921f91f088a68bd993d22cfeba",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44884,
"upload_time": "2019-05-03T16:36:16",
"url": "https://files.pythonhosted.org/packages/4d/a7/b0b2cd8fcb5c662f56e88bb8f92e2dfbc442298c8081ecdf81f75526c663/pyfn-1.3.0.tar.gz"
}
],
"1.3.3": [
{
"comment_text": "",
"digests": {
"md5": "7ab4e1743d3bb4046e84ebba1cbe54f5",
"sha256": "f73662d06d2ef70c33a9e5ff00f9f2a0c5e1e79b77cc3f14f074aa2e67669d4c"
},
"downloads": -1,
"filename": "pyfn-1.3.3.tar.gz",
"has_sig": false,
"md5_digest": "7ab4e1743d3bb4046e84ebba1cbe54f5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45216,
"upload_time": "2019-06-01T09:48:19",
"url": "https://files.pythonhosted.org/packages/f5/bd/11b67da946d07f77305558ddb0701f96cf000e8a61f1572358c61773dbd0/pyfn-1.3.3.tar.gz"
}
],
"1.3.4": [
{
"comment_text": "",
"digests": {
"md5": "e1a0525f653d7e05393a019a686a3095",
"sha256": "a561fd126ec55ed8d4d5d7a3b9aa8561d2f14fe5566a0346c10315f26e04cb6d"
},
"downloads": -1,
"filename": "pyfn-1.3.4.tar.gz",
"has_sig": false,
"md5_digest": "e1a0525f653d7e05393a019a686a3095",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45316,
"upload_time": "2019-06-02T09:45:05",
"url": "https://files.pythonhosted.org/packages/b6/f9/356a56afbe3878ce428f186e4c115e049bef9b0f9f65a165c487a405b489/pyfn-1.3.4.tar.gz"
}
],
"1.3.5": [
{
"comment_text": "",
"digests": {
"md5": "be1c95c56d306bc1ff9fefaa16dbbd8e",
"sha256": "428263e60b3bb6d638b0c1dbfa0bab76ff606157dfdc44fc128d77ebe7ccf7c6"
},
"downloads": -1,
"filename": "pyfn-1.3.5.tar.gz",
"has_sig": false,
"md5_digest": "be1c95c56d306bc1ff9fefaa16dbbd8e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45329,
"upload_time": "2019-06-06T13:45:05",
"url": "https://files.pythonhosted.org/packages/1b/31/9f67cb7797b0fa6096a5cc4e89f457c08c4199ecdeba58c8658ee0cf5c45/pyfn-1.3.5.tar.gz"
}
],
"1.3.6": [
{
"comment_text": "",
"digests": {
"md5": "580bdb7a4aecc971ea4f6a63d3864b05",
"sha256": "626a9566a294360aa4ee4c5e590e3d65269e36909d7aab10e72faf25445f6bf1"
},
"downloads": -1,
"filename": "pyfn-1.3.6.tar.gz",
"has_sig": false,
"md5_digest": "580bdb7a4aecc971ea4f6a63d3864b05",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45396,
"upload_time": "2019-06-06T14:55:21",
"url": "https://files.pythonhosted.org/packages/89/fd/c973d1114762642899000c8551763527bed6277124ce9814daa063d27b5c/pyfn-1.3.6.tar.gz"
}
],
"1.3.7": [
{
"comment_text": "",
"digests": {
"md5": "60a3479cc266b805a914d99f6639797c",
"sha256": "94426a316226810c999ccab03747cded9f5adf485e8587da734b0fa9c84a18db"
},
"downloads": -1,
"filename": "pyfn-1.3.7.tar.gz",
"has_sig": false,
"md5_digest": "60a3479cc266b805a914d99f6639797c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45485,
"upload_time": "2019-06-07T08:26:59",
"url": "https://files.pythonhosted.org/packages/00/84/6c63afd14b06caecd8a21527d1e30240431c9675b8b6ad30287ed71a16c7/pyfn-1.3.7.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "60a3479cc266b805a914d99f6639797c",
"sha256": "94426a316226810c999ccab03747cded9f5adf485e8587da734b0fa9c84a18db"
},
"downloads": -1,
"filename": "pyfn-1.3.7.tar.gz",
"has_sig": false,
"md5_digest": "60a3479cc266b805a914d99f6639797c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 45485,
"upload_time": "2019-06-07T08:26:59",
"url": "https://files.pythonhosted.org/packages/00/84/6c63afd14b06caecd8a21527d1e30240431c9675b8b6ad30287ed71a16c7/pyfn-1.3.7.tar.gz"
}
]
}