diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 3597ea8d1..8b9677709 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,15 +1,18 @@ - +If you're looking for help with your code, consider posting a question here: +- GitHub Discussions: https://github.com/explosion/spaCy/discussions +- Stack Overflow: http://stackoverflow.com/questions/tagged/spacy +--> ## Your Environment - -* Operating System: -* Python Version Used: -* spaCy Version Used: -* Environment Information: + +- Operating System: +- Python Version Used: +- spaCy Version Used: +- Environment Information: diff --git a/.github/ISSUE_TEMPLATE/04_docs.md b/.github/ISSUE_TEMPLATE/03_docs.md similarity index 100% rename from .github/ISSUE_TEMPLATE/04_docs.md rename to .github/ISSUE_TEMPLATE/03_docs.md diff --git a/.github/ISSUE_TEMPLATE/03_request.md b/.github/ISSUE_TEMPLATE/03_request.md deleted file mode 100644 index 0b64aadd2..000000000 --- a/.github/ISSUE_TEMPLATE/03_request.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: "\U0001F381 Feature Request" -about: Do you have an idea for an improvement, a new feature or a plugin? - ---- - -## Feature description - - -## Could the feature be a [custom component](https://spacy.io/usage/processing-pipelines#custom-components) or [spaCy plugin](https://spacy.io/universe)? -If so, we will tag it as [`project idea`](https://github.com/explosion/spaCy/labels/project%20idea) so other users can take it on. diff --git a/.github/ISSUE_TEMPLATE/04_other.md b/.github/ISSUE_TEMPLATE/04_other.md new file mode 100644 index 000000000..4c6ada4cc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/04_other.md @@ -0,0 +1,19 @@ +--- +name: "\U0001F4AC Anything else?" +about: For feature and project ideas, general usage questions or help with your code, please post on the GitHub Discussions board instead. +--- + + + +## Your Environment + + + +- Operating System: +- Python Version Used: +- spaCy Version Used: +- Environment Information: diff --git a/.github/ISSUE_TEMPLATE/05_other.md b/.github/ISSUE_TEMPLATE/05_other.md deleted file mode 100644 index 9aa04d161..000000000 --- a/.github/ISSUE_TEMPLATE/05_other.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -name: "\U0001F4AC Anything else?" -about: For general usage questions or help with your code, please consider - posting on Stack Overflow instead. - ---- - - - -## Your Environment - -* Operating System: -* Python Version Used: -* spaCy Version Used: -* Environment Information: diff --git a/.github/contributors/KKsharma99.md b/.github/contributors/KKsharma99.md new file mode 100644 index 000000000..468770278 --- /dev/null +++ b/.github/contributors/KKsharma99.md @@ -0,0 +1,108 @@ + + +# spaCy contributor agreement + +This spaCy Contributor Agreement (**"SCA"**) is based on the +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf). +The SCA applies to any contribution that you make to any product or project +managed by us (the **"project"**), and sets out the intellectual property rights +you grant to us in the contributed materials. The term **"us"** shall mean +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term +**"you"** shall mean the person or entity identified below. + +If you agree to be bound by these terms, fill in the information requested +below and include the filled-in version with your first pull request, under the +folder [`.github/contributors/`](/.github/contributors/). The name of the file +should be your GitHub username, with the extension `.md`. For example, the user +example_user would create the file `.github/contributors/example_user.md`. + +Read this agreement carefully before signing. These terms and conditions +constitute a binding legal agreement. + +## Contributor Agreement + +1. The term "contribution" or "contributed materials" means any source code, +object code, patch, tool, sample, graphic, specification, manual, +documentation, or any other material posted or submitted by you to the project. + +2. With respect to any worldwide copyrights, or copyright applications and +registrations, in your contribution: + + * you hereby assign to us joint ownership, and to the extent that such + assignment is or becomes invalid, ineffective or unenforceable, you hereby + grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge, + royalty-free, unrestricted license to exercise all rights under those + copyrights. This includes, at our option, the right to sublicense these same + rights to third parties through multiple levels of sublicensees or other + licensing arrangements; + + * you agree that each of us can do all things in relation to your + contribution as if each of us were the sole owners, and if one of us makes + a derivative work of your contribution, the one who makes the derivative + work (or has it made will be the sole owner of that derivative work; + + * you agree that you will not assert any moral rights in your contribution + against us, our licensees or transferees; + + * you agree that we may register a copyright in your contribution and + exercise all ownership rights associated with it; and + + * you agree that neither of us has any duty to consult with, obtain the + consent of, pay or render an accounting to the other for any use or + distribution of your contribution. + +3. With respect to any patents you own, or that you can license without payment +to any third party, you hereby grant to us a perpetual, irrevocable, +non-exclusive, worldwide, no-charge, royalty-free license to: + + * make, have made, use, sell, offer to sell, import, and otherwise transfer + your contribution in whole or in part, alone or in combination with or + included in any product, work or materials arising out of the project to + which your contribution was submitted, and + + * at our option, to sublicense these same rights to third parties through + multiple levels of sublicensees or other licensing arrangements. + +4. Except as set out above, you keep all right, title, and interest in your +contribution. The rights that you grant to us under these terms are effective +on the date you first submitted a contribution to us, even if your submission +took place before the date you sign these terms. + +5. You covenant, represent, warrant and agree that: + + * Each contribution that you submit is and shall be an original work of + authorship and you can legally grant the rights set out in this SCA; + + * to the best of your knowledge, each contribution will not violate any + third party's copyrights, trademarks, patents, or other intellectual + property rights; and + + * each contribution shall be in compliance with U.S. export control laws and + other applicable export and import laws. You agree to notify us if you + become aware of any circumstance which would make any of the foregoing + representations inaccurate in any respect. We may publicly disclose your + participation in the project, including the fact that you have signed the SCA. + +6. This SCA is governed by the laws of the State of California and applicable +U.S. Federal law. Any choice of law rules will not apply. + +7. Please place an “x” on one of the applicable statement below. Please do NOT +mark both statements: + + * [x] I am signing on behalf of myself as an individual and no other person + or entity, including my employer, has or will have rights with respect my + contributions. + + * [ ] I am signing on behalf of my employer or a legal entity and I have the + actual authority to contractually bind that entity. + +## Contributor Details + +| Field | Entry | +|------------------------------- | -------------------- | +| Name | Kunal Sharma | +| Company name (if applicable) | | +| Title or role (if applicable) | | +| Date | 10/19/2020 | +| GitHub username | KKsharma99 | +| Website (optional) | | diff --git a/.github/contributors/borijang.md b/.github/contributors/borijang.md new file mode 100644 index 000000000..0f2763f2a --- /dev/null +++ b/.github/contributors/borijang.md @@ -0,0 +1,106 @@ +# spaCy contributor agreement + +This spaCy Contributor Agreement (**"SCA"**) is based on the +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf). +The SCA applies to any contribution that you make to any product or project +managed by us (the **"project"**), and sets out the intellectual property rights +you grant to us in the contributed materials. The term **"us"** shall mean +[ExplosionAI GmbH](https://explosion.ai/legal). The term +**"you"** shall mean the person or entity identified below. + +If you agree to be bound by these terms, fill in the information requested +below and include the filled-in version with your first pull request, under the +folder [`.github/contributors/`](/.github/contributors/). The name of the file +should be your GitHub username, with the extension `.md`. For example, the user +example_user would create the file `.github/contributors/example_user.md`. + +Read this agreement carefully before signing. These terms and conditions +constitute a binding legal agreement. + +## Contributor Agreement + +1. The term "contribution" or "contributed materials" means any source code, +object code, patch, tool, sample, graphic, specification, manual, +documentation, or any other material posted or submitted by you to the project. + +2. With respect to any worldwide copyrights, or copyright applications and +registrations, in your contribution: + + * you hereby assign to us joint ownership, and to the extent that such + assignment is or becomes invalid, ineffective or unenforceable, you hereby + grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge, + royalty-free, unrestricted license to exercise all rights under those + copyrights. This includes, at our option, the right to sublicense these same + rights to third parties through multiple levels of sublicensees or other + licensing arrangements; + + * you agree that each of us can do all things in relation to your + contribution as if each of us were the sole owners, and if one of us makes + a derivative work of your contribution, the one who makes the derivative + work (or has it made will be the sole owner of that derivative work; + + * you agree that you will not assert any moral rights in your contribution + against us, our licensees or transferees; + + * you agree that we may register a copyright in your contribution and + exercise all ownership rights associated with it; and + + * you agree that neither of us has any duty to consult with, obtain the + consent of, pay or render an accounting to the other for any use or + distribution of your contribution. + +3. With respect to any patents you own, or that you can license without payment +to any third party, you hereby grant to us a perpetual, irrevocable, +non-exclusive, worldwide, no-charge, royalty-free license to: + + * make, have made, use, sell, offer to sell, import, and otherwise transfer + your contribution in whole or in part, alone or in combination with or + included in any product, work or materials arising out of the project to + which your contribution was submitted, and + + * at our option, to sublicense these same rights to third parties through + multiple levels of sublicensees or other licensing arrangements. + +4. Except as set out above, you keep all right, title, and interest in your +contribution. The rights that you grant to us under these terms are effective +on the date you first submitted a contribution to us, even if your submission +took place before the date you sign these terms. + +5. You covenant, represent, warrant and agree that: + + * Each contribution that you submit is and shall be an original work of + authorship and you can legally grant the rights set out in this SCA; + + * to the best of your knowledge, each contribution will not violate any + third party's copyrights, trademarks, patents, or other intellectual + property rights; and + + * each contribution shall be in compliance with U.S. export control laws and + other applicable export and import laws. You agree to notify us if you + become aware of any circumstance which would make any of the foregoing + representations inaccurate in any respect. We may publicly disclose your + participation in the project, including the fact that you have signed the SCA. + +6. This SCA is governed by the laws of the State of California and applicable +U.S. Federal law. Any choice of law rules will not apply. + +7. Please place an “x” on one of the applicable statement below. Please do NOT +mark both statements: + + * [ ] I am signing on behalf of myself as an individual and no other person + or entity, including my employer, has or will have rights with respect to my + contributions. + + * [x] I am signing on behalf of my employer or a legal entity and I have the + actual authority to contractually bind that entity. + +## Contributor Details + +| Field | Entry | +|------------------------------- | -------------------- | +| Name | Borijan Georgievski | +| Company name (if applicable) | Netcetera | +| Title or role (if applicable) | Deta Scientist | +| Date | 2020.10.09 | +| GitHub username | borijang | +| Website (optional) | | diff --git a/.github/contributors/danielvasic.md b/.github/contributors/danielvasic.md new file mode 100644 index 000000000..03606c8d9 --- /dev/null +++ b/.github/contributors/danielvasic.md @@ -0,0 +1,106 @@ +# spaCy contributor agreement + +This spaCy Contributor Agreement (**"SCA"**) is based on the +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf). +The SCA applies to any contribution that you make to any product or project +managed by us (the **"project"**), and sets out the intellectual property rights +you grant to us in the contributed materials. The term **"us"** shall mean +[ExplosionAI GmbH](https://explosion.ai/legal). The term +**"you"** shall mean the person or entity identified below. + +If you agree to be bound by these terms, fill in the information requested +below and include the filled-in version with your first pull request, under the +folder [`.github/contributors/`](/.github/contributors/). The name of the file +should be your GitHub username, with the extension `.md`. For example, the user +example_user would create the file `.github/contributors/example_user.md`. + +Read this agreement carefully before signing. These terms and conditions +constitute a binding legal agreement. + +## Contributor Agreement + +1. The term "contribution" or "contributed materials" means any source code, +object code, patch, tool, sample, graphic, specification, manual, +documentation, or any other material posted or submitted by you to the project. + +2. With respect to any worldwide copyrights, or copyright applications and +registrations, in your contribution: + + * you hereby assign to us joint ownership, and to the extent that such + assignment is or becomes invalid, ineffective or unenforceable, you hereby + grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge, + royalty-free, unrestricted license to exercise all rights under those + copyrights. This includes, at our option, the right to sublicense these same + rights to third parties through multiple levels of sublicensees or other + licensing arrangements; + + * you agree that each of us can do all things in relation to your + contribution as if each of us were the sole owners, and if one of us makes + a derivative work of your contribution, the one who makes the derivative + work (or has it made will be the sole owner of that derivative work; + + * you agree that you will not assert any moral rights in your contribution + against us, our licensees or transferees; + + * you agree that we may register a copyright in your contribution and + exercise all ownership rights associated with it; and + + * you agree that neither of us has any duty to consult with, obtain the + consent of, pay or render an accounting to the other for any use or + distribution of your contribution. + +3. With respect to any patents you own, or that you can license without payment +to any third party, you hereby grant to us a perpetual, irrevocable, +non-exclusive, worldwide, no-charge, royalty-free license to: + + * make, have made, use, sell, offer to sell, import, and otherwise transfer + your contribution in whole or in part, alone or in combination with or + included in any product, work or materials arising out of the project to + which your contribution was submitted, and + + * at our option, to sublicense these same rights to third parties through + multiple levels of sublicensees or other licensing arrangements. + +4. Except as set out above, you keep all right, title, and interest in your +contribution. The rights that you grant to us under these terms are effective +on the date you first submitted a contribution to us, even if your submission +took place before the date you sign these terms. + +5. You covenant, represent, warrant and agree that: + + * Each contribution that you submit is and shall be an original work of + authorship and you can legally grant the rights set out in this SCA; + + * to the best of your knowledge, each contribution will not violate any + third party's copyrights, trademarks, patents, or other intellectual + property rights; and + + * each contribution shall be in compliance with U.S. export control laws and + other applicable export and import laws. You agree to notify us if you + become aware of any circumstance which would make any of the foregoing + representations inaccurate in any respect. We may publicly disclose your + participation in the project, including the fact that you have signed the SCA. + +6. This SCA is governed by the laws of the State of California and applicable +U.S. Federal law. Any choice of law rules will not apply. + +7. Please place an “x” on one of the applicable statement below. Please do NOT +mark both statements: + + * [x] I am signing on behalf of myself as an individual and no other person + or entity, including my employer, has or will have rights with respect to my + contributions. + + * [ ] I am signing on behalf of my employer or a legal entity and I have the + actual authority to contractually bind that entity. + +## Contributor Details + +| Field | Entry | +|------------------------------- | -------------------- | +| Name | Daniel Vasić | +| Company name (if applicable) | University of Mostar | +| Title or role (if applicable) | Teaching asistant | +| Date | 13/10/2020 | +| GitHub username | danielvasic | +| Website (optional) | | diff --git a/.github/contributors/forest1988.md b/.github/contributors/forest1988.md new file mode 100644 index 000000000..486764b31 --- /dev/null +++ b/.github/contributors/forest1988.md @@ -0,0 +1,106 @@ +# spaCy contributor agreement + +This spaCy Contributor Agreement (**"SCA"**) is based on the +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf). +The SCA applies to any contribution that you make to any product or project +managed by us (the **"project"**), and sets out the intellectual property rights +you grant to us in the contributed materials. The term **"us"** shall mean +[ExplosionAI GmbH](https://explosion.ai/legal). The term +**"you"** shall mean the person or entity identified below. + +If you agree to be bound by these terms, fill in the information requested +below and include the filled-in version with your first pull request, under the +folder [`.github/contributors/`](/.github/contributors/). The name of the file +should be your GitHub username, with the extension `.md`. For example, the user +example_user would create the file `.github/contributors/example_user.md`. + +Read this agreement carefully before signing. These terms and conditions +constitute a binding legal agreement. + +## Contributor Agreement + +1. The term "contribution" or "contributed materials" means any source code, +object code, patch, tool, sample, graphic, specification, manual, +documentation, or any other material posted or submitted by you to the project. + +2. With respect to any worldwide copyrights, or copyright applications and +registrations, in your contribution: + + * you hereby assign to us joint ownership, and to the extent that such + assignment is or becomes invalid, ineffective or unenforceable, you hereby + grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge, + royalty-free, unrestricted license to exercise all rights under those + copyrights. This includes, at our option, the right to sublicense these same + rights to third parties through multiple levels of sublicensees or other + licensing arrangements; + + * you agree that each of us can do all things in relation to your + contribution as if each of us were the sole owners, and if one of us makes + a derivative work of your contribution, the one who makes the derivative + work (or has it made will be the sole owner of that derivative work; + + * you agree that you will not assert any moral rights in your contribution + against us, our licensees or transferees; + + * you agree that we may register a copyright in your contribution and + exercise all ownership rights associated with it; and + + * you agree that neither of us has any duty to consult with, obtain the + consent of, pay or render an accounting to the other for any use or + distribution of your contribution. + +3. With respect to any patents you own, or that you can license without payment +to any third party, you hereby grant to us a perpetual, irrevocable, +non-exclusive, worldwide, no-charge, royalty-free license to: + + * make, have made, use, sell, offer to sell, import, and otherwise transfer + your contribution in whole or in part, alone or in combination with or + included in any product, work or materials arising out of the project to + which your contribution was submitted, and + + * at our option, to sublicense these same rights to third parties through + multiple levels of sublicensees or other licensing arrangements. + +4. Except as set out above, you keep all right, title, and interest in your +contribution. The rights that you grant to us under these terms are effective +on the date you first submitted a contribution to us, even if your submission +took place before the date you sign these terms. + +5. You covenant, represent, warrant and agree that: + + * Each contribution that you submit is and shall be an original work of + authorship and you can legally grant the rights set out in this SCA; + + * to the best of your knowledge, each contribution will not violate any + third party's copyrights, trademarks, patents, or other intellectual + property rights; and + + * each contribution shall be in compliance with U.S. export control laws and + other applicable export and import laws. You agree to notify us if you + become aware of any circumstance which would make any of the foregoing + representations inaccurate in any respect. We may publicly disclose your + participation in the project, including the fact that you have signed the SCA. + +6. This SCA is governed by the laws of the State of California and applicable +U.S. Federal law. Any choice of law rules will not apply. + +7. Please place an “x” on one of the applicable statement below. Please do NOT +mark both statements: + + * [x] I am signing on behalf of myself as an individual and no other person + or entity, including my employer, has or will have rights with respect to my + contributions. + + * [ ] I am signing on behalf of my employer or a legal entity and I have the + actual authority to contractually bind that entity. + +## Contributor Details + +| Field | Entry | +|------------------------------- | -------------------- | +| Name | Yusuke Mori | +| Company name (if applicable) | | +| Title or role (if applicable) | Ph.D. student | +| Date | 2020/11/22 | +| GitHub username | forest1988 | +| Website (optional) | https://forest1988.github.io | diff --git a/.github/contributors/jabortell.md b/.github/contributors/jabortell.md new file mode 100644 index 000000000..4f878912f --- /dev/null +++ b/.github/contributors/jabortell.md @@ -0,0 +1,106 @@ +# spaCy contributor agreement + +This spaCy Contributor Agreement (**"SCA"**) is based on the +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf). +The SCA applies to any contribution that you make to any product or project +managed by us (the **"project"**), and sets out the intellectual property rights +you grant to us in the contributed materials. The term **"us"** shall mean +[ExplosionAI GmbH](https://explosion.ai/legal). The term +**"you"** shall mean the person or entity identified below. + +If you agree to be bound by these terms, fill in the information requested +below and include the filled-in version with your first pull request, under the +folder [`.github/contributors/`](/.github/contributors/). The name of the file +should be your GitHub username, with the extension `.md`. For example, the user +example_user would create the file `.github/contributors/example_user.md`. + +Read this agreement carefully before signing. These terms and conditions +constitute a binding legal agreement. + +## Contributor Agreement + +1. The term "contribution" or "contributed materials" means any source code, +object code, patch, tool, sample, graphic, specification, manual, +documentation, or any other material posted or submitted by you to the project. + +2. With respect to any worldwide copyrights, or copyright applications and +registrations, in your contribution: + + * you hereby assign to us joint ownership, and to the extent that such + assignment is or becomes invalid, ineffective or unenforceable, you hereby + grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge, + royalty-free, unrestricted license to exercise all rights under those + copyrights. This includes, at our option, the right to sublicense these same + rights to third parties through multiple levels of sublicensees or other + licensing arrangements; + + * you agree that each of us can do all things in relation to your + contribution as if each of us were the sole owners, and if one of us makes + a derivative work of your contribution, the one who makes the derivative + work (or has it made will be the sole owner of that derivative work; + + * you agree that you will not assert any moral rights in your contribution + against us, our licensees or transferees; + + * you agree that we may register a copyright in your contribution and + exercise all ownership rights associated with it; and + + * you agree that neither of us has any duty to consult with, obtain the + consent of, pay or render an accounting to the other for any use or + distribution of your contribution. + +3. With respect to any patents you own, or that you can license without payment +to any third party, you hereby grant to us a perpetual, irrevocable, +non-exclusive, worldwide, no-charge, royalty-free license to: + + * make, have made, use, sell, offer to sell, import, and otherwise transfer + your contribution in whole or in part, alone or in combination with or + included in any product, work or materials arising out of the project to + which your contribution was submitted, and + + * at our option, to sublicense these same rights to third parties through + multiple levels of sublicensees or other licensing arrangements. + +4. Except as set out above, you keep all right, title, and interest in your +contribution. The rights that you grant to us under these terms are effective +on the date you first submitted a contribution to us, even if your submission +took place before the date you sign these terms. + +5. You covenant, represent, warrant and agree that: + + * Each contribution that you submit is and shall be an original work of + authorship and you can legally grant the rights set out in this SCA; + + * to the best of your knowledge, each contribution will not violate any + third party's copyrights, trademarks, patents, or other intellectual + property rights; and + + * each contribution shall be in compliance with U.S. export control laws and + other applicable export and import laws. You agree to notify us if you + become aware of any circumstance which would make any of the foregoing + representations inaccurate in any respect. We may publicly disclose your + participation in the project, including the fact that you have signed the SCA. + +6. This SCA is governed by the laws of the State of California and applicable +U.S. Federal law. Any choice of law rules will not apply. + +7. Please place an “x” on one of the applicable statement below. Please do NOT +mark both statements: + + * [x] I am signing on behalf of myself as an individual and no other person + or entity, including my employer, has or will have rights with respect to my + contributions. + + * [ ] I am signing on behalf of my employer or a legal entity and I have the + actual authority to contractually bind that entity. + +## Contributor Details + +| Field | Entry | +|------------------------------- | -------------------- | +| Name | Jacob Bortell | +| Company name (if applicable) | | +| Title or role (if applicable) | | +| Date | 2020-11-20 | +| GitHub username | jabortell | +| Website (optional) | | diff --git a/.github/contributors/revuel.md b/.github/contributors/revuel.md new file mode 100644 index 000000000..51cc5faad --- /dev/null +++ b/.github/contributors/revuel.md @@ -0,0 +1,106 @@ +# spaCy contributor agreement + +This spaCy Contributor Agreement (**"SCA"**) is based on the +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf). +The SCA applies to any contribution that you make to any product or project +managed by us (the **"project"**), and sets out the intellectual property rights +you grant to us in the contributed materials. The term **"us"** shall mean +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term +**"you"** shall mean the person or entity identified below. + +If you agree to be bound by these terms, fill in the information requested +below and include the filled-in version with your first pull request, under the +folder [`.github/contributors/`](/.github/contributors/). The name of the file +should be your GitHub username, with the extension `.md`. For example, the user +example_user would create the file `.github/contributors/example_user.md`. + +Read this agreement carefully before signing. These terms and conditions +constitute a binding legal agreement. + +## Contributor Agreement + +1. The term "contribution" or "contributed materials" means any source code, +object code, patch, tool, sample, graphic, specification, manual, +documentation, or any other material posted or submitted by you to the project. + +2. With respect to any worldwide copyrights, or copyright applications and +registrations, in your contribution: + + * you hereby assign to us joint ownership, and to the extent that such + assignment is or becomes invalid, ineffective or unenforceable, you hereby + grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge, + royalty-free, unrestricted license to exercise all rights under those + copyrights. This includes, at our option, the right to sublicense these same + rights to third parties through multiple levels of sublicensees or other + licensing arrangements; + + * you agree that each of us can do all things in relation to your + contribution as if each of us were the sole owners, and if one of us makes + a derivative work of your contribution, the one who makes the derivative + work (or has it made will be the sole owner of that derivative work; + + * you agree that you will not assert any moral rights in your contribution + against us, our licensees or transferees; + + * you agree that we may register a copyright in your contribution and + exercise all ownership rights associated with it; and + + * you agree that neither of us has any duty to consult with, obtain the + consent of, pay or render an accounting to the other for any use or + distribution of your contribution. + +3. With respect to any patents you own, or that you can license without payment +to any third party, you hereby grant to us a perpetual, irrevocable, +non-exclusive, worldwide, no-charge, royalty-free license to: + + * make, have made, use, sell, offer to sell, import, and otherwise transfer + your contribution in whole or in part, alone or in combination with or + included in any product, work or materials arising out of the project to + which your contribution was submitted, and + + * at our option, to sublicense these same rights to third parties through + multiple levels of sublicensees or other licensing arrangements. + +4. Except as set out above, you keep all right, title, and interest in your +contribution. The rights that you grant to us under these terms are effective +on the date you first submitted a contribution to us, even if your submission +took place before the date you sign these terms. + +5. You covenant, represent, warrant and agree that: + + * Each contribution that you submit is and shall be an original work of + authorship and you can legally grant the rights set out in this SCA; + + * to the best of your knowledge, each contribution will not violate any + third party's copyrights, trademarks, patents, or other intellectual + property rights; and + + * each contribution shall be in compliance with U.S. export control laws and + other applicable export and import laws. You agree to notify us if you + become aware of any circumstance which would make any of the foregoing + representations inaccurate in any respect. We may publicly disclose your + participation in the project, including the fact that you have signed the SCA. + +6. This SCA is governed by the laws of the State of California and applicable +U.S. Federal law. Any choice of law rules will not apply. + +7. Please place an “x” on one of the applicable statement below. Please do NOT +mark both statements: + + * [x] I am signing on behalf of myself as an individual and no other person + or entity, including my employer, has or will have rights with respect my + contributions. + + * [ ] I am signing on behalf of my employer or a legal entity and I have the + actual authority to contractually bind that entity. + +## Contributor Details + +| Field | Entry | +|------------------------------- | -------------------- | +| Name | Miguel Revuelta | +| Company name (if applicable) | | +| Title or role (if applicable) | | +| Date | 2020-11-17 | +| GitHub username | revuel | +| Website (optional) | | diff --git a/.github/contributors/robertsipek.md b/.github/contributors/robertsipek.md new file mode 100644 index 000000000..888d79859 --- /dev/null +++ b/.github/contributors/robertsipek.md @@ -0,0 +1,106 @@ +# spaCy contributor agreement + +This spaCy Contributor Agreement (**"SCA"**) is based on the +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf). +The SCA applies to any contribution that you make to any product or project +managed by us (the **"project"**), and sets out the intellectual property rights +you grant to us in the contributed materials. The term **"us"** shall mean +[ExplosionAI GmbH](https://explosion.ai/legal). The term +**"you"** shall mean the person or entity identified below. + +If you agree to be bound by these terms, fill in the information requested +below and include the filled-in version with your first pull request, under the +folder [`.github/contributors/`](/.github/contributors/). The name of the file +should be your GitHub username, with the extension `.md`. For example, the user +example_user would create the file `.github/contributors/example_user.md`. + +Read this agreement carefully before signing. These terms and conditions +constitute a binding legal agreement. + +## Contributor Agreement + +1. The term "contribution" or "contributed materials" means any source code, +object code, patch, tool, sample, graphic, specification, manual, +documentation, or any other material posted or submitted by you to the project. + +2. With respect to any worldwide copyrights, or copyright applications and +registrations, in your contribution: + + * you hereby assign to us joint ownership, and to the extent that such + assignment is or becomes invalid, ineffective or unenforceable, you hereby + grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge, + royalty-free, unrestricted license to exercise all rights under those + copyrights. This includes, at our option, the right to sublicense these same + rights to third parties through multiple levels of sublicensees or other + licensing arrangements; + + * you agree that each of us can do all things in relation to your + contribution as if each of us were the sole owners, and if one of us makes + a derivative work of your contribution, the one who makes the derivative + work (or has it made will be the sole owner of that derivative work; + + * you agree that you will not assert any moral rights in your contribution + against us, our licensees or transferees; + + * you agree that we may register a copyright in your contribution and + exercise all ownership rights associated with it; and + + * you agree that neither of us has any duty to consult with, obtain the + consent of, pay or render an accounting to the other for any use or + distribution of your contribution. + +3. With respect to any patents you own, or that you can license without payment +to any third party, you hereby grant to us a perpetual, irrevocable, +non-exclusive, worldwide, no-charge, royalty-free license to: + + * make, have made, use, sell, offer to sell, import, and otherwise transfer + your contribution in whole or in part, alone or in combination with or + included in any product, work or materials arising out of the project to + which your contribution was submitted, and + + * at our option, to sublicense these same rights to third parties through + multiple levels of sublicensees or other licensing arrangements. + +4. Except as set out above, you keep all right, title, and interest in your +contribution. The rights that you grant to us under these terms are effective +on the date you first submitted a contribution to us, even if your submission +took place before the date you sign these terms. + +5. You covenant, represent, warrant and agree that: + + * Each contribution that you submit is and shall be an original work of + authorship and you can legally grant the rights set out in this SCA; + + * to the best of your knowledge, each contribution will not violate any + third party's copyrights, trademarks, patents, or other intellectual + property rights; and + + * each contribution shall be in compliance with U.S. export control laws and + other applicable export and import laws. You agree to notify us if you + become aware of any circumstance which would make any of the foregoing + representations inaccurate in any respect. We may publicly disclose your + participation in the project, including the fact that you have signed the SCA. + +6. This SCA is governed by the laws of the State of California and applicable +U.S. Federal law. Any choice of law rules will not apply. + +7. Please place an “x” on one of the applicable statement below. Please do NOT +mark both statements: + + * [x] I am signing on behalf of myself as an individual and no other person + or entity, including my employer, has or will have rights with respect to my + contributions. + + * [ ] I am signing on behalf of my employer or a legal entity and I have the + actual authority to contractually bind that entity. + +## Contributor Details + +| Field | Entry | +|------------------------------- | -------------------- | +| Name | Robert Šípek | +| Company name (if applicable) | | +| Title or role (if applicable) | | +| Date | 22.10.2020 | +| GitHub username | @robertsipek | +| Website (optional) | | diff --git a/.github/contributors/vha14.md b/.github/contributors/vha14.md new file mode 100644 index 000000000..0d7c9b555 --- /dev/null +++ b/.github/contributors/vha14.md @@ -0,0 +1,106 @@ +# spaCy contributor agreement + +This spaCy Contributor Agreement (**"SCA"**) is based on the +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf). +The SCA applies to any contribution that you make to any product or project +managed by us (the **"project"**), and sets out the intellectual property rights +you grant to us in the contributed materials. The term **"us"** shall mean +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term +**"you"** shall mean the person or entity identified below. + +If you agree to be bound by these terms, fill in the information requested +below and include the filled-in version with your first pull request, under the +folder [`.github/contributors/`](/.github/contributors/). The name of the file +should be your GitHub username, with the extension `.md`. For example, the user +example_user would create the file `.github/contributors/example_user.md`. + +Read this agreement carefully before signing. These terms and conditions +constitute a binding legal agreement. + +## Contributor Agreement + +1. The term "contribution" or "contributed materials" means any source code, +object code, patch, tool, sample, graphic, specification, manual, +documentation, or any other material posted or submitted by you to the project. + +2. With respect to any worldwide copyrights, or copyright applications and +registrations, in your contribution: + + * you hereby assign to us joint ownership, and to the extent that such + assignment is or becomes invalid, ineffective or unenforceable, you hereby + grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge, + royalty-free, unrestricted license to exercise all rights under those + copyrights. This includes, at our option, the right to sublicense these same + rights to third parties through multiple levels of sublicensees or other + licensing arrangements; + + * you agree that each of us can do all things in relation to your + contribution as if each of us were the sole owners, and if one of us makes + a derivative work of your contribution, the one who makes the derivative + work (or has it made will be the sole owner of that derivative work; + + * you agree that you will not assert any moral rights in your contribution + against us, our licensees or transferees; + + * you agree that we may register a copyright in your contribution and + exercise all ownership rights associated with it; and + + * you agree that neither of us has any duty to consult with, obtain the + consent of, pay or render an accounting to the other for any use or + distribution of your contribution. + +3. With respect to any patents you own, or that you can license without payment +to any third party, you hereby grant to us a perpetual, irrevocable, +non-exclusive, worldwide, no-charge, royalty-free license to: + + * make, have made, use, sell, offer to sell, import, and otherwise transfer + your contribution in whole or in part, alone or in combination with or + included in any product, work or materials arising out of the project to + which your contribution was submitted, and + + * at our option, to sublicense these same rights to third parties through + multiple levels of sublicensees or other licensing arrangements. + +4. Except as set out above, you keep all right, title, and interest in your +contribution. The rights that you grant to us under these terms are effective +on the date you first submitted a contribution to us, even if your submission +took place before the date you sign these terms. + +5. You covenant, represent, warrant and agree that: + + * Each contribution that you submit is and shall be an original work of + authorship and you can legally grant the rights set out in this SCA; + + * to the best of your knowledge, each contribution will not violate any + third party's copyrights, trademarks, patents, or other intellectual + property rights; and + + * each contribution shall be in compliance with U.S. export control laws and + other applicable export and import laws. You agree to notify us if you + become aware of any circumstance which would make any of the foregoing + representations inaccurate in any respect. We may publicly disclose your + participation in the project, including the fact that you have signed the SCA. + +6. This SCA is governed by the laws of the State of California and applicable +U.S. Federal law. Any choice of law rules will not apply. + +7. Please place an “x” on one of the applicable statement below. Please do NOT +mark both statements: + + * [x] I am signing on behalf of myself as an individual and no other person + or entity, including my employer, has or will have rights with respect my + contributions. + + * [ ] I am signing on behalf of my employer or a legal entity and I have the + actual authority to contractually bind that entity. + +## Contributor Details + +| Field | Entry | +|------------------------------- | -------------------- | +| Name | Vu Ha | +| Company name (if applicable) | | +| Title or role (if applicable) | | +| Date | 10-23-2020 | +| GitHub username | vha14 | +| Website (optional) | | diff --git a/.github/contributors/walterhenry.md b/.github/contributors/walterhenry.md new file mode 100644 index 000000000..76026e1b7 --- /dev/null +++ b/.github/contributors/walterhenry.md @@ -0,0 +1,106 @@ +# spaCy contributor agreement + +This spaCy Contributor Agreement (**"SCA"**) is based on the +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf). +The SCA applies to any contribution that you make to any product or project +managed by us (the **"project"**), and sets out the intellectual property rights +you grant to us in the contributed materials. The term **"us"** shall mean +[ExplosionAI GmbH](https://explosion.ai/legal). The term +**"you"** shall mean the person or entity identified below. + +If you agree to be bound by these terms, fill in the information requested +below and include the filled-in version with your first pull request, under the +folder [`.github/contributors/`](/.github/contributors/). The name of the file +should be your GitHub username, with the extension `.md`. For example, the user +example_user would create the file `.github/contributors/example_user.md`. + +Read this agreement carefully before signing. These terms and conditions +constitute a binding legal agreement. + +## Contributor Agreement + +1. The term "contribution" or "contributed materials" means any source code, +object code, patch, tool, sample, graphic, specification, manual, +documentation, or any other material posted or submitted by you to the project. + +2. With respect to any worldwide copyrights, or copyright applications and +registrations, in your contribution: + + * you hereby assign to us joint ownership, and to the extent that such + assignment is or becomes invalid, ineffective or unenforceable, you hereby + grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge, + royalty-free, unrestricted license to exercise all rights under those + copyrights. This includes, at our option, the right to sublicense these same + rights to third parties through multiple levels of sublicensees or other + licensing arrangements; + + * you agree that each of us can do all things in relation to your + contribution as if each of us were the sole owners, and if one of us makes + a derivative work of your contribution, the one who makes the derivative + work (or has it made will be the sole owner of that derivative work; + + * you agree that you will not assert any moral rights in your contribution + against us, our licensees or transferees; + + * you agree that we may register a copyright in your contribution and + exercise all ownership rights associated with it; and + + * you agree that neither of us has any duty to consult with, obtain the + consent of, pay or render an accounting to the other for any use or + distribution of your contribution. + +3. With respect to any patents you own, or that you can license without payment +to any third party, you hereby grant to us a perpetual, irrevocable, +non-exclusive, worldwide, no-charge, royalty-free license to: + + * make, have made, use, sell, offer to sell, import, and otherwise transfer + your contribution in whole or in part, alone or in combination with or + included in any product, work or materials arising out of the project to + which your contribution was submitted, and + + * at our option, to sublicense these same rights to third parties through + multiple levels of sublicensees or other licensing arrangements. + +4. Except as set out above, you keep all right, title, and interest in your +contribution. The rights that you grant to us under these terms are effective +on the date you first submitted a contribution to us, even if your submission +took place before the date you sign these terms. + +5. You covenant, represent, warrant and agree that: + + * Each contribution that you submit is and shall be an original work of + authorship and you can legally grant the rights set out in this SCA; + + * to the best of your knowledge, each contribution will not violate any + third party's copyrights, trademarks, patents, or other intellectual + property rights; and + + * each contribution shall be in compliance with U.S. export control laws and + other applicable export and import laws. You agree to notify us if you + become aware of any circumstance which would make any of the foregoing + representations inaccurate in any respect. We may publicly disclose your + participation in the project, including the fact that you have signed the SCA. + +6. This SCA is governed by the laws of the State of California and applicable +U.S. Federal law. Any choice of law rules will not apply. + +7. Please place an “x” on one of the applicable statement below. Please do NOT +mark both statements: + + * [x] I am signing on behalf of myself as an individual and no other person + or entity, including my employer, has or will have rights with respect to my + contributions. + + * [ ] I am signing on behalf of my employer or a legal entity and I have the + actual authority to contractually bind that entity. + +## Contributor Details + +| Field | Entry | +|------------------------------- | -------------------- | +| Name | Walter Henry | +| Company name (if applicable) | ExplosionAI GmbH | +| Title or role (if applicable) | Executive Assistant | +| Date | September 14, 2020 | +| GitHub username | walterhenry | +| Website (optional) | | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 70324d8fd..45ce9af11 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,11 +26,11 @@ also often include helpful tips and solutions to common problems. You should also check the [troubleshooting guide](https://spacy.io/usage/#troubleshooting) to see if your problem is already listed there. -If you're looking for help with your code, consider posting a question on -[Stack Overflow](http://stackoverflow.com/questions/tagged/spacy) instead. If you -tag it `spacy` and `python`, more people will see it and hopefully be able to -help. Please understand that we won't be able to provide individual support via -email. We also believe that help is much more valuable if it's **shared publicly**, +If you're looking for help with your code, consider posting a question on the +[GitHub Discussions board](https://github.com/explosion/spaCy/discussions) or +[Stack Overflow](http://stackoverflow.com/questions/tagged/spacy). Please +understand that we won't be able to provide individual support via email. We +also believe that help is much more valuable if it's **shared publicly**, so that more people can benefit from it. ### Submitting issues diff --git a/README.md b/README.md index 55e4c6512..e84d799ae 100644 --- a/README.md +++ b/README.md @@ -60,13 +60,15 @@ be able to provide individual support via email. We also believe that help is much more valuable if it's shared publicly, so that more people can benefit from it. -| Type | Platforms | -| ----------------------- | ---------------------- | -| 🚨 **Bug Reports** | [GitHub Issue Tracker] | -| 🎁 **Feature Requests** | [GitHub Issue Tracker] | -| 👩‍💻 **Usage Questions** | [Stack Overflow] | +| Type | Platforms | +| ------------------------------- | --------------------------------------- | +| 🚨 **Bug Reports** | [GitHub Issue Tracker] | +| 🎁 **Feature Requests & Ideas** | [GitHub Discussions] | +| 👩‍💻 **Usage Questions** | [GitHub Discussions] · [Stack Overflow] | +| 🗯 **General Discussion** | [GitHub Discussions] | [github issue tracker]: https://github.com/explosion/spaCy/issues +[github discussions]: https://github.com/explosion/spaCy/discussions [stack overflow]: https://stackoverflow.com/questions/tagged/spacy ## Features @@ -126,6 +128,7 @@ environment to avoid modifying system state: ```bash python -m venv .env source .env/bin/activate +pip install -U pip setuptools wheel pip install spacy ``` @@ -224,16 +227,28 @@ do that depends on your system. See notes on Ubuntu, OS X and Windows for details. ```bash -# make sure you are using the latest pip -python -m pip install -U pip git clone https://github.com/explosion/spaCy cd spaCy python -m venv .env source .env/bin/activate -export PYTHONPATH=`pwd` + +# make sure you are using the latest pip +python -m pip install -U pip setuptools wheel + +pip install . +``` + +To install with extras: + +```bash +pip install .[lookups,cuda102] +``` + +To install all dependencies required for development: + +```bash pip install -r requirements.txt -python setup.py build_ext --inplace ``` Compared to regular install via pip, [requirements.txt](requirements.txt) @@ -271,14 +286,13 @@ tests, you'll usually want to clone the repository and build spaCy from source. This will also install the required development dependencies and test utilities defined in the `requirements.txt`. -Alternatively, you can find out where spaCy is installed and run `pytest` on -that directory. Don't forget to also install the test utilities via spaCy's +Alternatively, you can run `pytest` on the tests from within the installed +`spacy` package. Don't forget to also install the test utilities via spaCy's `requirements.txt`: ```bash -python -c "import os; import spacy; print(os.path.dirname(spacy.__file__))" -pip install -r path/to/requirements.txt -python -m pytest +pip install -r requirements.txt +python -m pytest --pyargs spacy ``` See [the documentation](https://spacy.io/usage#tests) for more details and diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ecefbf81a..70ee98c7b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -2,112 +2,111 @@ trigger: batch: true branches: include: - - '*' + - "*" exclude: - - 'spacy.io' + - "spacy.io" paths: exclude: - - 'website/*' - - '*.md' + - "website/*" + - "*.md" pr: paths: exclude: - - 'website/*' - - '*.md' + - "website/*" + - "*.md" jobs: + # Perform basic checks for most important errors (syntax etc.) Uses the config + # defined in .flake8 and overwrites the selected codes. + - job: "Validate" + pool: + vmImage: "ubuntu-16.04" + steps: + - task: UsePythonVersion@0 + inputs: + versionSpec: "3.7" + - script: | + pip install flake8==3.5.0 + python -m flake8 spacy --count --select=E901,E999,F821,F822,F823 --show-source --statistics + displayName: "flake8" -# Perform basic checks for most important errors (syntax etc.) Uses the config -# defined in .flake8 and overwrites the selected codes. -- job: 'Validate' - pool: - vmImage: 'ubuntu-16.04' - steps: - - task: UsePythonVersion@0 - inputs: - versionSpec: '3.7' - - script: | - pip install flake8==3.5.0 - python -m flake8 spacy --count --select=E901,E999,F821,F822,F823 --show-source --statistics - displayName: 'flake8' + - job: "Test" + dependsOn: "Validate" + strategy: + matrix: + Python36Linux: + imageName: "ubuntu-16.04" + python.version: "3.6" + Python36Windows: + imageName: "vs2017-win2016" + python.version: "3.6" + Python36Mac: + imageName: "macos-10.14" + python.version: "3.6" + # Don't test on 3.7 for now to speed up builds + Python37Linux: + imageName: "ubuntu-16.04" + python.version: "3.7" + Python37Windows: + imageName: "vs2017-win2016" + python.version: "3.7" + Python37Mac: + imageName: "macos-10.14" + python.version: "3.7" + Python38Linux: + imageName: "ubuntu-16.04" + python.version: "3.8" + Python38Windows: + imageName: "vs2017-win2016" + python.version: "3.8" + Python38Mac: + imageName: "macos-10.14" + python.version: "3.8" + Python39Linux: + imageName: "ubuntu-16.04" + python.version: "3.9" + Python39Windows: + imageName: "vs2017-win2016" + python.version: "3.9" + Python39Mac: + imageName: "macos-10.14" + python.version: "3.9" + maxParallel: 4 + pool: + vmImage: $(imageName) -- job: 'Test' - dependsOn: 'Validate' - strategy: - matrix: - Python36Linux: - imageName: 'ubuntu-16.04' - python.version: '3.6' - Python36Windows: - imageName: 'vs2017-win2016' - python.version: '3.6' - Python36Mac: - imageName: 'macos-10.14' - python.version: '3.6' - # Don't test on 3.7 for now to speed up builds - Python37Linux: - imageName: 'ubuntu-16.04' - python.version: '3.7' - Python37Windows: - imageName: 'vs2017-win2016' - python.version: '3.7' - Python37Mac: - imageName: 'macos-10.14' - python.version: '3.7' - Python38Linux: - imageName: 'ubuntu-16.04' - python.version: '3.8' - Python38Windows: - imageName: 'vs2017-win2016' - python.version: '3.8' - Python38Mac: - imageName: 'macos-10.14' - python.version: '3.8' - Python39Linux: - imageName: 'ubuntu-16.04' - python.version: '3.9' - Python39Windows: - imageName: 'vs2017-win2016' - python.version: '3.9' - Python39Mac: - imageName: 'macos-10.14' - python.version: '3.9' - maxParallel: 4 - pool: - vmImage: $(imageName) + steps: + - task: UsePythonVersion@0 + inputs: + versionSpec: "$(python.version)" + architecture: "x64" - steps: - - task: UsePythonVersion@0 - inputs: - versionSpec: '$(python.version)' - architecture: 'x64' + - script: | + python -m pip install -U setuptools + pip install -r requirements.txt + displayName: "Install dependencies" - - script: | - python -m pip install -U setuptools - pip install -r requirements.txt - displayName: 'Install dependencies' + - script: | + python setup.py build_ext --inplace + python setup.py sdist --formats=gztar + displayName: "Compile and build sdist" - - script: | - python setup.py build_ext --inplace - python setup.py sdist --formats=gztar - displayName: 'Compile and build sdist' + - task: DeleteFiles@1 + inputs: + contents: "spacy" + displayName: "Delete source directory" - - task: DeleteFiles@1 - inputs: - contents: 'spacy' - displayName: 'Delete source directory' + - script: | + pip freeze > installed.txt + pip uninstall -y -r installed.txt + displayName: "Uninstall all packages" - - script: | - pip freeze > installed.txt - pip uninstall -y -r installed.txt - displayName: 'Uninstall all packages' + - bash: | + SDIST=$(python -c "import os;print(os.listdir('./dist')[-1])" 2>&1) + pip install dist/$SDIST + displayName: "Install from sdist" - - bash: | - SDIST=$(python -c "import os;print(os.listdir('./dist')[-1])" 2>&1) - pip install dist/$SDIST - displayName: 'Install from sdist' - - - script: | - pip install -r requirements.txt - python -m pytest --pyargs spacy - displayName: 'Run tests' + - script: | + pip install -r requirements.txt + python -m pytest --pyargs spacy + displayName: "Run tests" diff --git a/build-constraints.txt b/build-constraints.txt new file mode 100644 index 000000000..23e660096 --- /dev/null +++ b/build-constraints.txt @@ -0,0 +1,5 @@ +# build version constraints for use with wheelwright + multibuild +numpy==1.15.0; python_version<='3.7' +numpy==1.17.3; python_version=='3.8' +numpy==1.19.3; python_version=='3.9' +numpy; python_version>='3.10' diff --git a/licenses/3rd_party_licenses.txt b/licenses/3rd_party_licenses.txt index 0aeef5507..3702ad131 100644 --- a/licenses/3rd_party_licenses.txt +++ b/licenses/3rd_party_licenses.txt @@ -36,3 +36,44 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +scikit-learn +------------ + +* Files: scorer.py + +The following implementation of roc_auc_score() is adapted from +scikit-learn, which is distributed under the following license: + +New BSD License + +Copyright (c) 2007–2019 The scikit-learn developers. +All rights reserved. + + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + a. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + b. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + c. Neither the name of the Scikit-learn Developers nor the names of + its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/netlify.toml b/netlify.toml index e860e4bf4..deebe4283 100644 --- a/netlify.toml +++ b/netlify.toml @@ -3,6 +3,8 @@ redirects = [ {from = "https://spacy.netlify.com/*", to="https://spacy.io/:splat", force = true }, # Subdomain for branches {from = "https://nightly.spacy.io/*", to="https://nightly-spacy-io.spacy.io/:splat", force = true, status = 200}, + # TODO: update this with the v2 branch build once v3 is live (status = 200) + {from = "https://v2.spacy.io/*", to="https://spacy.io/:splat", force = true}, # Old subdomains {from = "https://survey.spacy.io/*", to = "https://spacy.io", force = true}, {from = "http://survey.spacy.io/*", to = "https://spacy.io", force = true}, diff --git a/pyproject.toml b/pyproject.toml index 0ceda4454..b8de9f426 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,16 @@ [build-system] requires = [ "setuptools", - "wheel", "cython>=0.25", "cymem>=2.0.2,<2.1.0", "preshed>=3.0.2,<3.1.0", "murmurhash>=0.28.0,<1.1.0", - "thinc>=8.0.0rc0,<8.1.0", + "thinc>=8.0.0rc2,<8.1.0", "blis>=0.4.0,<0.8.0", - "pathy" + "pathy", + "numpy==1.15.0; python_version<='3.7'", + "numpy==1.17.3; python_version=='3.8'", + "numpy==1.19.3; python_version=='3.9'", + "numpy; python_version>='3.10'", ] build-backend = "setuptools.build_meta" diff --git a/requirements.txt b/requirements.txt index 3a777f163..44f53bdb4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ # Our libraries cymem>=2.0.2,<2.1.0 preshed>=3.0.2,<3.1.0 -thinc>=8.0.0rc0,<8.1.0 +thinc>=8.0.0rc2,<8.1.0 blis>=0.4.0,<0.8.0 ml_datasets==0.2.0a0 murmurhash>=0.28.0,<1.1.0 @@ -15,6 +15,7 @@ numpy>=1.15.0 requests>=2.13.0,<3.0.0 tqdm>=4.38.0,<5.0.0 pydantic>=1.5.0,<1.7.0 +jinja2 # Official Python utilities setuptools packaging>=20.0 @@ -26,4 +27,4 @@ pytest>=4.6.5 pytest-timeout>=1.3.0,<2.0.0 mock>=2.0.0,<3.0.0 flake8>=3.5.0,<3.6.0 -jinja2 +hypothesis diff --git a/setup.cfg b/setup.cfg index 20717684b..a0e942be8 100644 --- a/setup.cfg +++ b/setup.cfg @@ -34,13 +34,13 @@ setup_requires = cymem>=2.0.2,<2.1.0 preshed>=3.0.2,<3.1.0 murmurhash>=0.28.0,<1.1.0 - thinc>=8.0.0rc0,<8.1.0 + thinc>=8.0.0rc2,<8.1.0 install_requires = # Our libraries murmurhash>=0.28.0,<1.1.0 cymem>=2.0.2,<2.1.0 preshed>=3.0.2,<3.1.0 - thinc>=8.0.0rc0,<8.1.0 + thinc>=8.0.0rc2,<8.1.0 blis>=0.4.0,<0.8.0 wasabi>=0.8.0,<1.1.0 srsly>=2.3.0,<3.0.0 @@ -86,6 +86,10 @@ cuda101 = cupy-cuda101>=5.0.0b4,<9.0.0 cuda102 = cupy-cuda102>=5.0.0b4,<9.0.0 +cuda110 = + cupy-cuda110>=5.0.0b4,<9.0.0 +cuda111 = + cupy-cuda111>=5.0.0b4,<9.0.0 # Language tokenizers with external dependencies ja = sudachipy>=0.4.9 @@ -94,8 +98,6 @@ ko = natto-py==0.9.0 th = pythainlp>=2.0 -zh = - spacy-pkuseg==0.0.26 [bdist_wheel] universal = false diff --git a/setup.py b/setup.py index 160d2ed1c..14f8486ca 100755 --- a/setup.py +++ b/setup.py @@ -2,9 +2,9 @@ from setuptools import Extension, setup, find_packages import sys import platform +import numpy from distutils.command.build_ext import build_ext from distutils.sysconfig import get_python_inc -import numpy from pathlib import Path import shutil from Cython.Build import cythonize @@ -48,6 +48,7 @@ MOD_NAMES = [ "spacy.pipeline._parser_internals._state", "spacy.pipeline._parser_internals.stateclass", "spacy.pipeline._parser_internals.transition_system", + "spacy.pipeline._parser_internals._beam_utils", "spacy.tokenizer", "spacy.training.align", "spacy.training.gold_io", @@ -194,8 +195,8 @@ def setup_package(): print(f"Copied {copy_file} -> {target_dir}") include_dirs = [ - get_python_inc(plat_specific=True), numpy.get_include(), + get_python_inc(plat_specific=True), ] ext_modules = [] for name in MOD_NAMES: @@ -212,7 +213,7 @@ def setup_package(): ext_modules=ext_modules, cmdclass={"build_ext": build_ext_subclass}, include_dirs=include_dirs, - package_data={"": ["*.pyx", "*.pxd", "*.pxi", "*.cpp"]}, + package_data={"": ["*.pyx", "*.pxd", "*.pxi"]}, ) diff --git a/spacy/__init__.py b/spacy/__init__.py index 7334b4149..aac1db289 100644 --- a/spacy/__init__.py +++ b/spacy/__init__.py @@ -7,7 +7,7 @@ warnings.filterwarnings("ignore", message="numpy.dtype size changed") # noqa warnings.filterwarnings("ignore", message="numpy.ufunc size changed") # noqa # These are imported as part of the API -from thinc.api import prefer_gpu, require_gpu # noqa: F401 +from thinc.api import prefer_gpu, require_gpu, require_cpu # noqa: F401 from thinc.api import Config from . import pipeline # noqa: F401 diff --git a/spacy/cli/_util.py b/spacy/cli/_util.py index 60e400fb4..4012737cf 100644 --- a/spacy/cli/_util.py +++ b/spacy/cli/_util.py @@ -272,7 +272,11 @@ def show_validation_error( msg.fail(title) print(err.text.strip()) if hint_fill and "value_error.missing" in err.error_types: - config_path = file_path if file_path is not None else "config.cfg" + config_path = ( + file_path + if file_path is not None and str(file_path) != "-" + else "config.cfg" + ) msg.text( "If your config contains missing values, you can run the 'init " "fill-config' command to fill in all the defaults, if possible:", diff --git a/spacy/cli/convert.py b/spacy/cli/convert.py index 8413c639b..2e52bfa41 100644 --- a/spacy/cli/convert.py +++ b/spacy/cli/convert.py @@ -5,6 +5,7 @@ from wasabi import Printer import srsly import re import sys +import itertools from ._util import app, Arg, Opt from ..training import docs_to_json @@ -130,15 +131,16 @@ def convert( ) doc_files.append((input_loc, docs)) if concatenate: - all_docs = [] - for _, docs in doc_files: - all_docs.extend(docs) + all_docs = itertools.chain.from_iterable([docs for _, docs in doc_files]) doc_files = [(input_path, all_docs)] for input_loc, docs in doc_files: if file_type == "json": data = [docs_to_json(docs)] + len_docs = len(data) else: - data = DocBin(docs=docs, store_user_data=True).to_bytes() + db = DocBin(docs=docs, store_user_data=True) + len_docs = len(db) + data = db.to_bytes() if output_dir == "-": _print_docs_to_stdout(data, file_type) else: @@ -149,7 +151,7 @@ def convert( output_file = Path(output_dir) / input_loc.parts[-1] output_file = output_file.with_suffix(f".{file_type}") _write_docs_to_file(data, output_file, file_type) - msg.good(f"Generated output file ({len(docs)} documents): {output_file}") + msg.good(f"Generated output file ({len_docs} documents): {output_file}") def _print_docs_to_stdout(data: Any, output_type: str) -> None: diff --git a/spacy/cli/debug_config.py b/spacy/cli/debug_config.py index a6c7345f0..ed0a43921 100644 --- a/spacy/cli/debug_config.py +++ b/spacy/cli/debug_config.py @@ -19,7 +19,7 @@ from .. import util def debug_config_cli( # fmt: off ctx: typer.Context, # This is only used to read additional arguments - config_path: Path = Arg(..., help="Path to config file", exists=True), + config_path: Path = Arg(..., help="Path to config file", exists=True, allow_dash=True), code_path: Optional[Path] = Opt(None, "--code-path", "-c", help="Path to Python file with additional code (registered functions) to be imported"), show_funcs: bool = Opt(False, "--show-functions", "-F", help="Show an overview of all registered functions used in the config and where they come from (modules, files etc.)"), show_vars: bool = Opt(False, "--show-variables", "-V", help="Show an overview of all variables referenced in the config and their values. This will also reflect variables overwritten on the CLI.") diff --git a/spacy/cli/debug_data.py b/spacy/cli/debug_data.py index ead759e33..f161d0254 100644 --- a/spacy/cli/debug_data.py +++ b/spacy/cli/debug_data.py @@ -37,7 +37,7 @@ BLANK_MODEL_THRESHOLD = 2000 def debug_data_cli( # fmt: off ctx: typer.Context, # This is only used to read additional arguments - config_path: Path = Arg(..., help="Path to config file", exists=True), + config_path: Path = Arg(..., help="Path to config file", exists=True, allow_dash=True), code_path: Optional[Path] = Opt(None, "--code-path", "-c", help="Path to Python file with additional code (registered functions) to be imported"), ignore_warnings: bool = Opt(False, "--ignore-warnings", "-IW", help="Ignore warnings, only show stats and errors"), verbose: bool = Opt(False, "--verbose", "-V", help="Print additional information and explanations"), diff --git a/spacy/cli/debug_model.py b/spacy/cli/debug_model.py index 3b8ba7dae..2e4d9456f 100644 --- a/spacy/cli/debug_model.py +++ b/spacy/cli/debug_model.py @@ -22,7 +22,7 @@ from .. import util def debug_model_cli( # fmt: off ctx: typer.Context, # This is only used to read additional arguments - config_path: Path = Arg(..., help="Path to config file", exists=True), + config_path: Path = Arg(..., help="Path to config file", exists=True, allow_dash=True), component: str = Arg(..., help="Name of the pipeline component of which the model should be analysed"), layers: str = Opt("", "--layers", "-l", help="Comma-separated names of layer IDs to print"), dimensions: bool = Opt(False, "--dimensions", "-DIM", help="Show dimensions"), diff --git a/spacy/cli/download.py b/spacy/cli/download.py index 0e7ec2ea5..d5686586b 100644 --- a/spacy/cli/download.py +++ b/spacy/cli/download.py @@ -35,7 +35,7 @@ def download_cli( def download(model: str, direct: bool = False, *pip_args) -> None: - if not is_package("spacy") and "--no-deps" not in pip_args: + if not (is_package("spacy") or is_package("spacy-nightly")) and "--no-deps" not in pip_args: msg.warn( "Skipping pipeline package dependencies and setting `--no-deps`. " "You don't seem to have the spaCy package itself installed " diff --git a/spacy/cli/init_config.py b/spacy/cli/init_config.py index 9f73b17ae..90b92787d 100644 --- a/spacy/cli/init_config.py +++ b/spacy/cli/init_config.py @@ -5,6 +5,7 @@ from wasabi import Printer, diff_strings from thinc.api import Config import srsly import re +from jinja2 import Template from .. import util from ..language import DEFAULT_CONFIG_PRETRAIN_PATH @@ -29,7 +30,7 @@ def init_config_cli( lang: Optional[str] = Opt("en", "--lang", "-l", help="Two-letter code of the language to use"), pipeline: Optional[str] = Opt("tagger,parser,ner", "--pipeline", "-p", help="Comma-separated names of trainable pipeline components to include (without 'tok2vec' or 'transformer')"), optimize: Optimizations = Opt(Optimizations.efficiency.value, "--optimize", "-o", help="Whether to optimize for efficiency (faster inference, smaller model, lower memory consumption) or higher accuracy (potentially larger and slower model). This will impact the choice of architecture, pretrained weights and related hyperparameters."), - cpu: bool = Opt(False, "--cpu", "-C", help="Whether the model needs to run on CPU. This will impact the choice of architecture, pretrained weights and related hyperparameters."), + gpu: bool = Opt(False, "--gpu", "-G", help="Whether the model can run on GPU. This will impact the choice of architecture, pretrained weights and related hyperparameters."), pretraining: bool = Opt(False, "--pretraining", "-pt", help="Include config for pretraining (with 'spacy pretrain')"), # fmt: on ): @@ -44,14 +45,16 @@ def init_config_cli( if isinstance(optimize, Optimizations): # instance of enum from the CLI optimize = optimize.value pipeline = string_to_list(pipeline) - init_config( - output_file, + is_stdout = str(output_file) == "-" + config = init_config( lang=lang, pipeline=pipeline, optimize=optimize, - cpu=cpu, + gpu=gpu, pretraining=pretraining, + silent=is_stdout, ) + save_config(config, output_file, is_stdout=is_stdout) @init_cli.command("fill-config") @@ -117,20 +120,15 @@ def fill_config( def init_config( - output_file: Path, *, lang: str, pipeline: List[str], optimize: str, - cpu: bool, + gpu: bool, pretraining: bool = False, -) -> None: - is_stdout = str(output_file) == "-" - msg = Printer(no_print=is_stdout) - try: - from jinja2 import Template - except ImportError: - msg.fail("This command requires jinja2", "pip install jinja2", exits=1) + silent: bool = True, +) -> Config: + msg = Printer(no_print=silent) with TEMPLATE_PATH.open("r") as f: template = Template(f.read()) # Filter out duplicates since tok2vec and transformer are added by template @@ -140,7 +138,7 @@ def init_config( "lang": lang, "components": pipeline, "optimize": optimize, - "hardware": "cpu" if cpu else "gpu", + "hardware": "gpu" if gpu else "cpu", "transformer_data": reco["transformer"], "word_vectors": reco["word_vectors"], "has_letters": reco["has_letters"], @@ -176,7 +174,7 @@ def init_config( pretrain_config = util.load_config(DEFAULT_CONFIG_PRETRAIN_PATH) config = pretrain_config.merge(config) msg.good("Auto-filled config with all values") - save_config(config, output_file, is_stdout=is_stdout) + return config def save_config( diff --git a/spacy/cli/init_pipeline.py b/spacy/cli/init_pipeline.py index da474795e..2cdf4aa00 100644 --- a/spacy/cli/init_pipeline.py +++ b/spacy/cli/init_pipeline.py @@ -62,7 +62,7 @@ def update_lexemes(nlp: Language, jsonl_loc: Path) -> None: def init_pipeline_cli( # fmt: off ctx: typer.Context, # This is only used to read additional arguments - config_path: Path = Arg(..., help="Path to config file", exists=True), + config_path: Path = Arg(..., help="Path to config file", exists=True, allow_dash=True), output_path: Path = Arg(..., help="Output directory for the prepared data"), code_path: Optional[Path] = Opt(None, "--code", "-c", help="Path to Python file with additional code (registered functions) to be imported"), verbose: bool = Opt(False, "--verbose", "-V", "-VV", help="Display more information for debugging purposes"), @@ -88,7 +88,7 @@ def init_pipeline_cli( def init_labels_cli( # fmt: off ctx: typer.Context, # This is only used to read additional arguments - config_path: Path = Arg(..., help="Path to config file", exists=True), + config_path: Path = Arg(..., help="Path to config file", exists=True, allow_dash=True), output_path: Path = Arg(..., help="Output directory for the labels"), code_path: Optional[Path] = Opt(None, "--code", "-c", help="Path to Python file with additional code (registered functions) to be imported"), verbose: bool = Opt(False, "--verbose", "-V", "-VV", help="Display more information for debugging purposes"), diff --git a/spacy/cli/package.py b/spacy/cli/package.py index 49a0ab75d..04b2f1c9e 100644 --- a/spacy/cli/package.py +++ b/spacy/cli/package.py @@ -1,4 +1,4 @@ -from typing import Optional, Union, Any, Dict +from typing import Optional, Union, Any, Dict, List import shutil from pathlib import Path from wasabi import Printer, get_raw_input @@ -16,6 +16,7 @@ def package_cli( # fmt: off input_dir: Path = Arg(..., help="Directory with pipeline data", exists=True, file_okay=False), output_dir: Path = Arg(..., help="Output parent directory", exists=True, file_okay=False), + code_paths: Optional[str] = Opt(None, "--code", "-c", help="Comma-separated paths to Python file with additional code (registered functions) to be included in the package"), meta_path: Optional[Path] = Opt(None, "--meta-path", "--meta", "-m", help="Path to meta.json", exists=True, dir_okay=False), create_meta: bool = Opt(False, "--create-meta", "-c", "-C", help="Create meta.json, even if one exists"), name: Optional[str] = Opt(None, "--name", "-n", help="Package name to override meta"), @@ -33,12 +34,22 @@ def package_cli( After packaging, "python setup.py sdist" is run in the package directory, which will create a .tar.gz archive that can be installed via "pip install". + If additional code files are provided (e.g. Python files containing custom + registered functions like pipeline components), they are copied into the + package and imported in the __init__.py. + DOCS: https://nightly.spacy.io/api/cli#package """ + code_paths = ( + [Path(p.strip()) for p in code_paths.split(",")] + if code_paths is not None + else [] + ) package( input_dir, output_dir, meta_path=meta_path, + code_paths=code_paths, name=name, version=version, create_meta=create_meta, @@ -52,6 +63,7 @@ def package( input_dir: Path, output_dir: Path, meta_path: Optional[Path] = None, + code_paths: List[Path] = [], name: Optional[str] = None, version: Optional[str] = None, create_meta: bool = False, @@ -67,6 +79,14 @@ def package( msg.fail("Can't locate pipeline data", input_path, exits=1) if not output_path or not output_path.exists(): msg.fail("Output directory not found", output_path, exits=1) + for code_path in code_paths: + if not code_path.exists(): + msg.fail("Can't find code file", code_path, exits=1) + # Import the code here so it's available when model is loaded (via + # get_meta helper). Also verifies that everything works + util.import_file(code_path.stem, code_path) + if code_paths: + msg.good(f"Including {len(code_paths)} Python module(s) with custom code") if meta_path and not meta_path.exists(): msg.fail("Can't find pipeline meta.json", meta_path, exits=1) meta_path = meta_path or input_dir / "meta.json" @@ -103,10 +123,20 @@ def package( ) Path.mkdir(package_path, parents=True) shutil.copytree(str(input_dir), str(package_path / model_name_v)) + license_path = package_path / model_name_v / "LICENSE" + if license_path.exists(): + shutil.move(str(license_path), str(main_path)) + imports = [] + for code_path in code_paths: + imports.append(code_path.stem) + shutil.copy(str(code_path), str(package_path)) create_file(main_path / "meta.json", srsly.json_dumps(meta, indent=2)) create_file(main_path / "setup.py", TEMPLATE_SETUP) create_file(main_path / "MANIFEST.in", TEMPLATE_MANIFEST) - create_file(package_path / "__init__.py", TEMPLATE_INIT) + init_py = TEMPLATE_INIT.format( + imports="\n".join(f"from . import {m}" for m in imports) + ) + create_file(package_path / "__init__.py", init_py) msg.good(f"Successfully created package '{model_name_v}'", main_path) if create_sdist: with util.working_dir(main_path): @@ -238,7 +268,7 @@ if __name__ == '__main__': TEMPLATE_MANIFEST = """ include meta.json -include config.cfg +include LICENSE """.strip() @@ -246,6 +276,7 @@ TEMPLATE_INIT = """ from pathlib import Path from spacy.util import load_model_from_init_py, get_model_meta +{imports} __version__ = get_model_meta(Path(__file__).parent)['version'] diff --git a/spacy/cli/pretrain.py b/spacy/cli/pretrain.py index de9341449..15a1e92a5 100644 --- a/spacy/cli/pretrain.py +++ b/spacy/cli/pretrain.py @@ -17,7 +17,7 @@ from ..util import load_config def pretrain_cli( # fmt: off ctx: typer.Context, # This is only used to read additional arguments - config_path: Path = Arg(..., help="Path to config file", exists=True, dir_okay=False), + config_path: Path = Arg(..., help="Path to config file", exists=True, dir_okay=False, allow_dash=True), output_dir: Path = Arg(..., help="Directory to write weights to on each epoch"), code_path: Optional[Path] = Opt(None, "--code", "-c", help="Path to Python file with additional code (registered functions) to be imported"), resume_path: Optional[Path] = Opt(None, "--resume-path", "-r", help="Path to pretrained weights from which to resume pretraining"), @@ -79,7 +79,7 @@ def pretrain_cli( def verify_cli_args(config_path, output_dir, resume_path, epoch_resume): - if not config_path or not config_path.exists(): + if not config_path or (str(config_path) != "-" and not config_path.exists()): msg.fail("Config file not found", config_path, exits=1) if output_dir.exists() and [p for p in output_dir.iterdir()]: if resume_path: diff --git a/spacy/cli/templates/quickstart_training.jinja b/spacy/cli/templates/quickstart_training.jinja index 1194438de..78e17c516 100644 --- a/spacy/cli/templates/quickstart_training.jinja +++ b/spacy/cli/templates/quickstart_training.jinja @@ -19,6 +19,7 @@ lang = "{{ lang }}" {%- set full_pipeline = ["transformer" if use_transformer else "tok2vec"] + components %} pipeline = {{ full_pipeline|pprint()|replace("'", '"')|safe }} tokenizer = {"@tokenizers": "spacy.Tokenizer.v1"} +batch_size = {{ 128 if hardware == "gpu" else 1000 }} [components] @@ -143,6 +144,9 @@ nO = null @architectures = "spacy-transformers.TransformerListener.v1" grad_factor = 1.0 +[components.textcat.model.tok2vec.pooling] +@layers = "reduce_mean.v1" + [components.textcat.model.linear_model] @architectures = "spacy.TextCatBOW.v1" exclusive_classes = false diff --git a/spacy/cli/train.py b/spacy/cli/train.py index fe1e82eb2..0120ec08a 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -18,7 +18,7 @@ from .. import util def train_cli( # fmt: off ctx: typer.Context, # This is only used to read additional arguments - config_path: Path = Arg(..., help="Path to config file", exists=True), + config_path: Path = Arg(..., help="Path to config file", exists=True, allow_dash=True), output_path: Optional[Path] = Opt(None, "--output", "--output-path", "-o", help="Output directory to store trained pipeline in"), code_path: Optional[Path] = Opt(None, "--code", "-c", help="Path to Python file with additional code (registered functions) to be imported"), verbose: bool = Opt(False, "--verbose", "-V", "-VV", help="Display more information for debugging purposes"), @@ -41,7 +41,7 @@ def train_cli( """ util.logger.setLevel(logging.DEBUG if verbose else logging.INFO) # Make sure all files and paths exists if they are needed - if not config_path or not config_path.exists(): + if not config_path or (str(config_path) != "-" and not config_path.exists()): msg.fail("Config file not found", config_path, exits=1) if output_path is not None and not output_path.exists(): output_path.mkdir(parents=True) diff --git a/spacy/default_config.cfg b/spacy/default_config.cfg index d7fc46ea0..c9f82caa0 100644 --- a/spacy/default_config.cfg +++ b/spacy/default_config.cfg @@ -20,6 +20,8 @@ disabled = [] before_creation = null after_creation = null after_pipeline_creation = null +# Default batch size to use with nlp.pipe and nlp.evaluate +batch_size = 1000 [nlp.tokenizer] @tokenizers = "spacy.Tokenizer.v1" diff --git a/spacy/default_config_pretraining.cfg b/spacy/default_config_pretraining.cfg index 66987171a..16f767772 100644 --- a/spacy/default_config_pretraining.cfg +++ b/spacy/default_config_pretraining.cfg @@ -17,7 +17,9 @@ tolerance = 0.2 get_length = null [pretraining.objective] -type = "characters" +@architectures = "spacy.PretrainCharacters.v1" +maxout_pieces = 3 +hidden_size = 300 n_characters = 4 [pretraining.optimizer] diff --git a/spacy/errors.py b/spacy/errors.py index f4fd3731f..332e7df1c 100644 --- a/spacy/errors.py +++ b/spacy/errors.py @@ -119,14 +119,19 @@ class Warnings: "call the {matcher} on each Doc object.") W107 = ("The property `Doc.{prop}` is deprecated. Use " "`Doc.has_annotation(\"{attr}\")` instead.") + W108 = ("The rule-based lemmatizer did not find POS annotation for the " + "token '{text}'. Check that your pipeline includes components that " + "assign token.pos, typically 'tagger'+'attribute_ruler' or " + "'morphologizer'.") @add_codes class Errors: E001 = ("No component '{name}' found in pipeline. Available names: {opts}") E002 = ("Can't find factory for '{name}' for language {lang} ({lang_code}). " - "This usually happens when spaCy calls `nlp.{method}` with custom " + "This usually happens when spaCy calls `nlp.{method}` with a custom " "component name that's not registered on the current language class. " + "If you're using a Transformer, make sure to install 'spacy-transformers'. " "If you're using a custom component, make sure you've added the " "decorator `@Language.component` (for function components) or " "`@Language.factory` (for class components).\n\nAvailable " @@ -456,6 +461,9 @@ class Errors: "issue tracker: http://github.com/explosion/spaCy/issues") # TODO: fix numbering after merging develop into master + E896 = ("There was an error using the static vectors. Ensure that the vectors " + "of the vocab are properly initialized, or set 'include_static_vectors' " + "to False.") E897 = ("Field '{field}' should be a dot-notation string referring to the " "relevant section in the config, but found type {type} instead.") E898 = ("Can't serialize trainable pipe '{name}': the `model` attribute " @@ -483,8 +491,8 @@ class Errors: "has been applied.") E905 = ("Cannot initialize StaticVectors layer: nM dimension unset. This " "dimension refers to the width of the vectors table.") - E906 = ("Unexpected `loss` value in pretraining objective: {loss_type}") - E907 = ("Unexpected `objective_type` value in pretraining objective: {objective_type}") + E906 = ("Unexpected `loss` value in pretraining objective: '{found}'. Supported values " + "are: {supported}") E908 = ("Can't set `spaces` without `words` in `Doc.__init__`.") E909 = ("Expected {name} in parser internals. This is likely a bug in spaCy.") E910 = ("Encountered NaN value when computing loss for component '{name}'.") @@ -712,6 +720,10 @@ class Errors: E1013 = ("Invalid morph: the MorphAnalysis must have the same vocab as the " "token itself. To set the morph from this MorphAnalysis, set from " "the string value with: `token.set_morph(str(other_morph))`.") + E1014 = ("Error loading DocBin data. It doesn't look like the data is in " + "DocBin (.spacy) format. If your data is in spaCy v2's JSON " + "training format, convert it using `python -m spacy convert " + "file.json .`.") # Deprecated model shortcuts, only used in errors and warnings diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py index b8094319f..3d71f61de 100644 --- a/spacy/lang/char_classes.py +++ b/spacy/lang/char_classes.py @@ -210,8 +210,12 @@ _ukrainian_lower = r"а-щюяіїєґ" _ukrainian_upper = r"А-ЩЮЯІЇЄҐ" _ukrainian = r"а-щюяіїєґА-ЩЮЯІЇЄҐ" -_upper = LATIN_UPPER + _russian_upper + _tatar_upper + _greek_upper + _ukrainian_upper -_lower = LATIN_LOWER + _russian_lower + _tatar_lower + _greek_lower + _ukrainian_lower +_macedonian_lower = r"ѓѕјљњќѐѝ" +_macedonian_upper = r"ЃЅЈЉЊЌЀЍ" +_macedonian = r"ѓѕјљњќѐѝЃЅЈЉЊЌЀЍ" + +_upper = LATIN_UPPER + _russian_upper + _tatar_upper + _greek_upper + _ukrainian_upper + _macedonian_upper +_lower = LATIN_LOWER + _russian_lower + _tatar_lower + _greek_lower + _ukrainian_lower + _macedonian_lower _uncased = ( _bengali @@ -226,7 +230,7 @@ _uncased = ( + _cjk ) -ALPHA = group_chars(LATIN + _russian + _tatar + _greek + _ukrainian + _uncased) +ALPHA = group_chars(LATIN + _russian + _tatar + _greek + _ukrainian + _macedonian + _uncased) ALPHA_LOWER = group_chars(_lower + _uncased) ALPHA_UPPER = group_chars(_upper + _uncased) diff --git a/spacy/lang/cs/__init__.py b/spacy/lang/cs/__init__.py index 0c35e2288..ad2c2117c 100644 --- a/spacy/lang/cs/__init__.py +++ b/spacy/lang/cs/__init__.py @@ -1,9 +1,16 @@ from .stop_words import STOP_WORDS +from .tag_map import TAG_MAP +from ...language import Language +from ...attrs import LANG from .lex_attrs import LEX_ATTRS from ...language import Language class CzechDefaults(Language.Defaults): + lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters.update(LEX_ATTRS) + lex_attr_getters[LANG] = lambda text: "cs" + tag_map = TAG_MAP stop_words = STOP_WORDS lex_attr_getters = LEX_ATTRS diff --git a/spacy/lang/cs/tag_map.py b/spacy/lang/cs/tag_map.py new file mode 100644 index 000000000..80eed74e5 --- /dev/null +++ b/spacy/lang/cs/tag_map.py @@ -0,0 +1,4312 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ...symbols import POS, AUX, ADJ, CCONJ, NUM, ADV, ADP, X, VERB, DET, SCONJ, PUNCT +from ...symbols import NOUN, PART, INTJ, PRON + +# Source https://universaldependencies.org/tagset-conversion/cs-pdt-uposf.html +# fmt: off +TAG_MAP = { + "A.-------------": {POS: ADJ, "morph": "Abbr=Yes"}, + "A2--------A----": {POS: ADJ, "morph": "Hyph=Yes|Polarity=Pos"}, + "A2--------A---1": {POS: ADJ, "morph": "Hyph=Yes|Polarity=Pos"}, + "A2--------N----": {POS: ADJ, "morph": "Hyph=Yes|Polarity=Neg"}, + "AAFD7----1A----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Dual|Polarity=Pos"}, + "AAFD7----1A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Dual|Polarity=Pos|Style=Coll"}, + "AAFD7----1N----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Dual|Polarity=Neg"}, + "AAFD7----1N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Dual|Polarity=Neg|Style=Coll"}, + "AAFD7----2A----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Dual|Polarity=Pos"}, + "AAFD7----2A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Dual|Polarity=Pos|Style=Coll"}, + "AAFD7----2N----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Dual|Polarity=Neg"}, + "AAFD7----2N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Dual|Polarity=Neg|Style=Coll"}, + "AAFD7----3A----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Dual|Polarity=Pos"}, + "AAFD7----3A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Dual|Polarity=Pos|Style=Coll"}, + "AAFD7----3N----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Dual|Polarity=Neg"}, + "AAFD7----3N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Dual|Polarity=Neg|Style=Coll"}, + "AAFP1----1A----": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP1----1A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP1----1N----": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP1----1N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP1----2A----": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP1----2A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP1----2N----": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP1----2N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP1----3A----": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP1----3A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP1----3N----": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP1----3N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP2----1A----": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP2----1A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP2----1N----": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP2----1N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP2----2A----": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP2----2A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP2----2N----": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP2----2N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP2----3A----": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP2----3A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP2----3N----": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP2----3N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP3----1A----": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP3----1A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP3----1N----": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP3----1N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP3----2A----": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP3----2A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP3----2N----": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP3----2N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP3----3A----": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP3----3A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP3----3N----": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP3----3N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP4----1A----": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP4----1A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP4----1N----": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP4----1N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP4----2A----": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP4----2A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP4----2N----": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP4----2N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP4----3A----": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP4----3A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP4----3N----": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP4----3N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP5----1A----": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP5----1A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP5----1N----": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP5----1N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP5----2A----": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP5----2A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP5----2N----": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP5----2N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP5----3A----": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP5----3A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP5----3N----": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP5----3N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP6----1A----": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP6----1A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP6----1N----": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP6----1N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP6----2A----": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP6----2A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP6----2N----": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP6----2N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP6----3A----": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP6----3A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP6----3N----": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP6----3N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP7----1A----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP7----1A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP7----1A---7": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP7----1N----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP7----1N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP7----1N---7": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP7----2A----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP7----2A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP7----2A---7": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP7----2N----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP7----2N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP7----2N---7": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP7----3A----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos"}, + "AAFP7----3A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP7----3A---7": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAFP7----3N----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg"}, + "AAFP7----3N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFP7----3N---7": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAFS1----1A----": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS1----1A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS1----1N----": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS1----1N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS1----2A----": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS1----2A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS1----2N----": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS1----2N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS1----3A----": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS1----3A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS1----3N----": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS1----3N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS2----1A----": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS2----1A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS2----1N----": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS2----1N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS2----2A----": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS2----2A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS2----2N----": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS2----2N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS2----3A----": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS2----3A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS2----3N----": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS2----3N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS3----1A----": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS3----1A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS3----1N----": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS3----1N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS3----2A----": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS3----2A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS3----2N----": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS3----2N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS3----3A----": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS3----3A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS3----3N----": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS3----3N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS4----1A----": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS4----1A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS4----1N----": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS4----1N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS4----2A----": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS4----2A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS4----2N----": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS4----2N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS4----3A----": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS4----3A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS4----3N----": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS4----3N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS5----1A----": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS5----1A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS5----1N----": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS5----1N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS5----2A----": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS5----2A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS5----2N----": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS5----2N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS5----3A----": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS5----3A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS5----3N----": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS5----3N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS6----1A----": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS6----1A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS6----1N----": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS6----1N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS6----2A----": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS6----2A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS6----2N----": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS6----2N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS6----3A----": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS6----3A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS6----3N----": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS6----3N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS7----1A----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS7----1A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS7----1N----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS7----1N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS7----2A----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS7----2A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS7----2N----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS7----2N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFS7----3A----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFS7----3A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAFS7----3N----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg"}, + "AAFS7----3N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAFSX----1A----": {POS: ADJ, "morph": "Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos"}, + "AAFXX----1A----": {POS: ADJ, "morph": "Degree=Pos|Gender=Fem|Polarity=Pos"}, + "AAFXX----1A---8": {POS: ADJ, "morph": "Abbr=Yes|Degree=Pos|Gender=Fem|Polarity=Pos"}, + "AAFXX----1N---8": {POS: ADJ, "morph": "Abbr=Yes|Degree=Pos|Gender=Fem|Polarity=Neg"}, + "AAIP1----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP1----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP1----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP1----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP1----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP1----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP1----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP1----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP1----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP1----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP1----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP1----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP2----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP2----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP2----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP2----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP2----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP2----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP2----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP2----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP2----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP2----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP2----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP2----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP3----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP3----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP3----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP3----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP3----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP3----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP3----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP3----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP3----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP3----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP3----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP3----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP4----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP4----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP4----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP4----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP4----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP4----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP4----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP4----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP4----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP4----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP4----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP4----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP5----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP5----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP5----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP5----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP5----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP5----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP5----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP5----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP5----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP5----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP5----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP5----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP6----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP6----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP6----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP6----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP6----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP6----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP6----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP6----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP6----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP6----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP6----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP6----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP7----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP7----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP7----1A---7": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP7----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP7----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP7----1N---7": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP7----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP7----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP7----2A---7": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP7----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP7----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP7----2N---7": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP7----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIP7----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP7----3A---7": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAIP7----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIP7----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIP7----3N---7": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAIPX----1A----": {POS: ADJ, "morph": "Animacy=Inan|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIPX----1N----": {POS: ADJ, "morph": "Animacy=Inan|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIPX----2A----": {POS: ADJ, "morph": "Animacy=Inan|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIPX----2N----": {POS: ADJ, "morph": "Animacy=Inan|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIPX----3A----": {POS: ADJ, "morph": "Animacy=Inan|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAIPX----3N----": {POS: ADJ, "morph": "Animacy=Inan|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAIS1----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS1----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS1----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS1----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS1----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS1----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS1----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS1----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS1----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS1----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS1----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS1----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS2----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS2----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS2----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS2----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS2----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS2----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS2----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS2----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS2----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS2----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS2----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS2----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS3----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS3----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS3----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS3----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS3----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS3----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS3----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS3----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS3----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS3----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS3----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS3----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS4----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS4----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS4----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS4----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS4----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS4----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS4----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS4----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS4----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS4----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS4----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS4----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS5----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS5----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS5----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS5----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS5----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS5----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS5----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS5----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS5----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS5----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS5----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS5----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS6----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS6----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS6----1A---7": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS6----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS6----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS6----1N---7": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS6----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS6----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS6----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS6----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS6----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS6----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS6----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS6----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS7----1A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS7----1A---2": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "AAIS7----1A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS7----1N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS7----1N---2": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "AAIS7----1N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS7----2A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS7----2A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS7----2N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS7----2N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAIS7----3A----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIS7----3A---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAIS7----3N----": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAIS7----3N---6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAISX----1A----": {POS: ADJ, "morph": "Animacy=Inan|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAIXX----1A----": {POS: ADJ, "morph": "Animacy=Inan|Degree=Pos|Gender=Masc|Polarity=Pos"}, + "AAMP1----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP1----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP1----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP1----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP1----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP1----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP1----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP1----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP1----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP1----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP1----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP1----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP2----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP2----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP2----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP2----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP2----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP2----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP2----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP2----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP2----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP2----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP2----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP2----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP3----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP3----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP3----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP3----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP3----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP3----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP3----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP3----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP3----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP3----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP3----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP3----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP4----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP4----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP4----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP4----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP4----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP4----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP4----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP4----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP4----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP4----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP4----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP4----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP5----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP5----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP5----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP5----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP5----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP5----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP5----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP5----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP5----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP5----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP5----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP5----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP6----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP6----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP6----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP6----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP6----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP6----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP6----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP6----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP6----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP6----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP6----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP6----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP7----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP7----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP7----1A---7": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP7----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP7----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP7----1N---7": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP7----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP7----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP7----2A---7": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP7----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP7----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP7----2N---7": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Cmp|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP7----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos"}, + "AAMP7----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP7----3A---7": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "AAMP7----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg"}, + "AAMP7----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMP7----3N---7": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Sup|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "AAMS1----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS1----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS1----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS1----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS1----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS1----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS1----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS1----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS1----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS1----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS1----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS1----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS2----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS2----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS2----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS2----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS2----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS2----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS2----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS2----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS2----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS2----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS2----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS2----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS3----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS3----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS3----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS3----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS3----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS3----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS3----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS3----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS3----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS3----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS3----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS3----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS4----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS4----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS4----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS4----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS4----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS4----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS4----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS4----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS4----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS4----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS4----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS4----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS5----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS5----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS5----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS5----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS5----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS5----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS5----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS5----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS5----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS5----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS5----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS5----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS6----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS6----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS6----1A---7": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS6----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS6----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS6----1N---7": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS6----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS6----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS6----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS6----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS6----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS6----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS6----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS6----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS7----1A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS7----1A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS7----1N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS7----1N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS7----2A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS7----2A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS7----2N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS7----2N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Cmp|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMS7----3A----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAMS7----3A---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "AAMS7----3N----": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg"}, + "AAMS7----3N---6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Degree=Sup|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "AAMSX----1A----": {POS: ADJ, "morph": "Animacy=Anim|Degree=Pos|Gender=Masc|Number=Sing|Polarity=Pos"}, + "AAND7----1A----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Dual|Polarity=Pos"}, + "AAND7----1A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Dual|Polarity=Pos|Style=Coll"}, + "AAND7----1N----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Dual|Polarity=Neg"}, + "AAND7----1N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Dual|Polarity=Neg|Style=Coll"}, + "AAND7----2A----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Dual|Polarity=Pos"}, + "AAND7----2A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Dual|Polarity=Pos|Style=Coll"}, + "AAND7----2N----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Dual|Polarity=Neg"}, + "AAND7----2N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Dual|Polarity=Neg|Style=Coll"}, + "AAND7----3A----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Dual|Polarity=Pos"}, + "AAND7----3A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Dual|Polarity=Pos|Style=Coll"}, + "AAND7----3N----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Dual|Polarity=Neg"}, + "AAND7----3N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Dual|Polarity=Neg|Style=Coll"}, + "AANP1----1A----": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP1----1A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP1----1N----": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP1----1N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP1----2A----": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP1----2A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP1----2N----": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP1----2N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP1----3A----": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP1----3A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP1----3N----": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP1----3N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP2----1A----": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP2----1A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP2----1N----": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP2----1N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP2----2A----": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP2----2A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP2----2N----": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP2----2N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP2----3A----": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP2----3A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP2----3N----": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP2----3N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP3----1A----": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP3----1A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP3----1N----": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP3----1N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP3----2A----": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP3----2A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP3----2N----": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP3----2N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP3----3A----": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP3----3A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP3----3N----": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP3----3N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP4----1A----": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP4----1A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP4----1N----": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP4----1N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP4----2A----": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP4----2A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP4----2N----": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP4----2N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP4----3A----": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP4----3A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP4----3N----": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP4----3N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP5----1A----": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP5----1A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP5----1N----": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP5----1N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP5----2A----": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP5----2A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP5----2N----": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP5----2N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP5----3A----": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP5----3A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP5----3N----": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP5----3N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP6----1A----": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP6----1A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP6----1N----": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP6----1N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP6----2A----": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP6----2A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP6----2N----": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP6----2N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP6----3A----": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP6----3A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP6----3N----": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP6----3N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP7----1A----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP7----1A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP7----1A---7": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP7----1N----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP7----1N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP7----1N---7": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP7----2A----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP7----2A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP7----2A---7": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP7----2N----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP7----2N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP7----2N---7": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP7----3A----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos"}, + "AANP7----3A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP7----3A---7": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "AANP7----3N----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg"}, + "AANP7----3N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANP7----3N---7": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "AANS1----1A----": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS1----1A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS1----1N----": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS1----1N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS1----2A----": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS1----2A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS1----2N----": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS1----2N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS1----3A----": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS1----3A---6": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS1----3N----": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS1----3N---6": {POS: ADJ, "morph": "Case=Nom|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS2----1A----": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS2----1A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS2----1N----": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS2----1N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS2----2A----": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS2----2A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS2----2N----": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS2----2N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS2----3A----": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS2----3A---6": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS2----3N----": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS2----3N---6": {POS: ADJ, "morph": "Case=Gen|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS3----1A----": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS3----1A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS3----1N----": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS3----1N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS3----2A----": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS3----2A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS3----2N----": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS3----2N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS3----3A----": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS3----3A---6": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS3----3N----": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS3----3N---6": {POS: ADJ, "morph": "Case=Dat|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS4----1A----": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS4----1A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS4----1N----": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS4----1N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS4----2A----": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS4----2A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS4----2N----": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS4----2N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS4----3A----": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS4----3A---6": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS4----3N----": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS4----3N---6": {POS: ADJ, "morph": "Case=Acc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS5----1A----": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS5----1A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS5----1N----": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS5----1N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS5----2A----": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS5----2A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS5----2N----": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS5----2N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS5----3A----": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS5----3A---6": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS5----3N----": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS5----3N---6": {POS: ADJ, "morph": "Case=Voc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS6----1A----": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS6----1A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS6----1A---7": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS6----1N----": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS6----1N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS6----1N---7": {POS: ADJ, "morph": "Case=Loc|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS6----2A----": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS6----2A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS6----2N----": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS6----2N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS6----3A----": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS6----3A---6": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS6----3N----": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS6----3N---6": {POS: ADJ, "morph": "Case=Loc|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS7----1A----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS7----1A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS7----1A---8": {POS: ADJ, "morph": "Abbr=Yes|Case=Ins|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS7----1N----": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS7----1N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Pos|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS7----2A----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS7----2A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS7----2N----": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS7----2N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Cmp|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANS7----3A----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AANS7----3A---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "AANS7----3N----": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg"}, + "AANS7----3N---6": {POS: ADJ, "morph": "Case=Ins|Degree=Sup|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "AANSX----1A----": {POS: ADJ, "morph": "Degree=Pos|Gender=Neut|Number=Sing|Polarity=Pos"}, + "AAXPX----1A----": {POS: ADJ, "morph": "Degree=Pos|Number=Plur|Polarity=Pos"}, + "AAXPX----1N----": {POS: ADJ, "morph": "Degree=Pos|Number=Plur|Polarity=Neg"}, + "AAXXX----1A----": {POS: ADJ, "morph": "Degree=Pos|Polarity=Pos"}, + "AAXXX----1A---1": {POS: ADJ, "morph": "Degree=Pos|Polarity=Pos"}, + "AAXXX----1A---8": {POS: ADJ, "morph": "Abbr=Yes|Degree=Pos|Polarity=Pos"}, + "AAXXX----1A---9": {POS: ADJ, "morph": "Degree=Pos|Polarity=Pos"}, + "AAXXX----1N----": {POS: ADJ, "morph": "Degree=Pos|Polarity=Neg"}, + "AAXXX----1N---8": {POS: ADJ, "morph": "Abbr=Yes|Degree=Pos|Polarity=Neg"}, + "AAXXX----1N---9": {POS: ADJ, "morph": "Degree=Pos|Polarity=Neg"}, + "AAXXX----2A---8": {POS: ADJ, "morph": "Abbr=Yes|Degree=Cmp|Polarity=Pos"}, + "AAXXX----3A---8": {POS: ADJ, "morph": "Abbr=Yes|Degree=Sup|Polarity=Pos"}, + "ACFS4-----A----": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos|Variant=Short"}, + "ACFS4-----N----": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Number=Sing|Polarity=Neg|Variant=Short"}, + "ACMP------A----": {POS: ADJ, "morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos|Variant=Short"}, + "ACMP------N----": {POS: ADJ, "morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg|Variant=Short"}, + "ACNS------A----": {POS: ADJ, "morph": "Gender=Neut|Number=Sing|Polarity=Pos|Variant=Short"}, + "ACNS------N----": {POS: ADJ, "morph": "Gender=Neut|Number=Sing|Polarity=Neg|Variant=Short"}, + "ACQW------A----": {POS: ADJ, "morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Variant=Short"}, + "ACQW------N----": {POS: ADJ, "morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Neg|Variant=Short"}, + "ACTP------A----": {POS: ADJ, "morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Pos|Variant=Short"}, + "ACTP------N----": {POS: ADJ, "morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Neg|Variant=Short"}, + "ACYS------A----": {POS: ADJ, "morph": "Gender=Masc|Number=Sing|Polarity=Pos|Variant=Short"}, + "ACYS------N----": {POS: ADJ, "morph": "Gender=Masc|Number=Sing|Polarity=Neg|Variant=Short"}, + "AGFD7-----A----": {POS: ADJ, "morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Dual|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFD7-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Dual|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFD7-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Dual|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFD7-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Dual|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP1-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP1-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP1-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP1-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP2-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP2-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP2-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP2-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP3-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP3-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP3-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP3-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP4-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP4-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP4-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP4-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP5-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP5-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP5-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP5-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP6-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP6-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP6-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP6-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP7-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP7-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP7-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFP7-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS1-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS1-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS1-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS1-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS2-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS2-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS2-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS2-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS3-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS3-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS3-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS3-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS4-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS4-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS4-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS4-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS5-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS5-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS5-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS5-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS6-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS6-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS6-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS6-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS7-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS7-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS7-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGFS7-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP1-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP1-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP1-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP1-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP2-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP2-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP2-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP2-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP3-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP3-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP3-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP3-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP4-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP4-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP4-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP4-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP5-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP5-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP5-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP5-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP6-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP6-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP6-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP6-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP7-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP7-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP7-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIP7-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS1-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS1-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS1-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS1-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS2-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS2-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS2-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS2-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS3-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS3-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS3-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS3-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS4-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS4-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS4-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS4-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS5-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS5-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS5-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS5-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS6-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS6-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS6-----A---7": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS6-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS6-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS6-----N---7": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS7-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS7-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS7-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGIS7-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Imp|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP1-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP1-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP1-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP1-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP2-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP2-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP2-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP2-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP3-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP3-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP3-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP3-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP4-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP4-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP4-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP4-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP5-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP5-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP5-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP5-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP6-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP6-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP6-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP6-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP7-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP7-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP7-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMP7-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS1-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS1-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS1-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS1-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS2-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS2-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS2-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS2-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS3-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS3-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS3-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS3-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS4-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS4-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS4-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS4-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS5-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS5-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS5-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS5-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS6-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS6-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS6-----A---7": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS6-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS6-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS6-----N---7": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS7-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS7-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS7-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGMS7-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Imp|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGND7-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Dual|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGND7-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Dual|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGND7-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Dual|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGND7-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Dual|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP1-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP1-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP1-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP1-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP2-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP2-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP2-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP2-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP3-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP3-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP3-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP3-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP4-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP4-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP4-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP4-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP5-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP5-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP5-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP5-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP6-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP6-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP6-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP6-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP7-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP7-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP7-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNP7-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS1-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS1-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS1-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS1-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Nom|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS2-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS2-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS2-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS2-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Gen|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS3-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS3-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS3-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS3-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Dat|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS4-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS4-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS4-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS4-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Acc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS5-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS5-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS5-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS5-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Voc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS6-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS6-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS6-----A---7": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS6-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS6-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS6-----N---7": {POS: ADJ,"morph": "Aspect=Imp|Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS7-----A----": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS7-----A---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS7-----N----": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AGNS7-----N---6": {POS: ADJ,"morph": "Aspect=Imp|Case=Ins|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Part|Voice=Act"}, + "AMFD7-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Dual|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFD7-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Dual|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFD7-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Dual|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFD7-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Dual|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP1-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP1-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP1-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP1-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP2-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP2-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP2-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP2-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP3-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP3-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP3-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP3-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP4-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP4-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP4-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP4-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP5-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP5-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP5-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP5-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP6-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP6-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP6-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP6-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP7-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP7-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP7-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFP7-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS1-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS1-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS1-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS1-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS2-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS2-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS2-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS2-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS3-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS3-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS3-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS3-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS4-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS4-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS4-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS4-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS5-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS5-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS5-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS5-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS6-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS6-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS6-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS6-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS7-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS7-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS7-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMFS7-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP1-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP1-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP1-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP1-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP2-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP2-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP2-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP2-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP3-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP3-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP3-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP3-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP4-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP4-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP4-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP4-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP5-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP5-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP5-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP5-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP6-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP6-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP6-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP6-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP7-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP7-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP7-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIP7-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS1-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS1-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS1-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS1-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS2-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS2-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS2-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS2-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS3-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS3-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS3-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS3-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS4-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS4-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS4-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS4-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS5-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS5-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS5-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS5-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS6-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS6-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS6-----A---7": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS6-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS6-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS6-----N---7": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS7-----A----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS7-----A---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS7-----N----": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMIS7-----N---6": {POS: ADJ,"morph": "Animacy=Inan|Aspect=Perf|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP1-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP1-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP1-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP1-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP2-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP2-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP2-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP2-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP3-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP3-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP3-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP3-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP4-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP4-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP4-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP4-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP5-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP5-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP5-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP5-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP6-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP6-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP6-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP6-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP7-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP7-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP7-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMP7-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS1-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS1-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS1-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS1-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS2-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS2-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS2-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS2-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS3-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS3-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS3-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS3-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS4-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS4-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS4-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS4-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS5-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS5-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS5-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS5-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS6-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS6-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS6-----A---7": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS6-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS6-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS6-----N---7": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS7-----A----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS7-----A---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS7-----N----": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMMS7-----N---6": {POS: ADJ,"morph": "Animacy=Anim|Aspect=Perf|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMND7-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Dual|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMND7-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Dual|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMND7-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Dual|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMND7-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Dual|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP1-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP1-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP1-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP1-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP2-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP2-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP2-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP2-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP3-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP3-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP3-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP3-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP4-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP4-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP4-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP4-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP5-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP5-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP5-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP5-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP6-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP6-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP6-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP6-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP7-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP7-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP7-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNP7-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS1-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS1-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS1-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS1-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Nom|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS2-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS2-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS2-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS2-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Gen|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS3-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS3-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS3-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS3-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Dat|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS4-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS4-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS4-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS4-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Acc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS5-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS5-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS5-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS5-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Voc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS6-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS6-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS6-----A---7": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS6-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS6-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS6-----N---7": {POS: ADJ,"morph": "Aspect=Perf|Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS7-----A----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS7-----A---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS7-----N----": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "AMNS7-----N---6": {POS: ADJ,"morph": "Aspect=Perf|Case=Ins|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "AOFP-----------": {POS: ADJ, "morph": "Gender=Fem|Number=Plur"}, + "AOFP----------1": {POS: ADJ, "morph": "Gender=Fem|Number=Plur"}, + "AOFP----------6": {POS: ADJ, "morph": "Gender=Fem|Number=Plur|Style=Coll"}, + "AOFS-----------": {POS: ADJ, "morph": "Gender=Fem|Number=Sing"}, + "AOFS----------1": {POS: ADJ, "morph": "Gender=Fem|Number=Sing"}, + "AOIP-----------": {POS: ADJ, "morph": "Animacy=Inan|Gender=Masc|Number=Plur"}, + "AOIP----------1": {POS: ADJ, "morph": "Animacy=Inan|Gender=Masc|Number=Plur"}, + "AOIP----------6": {POS: ADJ, "morph": "Animacy=Inan|Gender=Masc|Number=Plur|Style=Coll"}, + "AOMP-----------": {POS: ADJ, "morph": "Animacy=Anim|Gender=Masc|Number=Plur"}, + "AOMP----------1": {POS: ADJ, "morph": "Animacy=Anim|Gender=Masc|Number=Plur"}, + "AOMP----------6": {POS: ADJ, "morph": "Animacy=Anim|Gender=Masc|Number=Plur|Style=Coll"}, + "AONP-----------": {POS: ADJ, "morph": "Gender=Neut|Number=Plur"}, + "AONP----------1": {POS: ADJ, "morph": "Gender=Neut|Number=Plur"}, + "AONP----------6": {POS: ADJ, "morph": "Gender=Neut|Number=Plur|Style=Coll"}, + "AONS-----------": {POS: ADJ, "morph": "Gender=Neut|Number=Sing"}, + "AONS----------1": {POS: ADJ, "morph": "Gender=Neut|Number=Sing"}, + "AONS----------6": {POS: ADJ, "morph": "Gender=Neut|Number=Sing|Style=Coll"}, + "AOYS-----------": {POS: ADJ, "morph": "Gender=Masc|Number=Sing"}, + "AOYS----------6": {POS: ADJ, "morph": "Gender=Masc|Number=Sing|Style=Coll"}, + "AUFD7F---------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Fem|Number=Dual|Poss=Yes"}, + "AUFD7F--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Fem|Number=Dual|Poss=Yes|Style=Coll"}, + "AUFD7M---------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Masc|Number=Dual|Poss=Yes"}, + "AUFD7M--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Masc|Number=Dual|Poss=Yes|Style=Coll"}, + "AUFP1F---------": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUFP1F--------6": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP1M---------": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUFP1M--------5": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP1M--------6": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP2F---------": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUFP2F--------6": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP2M---------": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUFP2M--------6": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP3F---------": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUFP3F--------6": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP3M---------": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUFP3M--------6": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP4F---------": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUFP4F--------6": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP4M---------": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUFP4M--------6": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP5F---------": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUFP5F--------6": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP5M---------": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUFP5M--------6": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP6F---------": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUFP6F--------6": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP6M---------": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUFP6M--------6": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP7F---------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUFP7F--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP7F--------7": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP7M---------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUFP7M--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFP7M--------7": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUFS1F---------": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUFS1F--------6": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS1M---------": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUFS1M--------6": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS2F---------": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUFS2F--------6": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS2M---------": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUFS2M--------6": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS3F---------": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUFS3F--------6": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS3M---------": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUFS3M--------6": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS4F---------": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUFS4F--------6": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS4M---------": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUFS4M--------6": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS5F---------": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUFS5F--------6": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS5M---------": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUFS5M--------6": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS6F---------": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUFS6F--------6": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS6M---------": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUFS6M--------6": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS7F---------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUFS7F--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUFS7M---------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUFS7M--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIP1F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUIP1F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP1M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUIP1M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP2F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUIP2F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP2M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUIP2M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP3F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUIP3F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP3M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUIP3M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP4F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUIP4F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP4M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUIP4M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP5F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUIP5F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP5M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUIP5M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP6F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUIP6F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP6M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUIP6M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP7F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUIP7F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP7F--------7": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP7M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUIP7M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIP7M--------7": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUIS1F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUIS1F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS1M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUIS1M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS2F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUIS2F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS2M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUIS2M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS3F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUIS3F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS3M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUIS3M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS4F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUIS4F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS4M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUIS4M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS5F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUIS5F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS5M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUIS5M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS6F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUIS6F--------1": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUIS6F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS6M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUIS6M--------1": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUIS6M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS7F---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUIS7F--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUIS7M---------": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUIS7M--------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMP1F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUMP1F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP1M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUMP1M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP2F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUMP2F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP2M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUMP2M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP3F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUMP3F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP3M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUMP3M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP4F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUMP4F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP4M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUMP4M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP5F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUMP5F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP5M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUMP5M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP6F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUMP6F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP6M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUMP6M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP7F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUMP7F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP7F--------7": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Gender=Masc|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP7M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUMP7M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMP7M--------7": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Gender=Masc|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUMS1F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUMS1F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS1M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUMS1M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS2F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUMS2F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS2M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUMS2M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS3F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUMS3F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS3M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUMS3M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS4F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUMS4F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS4M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUMS4M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS5F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUMS5F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS5M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUMS5M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS6F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUMS6F--------1": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUMS6F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS6M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUMS6M--------1": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUMS6M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS7F---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUMS7F--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Gender=Masc|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUMS7M---------": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUMS7M--------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Gender=Masc|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUND7F---------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Fem|Number=Dual|Poss=Yes"}, + "AUND7F--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Fem|Number=Dual|Poss=Yes|Style=Coll"}, + "AUND7M---------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Masc|Number=Dual|Poss=Yes"}, + "AUND7M--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Masc|Number=Dual|Poss=Yes|Style=Coll"}, + "AUNP1F---------": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUNP1F--------6": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP1M---------": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUNP1M--------6": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP2F---------": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUNP2F--------6": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP2M---------": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUNP2M--------6": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP3F---------": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUNP3F--------6": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP3M---------": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUNP3M--------6": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP4F---------": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUNP4F--------6": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP4M---------": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUNP4M--------6": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP5F---------": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUNP5F--------6": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP5M---------": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUNP5M--------6": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP6F---------": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUNP6F--------6": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP6M---------": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUNP6M--------6": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP7F---------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes"}, + "AUNP7F--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP7F--------7": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Fem|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP7M---------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes"}, + "AUNP7M--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNP7M--------7": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Masc|Number=Plur|Poss=Yes|Style=Coll"}, + "AUNS1F---------": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUNS1F--------6": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS1M---------": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUNS1M--------6": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS2F---------": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUNS2F--------6": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS2M---------": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUNS2M--------6": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS3F---------": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUNS3F--------6": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS3M---------": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUNS3M--------6": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS4F---------": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUNS4F--------6": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS4M---------": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUNS4M--------6": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS5F---------": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUNS5F--------6": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS5M---------": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUNS5M--------6": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS6F---------": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUNS6F--------1": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUNS6F--------6": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS6M---------": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUNS6M--------1": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUNS6M--------6": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS7F---------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes"}, + "AUNS7F--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Fem|Number=Sing|Poss=Yes|Style=Coll"}, + "AUNS7M---------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes"}, + "AUNS7M--------6": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Gender[psor]=Masc|Number=Sing|Poss=Yes|Style=Coll"}, + "AUXXXF--------8": {POS: ADJ, "morph": "Abbr=Yes|Gender[psor]=Fem|Poss=Yes"}, + "AUXXXM---------": {POS: ADJ, "morph": "Gender[psor]=Masc|Poss=Yes"}, + "AUXXXM--------6": {POS: ADJ, "morph": "Gender[psor]=Masc|Poss=Yes|Style=Coll"}, + "AUXXXM--------8": {POS: ADJ, "morph": "Abbr=Yes|Gender[psor]=Masc|Poss=Yes"}, + "C=-------------": {POS: NUM, "morph": "NumForm=Digit|NumType=Card"}, + "C}-------------": {POS: NUM, "morph": "NumForm=Roman|NumType=Card"}, + "C?--1----------": {POS: DET, "morph": "Case=Nom|NumType=Card|PronType=Int,Rel"}, + "C}------------1": {POS: NUM, "morph": "NumForm=Roman|NumType=Card"}, + "C?--2----------": {POS: DET, "morph": "Case=Gen|NumType=Card|PronType=Int,Rel"}, + "C}------------2": {POS: NUM, "morph": "NumForm=Roman|NumType=Card|Style=Arch"}, + "C?--3----------": {POS: DET, "morph": "Case=Dat|NumType=Card|PronType=Int,Rel"}, + "C3-------------": {POS: NUM, "morph": "Abbr=Yes"}, + "C?--4----------": {POS: DET, "morph": "Case=Acc|NumType=Card|PronType=Int,Rel"}, + "C?--6----------": {POS: DET, "morph": "Case=Loc|NumType=Card|PronType=Int,Rel"}, + "C?--7----------": {POS: DET, "morph": "Case=Ins|NumType=Card|PronType=Int,Rel"}, + "Ca--1----------": {POS: DET, "morph": "Case=Nom|NumType=Card|PronType=Dem,Ind"}, + "Ca--2----------": {POS: DET, "morph": "Case=Gen|NumType=Card|PronType=Dem,Ind"}, + "Ca--2---------1": {POS: DET, "morph": "Case=Gen|NumType=Card|PronType=Dem,Ind"}, + "Ca--3----------": {POS: DET, "morph": "Case=Dat|NumType=Card|PronType=Dem,Ind"}, + "Ca--4----------": {POS: DET, "morph": "Case=Acc|NumType=Card|PronType=Dem,Ind"}, + "Ca--5----------": {POS: DET, "morph": "Case=Voc|NumType=Card|PronType=Dem,Ind"}, + "Ca--6----------": {POS: DET, "morph": "Case=Loc|NumType=Card|PronType=Dem,Ind"}, + "Ca--7----------": {POS: DET, "morph": "Case=Ins|NumType=Card|PronType=Dem,Ind"}, + "Ca--X----------": {POS: DET, "morph": "NumType=Card|PronType=Dem,Ind"}, + "Ca--X---------8": {POS: DET, "morph": "Abbr=Yes|NumType=Card|PronType=Dem,Ind"}, + "CdFD7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Dual|NumType=Mult,Sets"}, + "CdFD7---------6": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Dual|NumType=Mult,Sets|Style=Coll"}, + "CdFP1----------": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Number=Plur|NumType=Mult,Sets"}, + "CdFP1---------6": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdFP2----------": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Number=Plur|NumType=Mult,Sets"}, + "CdFP2---------6": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdFP3----------": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Number=Plur|NumType=Mult,Sets"}, + "CdFP3---------6": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdFP4----------": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Number=Plur|NumType=Mult,Sets"}, + "CdFP4---------6": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdFP5----------": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Number=Plur|NumType=Mult,Sets"}, + "CdFP5---------6": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdFP6----------": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Number=Plur|NumType=Mult,Sets"}, + "CdFP6---------6": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdFP7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Plur|NumType=Mult,Sets"}, + "CdFP7---------6": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdFP7---------7": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdFS1----------": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Number=Sing|NumType=Mult,Sets"}, + "CdFS2----------": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Number=Sing|NumType=Mult,Sets"}, + "CdFS2---------6": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdFS3----------": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Number=Sing|NumType=Mult,Sets"}, + "CdFS3---------6": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdFS4----------": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Number=Sing|NumType=Mult,Sets"}, + "CdFS4---------2": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Number=Sing|NumType=Mult,Sets|Style=Arch"}, + "CdFS5----------": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Number=Sing|NumType=Mult,Sets"}, + "CdFS6----------": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Number=Sing|NumType=Mult,Sets"}, + "CdFS6---------6": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdFS7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Sing|NumType=Mult,Sets"}, + "CdIP1----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdIP1---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdIP2----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdIP2---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdIP3----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdIP3---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdIP4----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdIP4---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdIP5----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdIP5---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdIP6----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdIP6---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdIP7----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdIP7---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdIP7---------7": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdIS1----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdIS1---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdIS2----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdIS2---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdIS3----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdIS3---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdIS4----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdIS4---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdIS5----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdIS5---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdIS6----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdIS6---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdIS7----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdIS7---------6": {POS: ADJ,"morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdMP1----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdMP1---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdMP2----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdMP2---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdMP3----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdMP3---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdMP4----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdMP4---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdMP5----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdMP5---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdMP6----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdMP6---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdMP7----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|NumType=Mult,Sets"}, + "CdMP7---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdMP7---------7": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdMS1----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdMS1---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdMS2----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdMS2---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdMS3----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdMS3---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdMS4----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdMS4---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdMS5----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdMS5---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdMS6----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdMS6---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdMS7----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdMS7---------6": {POS: ADJ,"morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdND7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Dual|NumType=Mult,Sets"}, + "CdNP1----------": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Number=Plur|NumType=Mult,Sets"}, + "CdNP1---------6": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdNP2----------": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Number=Plur|NumType=Mult,Sets"}, + "CdNP2---------6": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdNP3----------": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Number=Plur|NumType=Mult,Sets"}, + "CdNP3---------6": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdNP4----------": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Number=Plur|NumType=Mult,Sets"}, + "CdNP4---------6": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdNP5----------": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Number=Plur|NumType=Mult,Sets"}, + "CdNP5---------6": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdNP6----------": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Number=Plur|NumType=Mult,Sets"}, + "CdNP6---------6": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdNP7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Plur|NumType=Mult,Sets"}, + "CdNP7---------6": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdNP7---------7": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Plur|NumType=Mult,Sets|Style=Coll"}, + "CdNS1----------": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Number=Sing|NumType=Mult,Sets"}, + "CdNS1---------1": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Number=Sing|NumType=Mult,Sets"}, + "CdNS1---------6": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdNS2----------": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Number=Sing|NumType=Mult,Sets"}, + "CdNS2---------6": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdNS3----------": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Number=Sing|NumType=Mult,Sets"}, + "CdNS3---------6": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdNS4----------": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Number=Sing|NumType=Mult,Sets"}, + "CdNS4---------1": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Number=Sing|NumType=Mult,Sets"}, + "CdNS4---------6": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdNS5----------": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Number=Sing|NumType=Mult,Sets"}, + "CdNS5---------6": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdNS6----------": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Number=Sing|NumType=Mult,Sets"}, + "CdNS6---------6": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdNS7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Sing|NumType=Mult,Sets"}, + "CdNS7---------6": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Sing|NumType=Mult,Sets|Style=Coll"}, + "CdXP1----------": {POS: ADJ, "morph": "Case=Nom|Number=Plur|NumType=Mult,Sets"}, + "CdXP1---------1": {POS: ADJ, "morph": "Case=Nom|Number=Plur|NumType=Mult,Sets"}, + "CdXP2----------": {POS: ADJ, "morph": "Case=Gen|Number=Plur|NumType=Mult,Sets"}, + "CdXP3----------": {POS: ADJ, "morph": "Case=Dat|Number=Plur|NumType=Mult,Sets"}, + "CdXP4----------": {POS: ADJ, "morph": "Case=Acc|Number=Plur|NumType=Mult,Sets"}, + "CdXP4---------1": {POS: ADJ, "morph": "Case=Acc|Number=Plur|NumType=Mult,Sets"}, + "CdXP5----------": {POS: ADJ, "morph": "Case=Voc|Number=Plur|NumType=Mult,Sets"}, + "CdXP5---------1": {POS: ADJ, "morph": "Case=Voc|Number=Plur|NumType=Mult,Sets"}, + "CdXP6----------": {POS: ADJ, "morph": "Case=Loc|Number=Plur|NumType=Mult,Sets"}, + "CdXP7----------": {POS: ADJ, "morph": "Case=Ins|Number=Plur|NumType=Mult,Sets"}, + "CdXS1----------": {POS: ADJ, "morph": "Case=Nom|Number=Sing|NumType=Mult,Sets"}, + "CdXS5----------": {POS: ADJ, "morph": "Case=Voc|Number=Sing|NumType=Mult,Sets"}, + "CdYS2----------": {POS: ADJ, "morph": "Case=Gen|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdYS3----------": {POS: ADJ, "morph": "Case=Dat|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdYS6----------": {POS: ADJ, "morph": "Case=Loc|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "CdYS7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Masc|Number=Sing|NumType=Mult,Sets"}, + "ChFD7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Dual|NumType=Sets|NumValue=1"}, + "ChFP1----------": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Number=Plur|NumType=Sets|NumValue=1"}, + "ChFP4----------": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Number=Plur|NumType=Sets|NumValue=1"}, + "ChFP5----------": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Number=Plur|NumType=Sets|NumValue=1"}, + "ChIP1----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|NumType=Sets|NumValue=1"}, + "ChIP5----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|NumType=Sets|NumValue=1"}, + "ChMP1----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|NumType=Sets|NumValue=1"}, + "ChMP5----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|NumType=Sets|NumValue=1"}, + "ChNP1----------": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Number=Plur|NumType=Sets|NumValue=1"}, + "ChNP4----------": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Number=Plur|NumType=Sets|NumValue=1"}, + "ChNP5----------": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Number=Plur|NumType=Sets|NumValue=1"}, + "ChXP2----------": {POS: ADJ, "morph": "Case=Gen|Number=Plur|NumType=Sets|NumValue=1"}, + "ChXP3----------": {POS: ADJ, "morph": "Case=Dat|Number=Plur|NumType=Sets|NumValue=1"}, + "ChXP6----------": {POS: ADJ, "morph": "Case=Loc|Number=Plur|NumType=Sets|NumValue=1"}, + "ChXP7----------": {POS: ADJ, "morph": "Case=Ins|Number=Plur|NumType=Sets|NumValue=1"}, + "ChYP4----------": {POS: ADJ, "morph": "Case=Acc|Gender=Masc|Number=Plur|NumType=Sets|NumValue=1"}, + "Cj-S1----------": {POS: NUM, "morph": "Case=Nom|Number=Sing|NumType=Card"}, + "Cj-S2----------": {POS: NUM, "morph": "Case=Gen|Number=Sing|NumType=Card"}, + "Cj-S2---------1": {POS: NUM, "morph": "Case=Gen|Number=Sing|NumType=Card"}, + "Cj-S3----------": {POS: NUM, "morph": "Case=Dat|Number=Sing|NumType=Card"}, + "Cj-S3---------1": {POS: NUM, "morph": "Case=Dat|Number=Sing|NumType=Card"}, + "Cj-S4----------": {POS: NUM, "morph": "Case=Acc|Number=Sing|NumType=Card"}, + "Cj-S5----------": {POS: NUM, "morph": "Case=Voc|Number=Sing|NumType=Card"}, + "Cj-S6----------": {POS: NUM, "morph": "Case=Loc|Number=Sing|NumType=Card"}, + "Cj-S6---------1": {POS: NUM, "morph": "Case=Loc|Number=Sing|NumType=Card"}, + "Cj-S7----------": {POS: NUM, "morph": "Case=Ins|Number=Sing|NumType=Card"}, + "Cj-S7---------1": {POS: NUM, "morph": "Case=Ins|Number=Sing|NumType=Card"}, + "Ck-P1----------": {POS: ADJ, "morph": "Case=Nom|Number=Plur|NumType=Ord"}, + "Ck-P2----------": {POS: ADJ, "morph": "Case=Gen|Number=Plur|NumType=Ord"}, + "Ck-P3----------": {POS: ADJ, "morph": "Case=Dat|Number=Plur|NumType=Ord"}, + "Ck-P4----------": {POS: ADJ, "morph": "Case=Acc|Number=Plur|NumType=Ord"}, + "Ck-P5----------": {POS: ADJ, "morph": "Case=Voc|Number=Plur|NumType=Ord"}, + "Ck-P6----------": {POS: ADJ, "morph": "Case=Loc|Number=Plur|NumType=Ord"}, + "Ck-P7----------": {POS: ADJ, "morph": "Case=Ins|Number=Plur|NumType=Ord"}, + "ClFD7----------": {POS: NUM, "morph": "Case=Ins|Gender=Fem|Number=Dual|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClFD7---------6": {POS: NUM,"morph": "Case=Ins|Gender=Fem|Number=Dual|NumForm=Word|NumType=Card|NumValue=1,2,3|Style=Coll"}, + "ClFD7---------9": {POS: NUM, "morph": "Case=Ins|Gender=Fem|Number=Dual|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClFS1----------": {POS: NUM, "morph": "Case=Nom|Gender=Fem|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClFS2----------": {POS: NUM, "morph": "Case=Gen|Gender=Fem|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClFS3----------": {POS: NUM, "morph": "Case=Dat|Gender=Fem|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClFS4----------": {POS: NUM, "morph": "Case=Acc|Gender=Fem|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClFS5----------": {POS: NUM, "morph": "Case=Voc|Gender=Fem|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClFS6----------": {POS: NUM, "morph": "Case=Loc|Gender=Fem|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClFS7----------": {POS: NUM, "morph": "Case=Ins|Gender=Fem|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClHP1----------": {POS: NUM,"morph": "Case=Nom|Gender=Fem,Neut|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClHP4----------": {POS: NUM,"morph": "Case=Acc|Gender=Fem,Neut|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClHP5----------": {POS: NUM,"morph": "Case=Voc|Gender=Fem,Neut|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClIS4----------": {POS: NUM,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClMS4----------": {POS: NUM,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClNS1----------": {POS: NUM, "morph": "Case=Nom|Gender=Neut|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClNS4----------": {POS: NUM, "morph": "Case=Acc|Gender=Neut|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClNS5----------": {POS: NUM, "morph": "Case=Voc|Gender=Neut|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP1----------": {POS: NUM, "morph": "Case=Nom|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP1---------6": {POS: NUM, "morph": "Case=Nom|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3|Style=Coll"}, + "ClXP2----------": {POS: NUM, "morph": "Case=Gen|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP2---------1": {POS: NUM, "morph": "Case=Gen|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP2---------6": {POS: NUM, "morph": "Case=Gen|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3|Style=Coll"}, + "ClXP3----------": {POS: NUM, "morph": "Case=Dat|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP3---------1": {POS: NUM, "morph": "Case=Dat|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP3---------2": {POS: NUM, "morph": "Case=Dat|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3|Style=Arch"}, + "ClXP3---------6": {POS: NUM, "morph": "Case=Dat|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3|Style=Coll"}, + "ClXP3---------9": {POS: NUM, "morph": "Case=Dat|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP4----------": {POS: NUM, "morph": "Case=Acc|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP4---------6": {POS: NUM, "morph": "Case=Acc|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3|Style=Coll"}, + "ClXP5----------": {POS: NUM, "morph": "Case=Voc|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP5---------6": {POS: NUM, "morph": "Case=Voc|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3|Style=Coll"}, + "ClXP6----------": {POS: NUM, "morph": "Case=Loc|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP6---------1": {POS: NUM, "morph": "Case=Loc|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP6---------2": {POS: NUM, "morph": "Case=Loc|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3|Style=Arch"}, + "ClXP6---------6": {POS: NUM, "morph": "Case=Loc|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3|Style=Coll"}, + "ClXP7----------": {POS: NUM, "morph": "Case=Ins|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP7---------1": {POS: NUM, "morph": "Case=Ins|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXP7---------2": {POS: NUM, "morph": "Case=Ins|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3|Style=Arch"}, + "ClXP7---------6": {POS: NUM, "morph": "Case=Ins|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3|Style=Coll"}, + "ClXP7---------9": {POS: NUM, "morph": "Case=Ins|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXPX----------": {POS: NUM, "morph": "Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXS2----------": {POS: NUM, "morph": "Case=Gen|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXS3----------": {POS: NUM, "morph": "Case=Dat|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXS6----------": {POS: NUM, "morph": "Case=Loc|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXS7----------": {POS: NUM, "morph": "Case=Ins|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClXSX----------": {POS: NUM, "morph": "Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClYP1----------": {POS: NUM, "morph": "Case=Nom|Gender=Masc|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClYP4----------": {POS: NUM, "morph": "Case=Acc|Gender=Masc|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClYP5----------": {POS: NUM, "morph": "Case=Voc|Gender=Masc|Number=Plur|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClYS1----------": {POS: NUM, "morph": "Case=Nom|Gender=Masc|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClYS5----------": {POS: NUM, "morph": "Case=Voc|Gender=Masc|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClZS2----------": {POS: NUM,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClZS3----------": {POS: NUM,"morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClZS6----------": {POS: NUM,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "ClZS7----------": {POS: NUM,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|NumForm=Word|NumType=Card|NumValue=1,2,3"}, + "Cn-P2----------": {POS: NUM, "morph": "Case=Gen|Number=Plur|NumForm=Word|NumType=Card"}, + "Cn-P2---------1": {POS: NUM, "morph": "Case=Gen|Number=Plur|NumForm=Word|NumType=Card"}, + "Cn-P3----------": {POS: NUM, "morph": "Case=Dat|Number=Plur|NumForm=Word|NumType=Card"}, + "Cn-P3---------1": {POS: NUM, "morph": "Case=Dat|Number=Plur|NumForm=Word|NumType=Card"}, + "Cn-P6----------": {POS: NUM, "morph": "Case=Loc|Number=Plur|NumForm=Word|NumType=Card"}, + "Cn-P6---------1": {POS: NUM, "morph": "Case=Loc|Number=Plur|NumForm=Word|NumType=Card"}, + "Cn-P7----------": {POS: NUM, "morph": "Case=Ins|Number=Plur|NumForm=Word|NumType=Card"}, + "Cn-P7---------1": {POS: NUM, "morph": "Case=Ins|Number=Plur|NumForm=Word|NumType=Card"}, + "Cn-S1----------": {POS: NUM, "morph": "Case=Nom|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S1---------1": {POS: NUM, "morph": "Case=Nom|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S2----------": {POS: NUM, "morph": "Case=Gen|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S2---------1": {POS: NUM, "morph": "Case=Gen|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S3----------": {POS: NUM, "morph": "Case=Dat|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S3---------1": {POS: NUM, "morph": "Case=Dat|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S4----------": {POS: NUM, "morph": "Case=Acc|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S4---------1": {POS: NUM, "morph": "Case=Acc|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S5----------": {POS: NUM, "morph": "Case=Voc|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S5---------1": {POS: NUM, "morph": "Case=Voc|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S6----------": {POS: NUM, "morph": "Case=Loc|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S6---------1": {POS: NUM, "morph": "Case=Loc|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S7----------": {POS: NUM, "morph": "Case=Ins|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-S7---------1": {POS: NUM, "morph": "Case=Ins|Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-SX----------": {POS: NUM, "morph": "Number=Sing|NumForm=Word|NumType=Card"}, + "Cn-XX----------": {POS: NUM, "morph": "NumForm=Word|NumType=Card"}, + "Co-------------": {POS: ADV, "morph": "NumType=Mult|PronType=Dem,Ind"}, + "Co------------1": {POS: ADV, "morph": "NumType=Mult|PronType=Dem,Ind"}, + "CrFD7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Dual|NumType=Ord"}, + "CrFD7---------6": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Dual|NumType=Ord|Style=Coll"}, + "CrFP1----------": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Number=Plur|NumType=Ord"}, + "CrFP1---------6": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Number=Plur|NumType=Ord|Style=Coll"}, + "CrFP2----------": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Number=Plur|NumType=Ord"}, + "CrFP2---------6": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Number=Plur|NumType=Ord|Style=Coll"}, + "CrFP3----------": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Number=Plur|NumType=Ord"}, + "CrFP3---------6": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Number=Plur|NumType=Ord|Style=Coll"}, + "CrFP4----------": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Number=Plur|NumType=Ord"}, + "CrFP4---------6": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Number=Plur|NumType=Ord|Style=Coll"}, + "CrFP5----------": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Number=Plur|NumType=Ord"}, + "CrFP5---------6": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Number=Plur|NumType=Ord|Style=Coll"}, + "CrFP6----------": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Number=Plur|NumType=Ord"}, + "CrFP6---------6": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Number=Plur|NumType=Ord|Style=Coll"}, + "CrFP7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Plur|NumType=Ord"}, + "CrFP7---------6": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Plur|NumType=Ord|Style=Coll"}, + "CrFP7---------7": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Plur|NumType=Ord|Style=Coll"}, + "CrFS1----------": {POS: ADJ, "morph": "Case=Nom|Gender=Fem|Number=Sing|NumType=Ord"}, + "CrFS2----------": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Number=Sing|NumType=Ord"}, + "CrFS2---------6": {POS: ADJ, "morph": "Case=Gen|Gender=Fem|Number=Sing|NumType=Ord|Style=Coll"}, + "CrFS3----------": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Number=Sing|NumType=Ord"}, + "CrFS3---------6": {POS: ADJ, "morph": "Case=Dat|Gender=Fem|Number=Sing|NumType=Ord|Style=Coll"}, + "CrFS4----------": {POS: ADJ, "morph": "Case=Acc|Gender=Fem|Number=Sing|NumType=Ord"}, + "CrFS5----------": {POS: ADJ, "morph": "Case=Voc|Gender=Fem|Number=Sing|NumType=Ord"}, + "CrFS6----------": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Number=Sing|NumType=Ord"}, + "CrFS6---------6": {POS: ADJ, "morph": "Case=Loc|Gender=Fem|Number=Sing|NumType=Ord|Style=Coll"}, + "CrFS7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Fem|Number=Sing|NumType=Ord"}, + "CrIP1----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrIP1---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrIP2----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrIP2---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrIP3----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrIP3---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrIP4----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrIP4---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrIP5----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrIP5---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrIP6----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrIP6---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrIP7----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrIP7---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrIP7---------7": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrIS1----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrIS1---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrIS2----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrIS2---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrIS3----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrIS3---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrIS4----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrIS4---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrIS5----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrIS5---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrIS6----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrIS6---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrIS6---------7": {POS: ADJ, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrIS7----------": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrIS7---------6": {POS: ADJ, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrMP1----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrMP1---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrMP2----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrMP2---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrMP3----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrMP3---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrMP4----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrMP4---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrMP5----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrMP5---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrMP6----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrMP6---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrMP7----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|NumType=Ord"}, + "CrMP7---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrMP7---------7": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|NumType=Ord|Style=Coll"}, + "CrMS1----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrMS1---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrMS2----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrMS2---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrMS3----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrMS3---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrMS4----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrMS4---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrMS5----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrMS5---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrMS6----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrMS6---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrMS6---------7": {POS: ADJ, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrMS7----------": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|NumType=Ord"}, + "CrMS7---------6": {POS: ADJ, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|NumType=Ord|Style=Coll"}, + "CrND7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Dual|NumType=Ord"}, + "CrNP1----------": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Number=Plur|NumType=Ord"}, + "CrNP1---------6": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Number=Plur|NumType=Ord|Style=Coll"}, + "CrNP2----------": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Number=Plur|NumType=Ord"}, + "CrNP2---------6": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Number=Plur|NumType=Ord|Style=Coll"}, + "CrNP3----------": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Number=Plur|NumType=Ord"}, + "CrNP3---------6": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Number=Plur|NumType=Ord|Style=Coll"}, + "CrNP4----------": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Number=Plur|NumType=Ord"}, + "CrNP4---------6": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Number=Plur|NumType=Ord|Style=Coll"}, + "CrNP5----------": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Number=Plur|NumType=Ord"}, + "CrNP5---------6": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Number=Plur|NumType=Ord|Style=Coll"}, + "CrNP6----------": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Number=Plur|NumType=Ord"}, + "CrNP6---------6": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Number=Plur|NumType=Ord|Style=Coll"}, + "CrNP7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Plur|NumType=Ord"}, + "CrNP7---------6": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Plur|NumType=Ord|Style=Coll"}, + "CrNP7---------7": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Plur|NumType=Ord|Style=Coll"}, + "CrNS1----------": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Number=Sing|NumType=Ord"}, + "CrNS1---------6": {POS: ADJ, "morph": "Case=Nom|Gender=Neut|Number=Sing|NumType=Ord|Style=Coll"}, + "CrNS2----------": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Number=Sing|NumType=Ord"}, + "CrNS2---------6": {POS: ADJ, "morph": "Case=Gen|Gender=Neut|Number=Sing|NumType=Ord|Style=Coll"}, + "CrNS3----------": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Number=Sing|NumType=Ord"}, + "CrNS3---------6": {POS: ADJ, "morph": "Case=Dat|Gender=Neut|Number=Sing|NumType=Ord|Style=Coll"}, + "CrNS4----------": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Number=Sing|NumType=Ord"}, + "CrNS4---------6": {POS: ADJ, "morph": "Case=Acc|Gender=Neut|Number=Sing|NumType=Ord|Style=Coll"}, + "CrNS5----------": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Number=Sing|NumType=Ord"}, + "CrNS5---------6": {POS: ADJ, "morph": "Case=Voc|Gender=Neut|Number=Sing|NumType=Ord|Style=Coll"}, + "CrNS6----------": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Number=Sing|NumType=Ord"}, + "CrNS6---------6": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Number=Sing|NumType=Ord|Style=Coll"}, + "CrNS6---------7": {POS: ADJ, "morph": "Case=Loc|Gender=Neut|Number=Sing|NumType=Ord|Style=Coll"}, + "CrNS7----------": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Sing|NumType=Ord"}, + "CrNS7---------6": {POS: ADJ, "morph": "Case=Ins|Gender=Neut|Number=Sing|NumType=Ord|Style=Coll"}, + "CrXXX----------": {POS: ADJ, "morph": "NumType=Ord"}, + "Cu-------------": {POS: ADV, "morph": "NumType=Mult|PronType=Int,Rel"}, + "Cv-------------": {POS: ADV, "morph": "NumType=Mult"}, + "Cv------------1": {POS: ADV, "morph": "NumType=Mult"}, + "Cv------------6": {POS: ADV, "morph": "NumType=Mult|Style=Coll"}, + "CwFD7----------": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Dual|NumType=Ord|PronType=Dem,Ind"}, + "CwFP1----------": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwFP4----------": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwFP5----------": {POS: DET, "morph": "Case=Voc|Gender=Fem|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwFS1----------": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwFS2----------": {POS: DET, "morph": "Case=Gen|Gender=Fem|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwFS3----------": {POS: DET, "morph": "Case=Dat|Gender=Fem|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwFS4----------": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwFS5----------": {POS: DET, "morph": "Case=Voc|Gender=Fem|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwFS6----------": {POS: DET, "morph": "Case=Loc|Gender=Fem|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwFS7----------": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwIP1----------": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwIP5----------": {POS: DET,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwIS4----------": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwMP1----------": {POS: DET,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwMP5----------": {POS: DET,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwMS4----------": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwNP1----------": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwNP4----------": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwNP5----------": {POS: DET, "morph": "Case=Voc|Gender=Neut|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwNS1----------": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwNS4----------": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwNS5----------": {POS: DET, "morph": "Case=Voc|Gender=Neut|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwXP2----------": {POS: DET, "morph": "Case=Gen|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwXP3----------": {POS: DET, "morph": "Case=Dat|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwXP6----------": {POS: DET, "morph": "Case=Loc|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwXP7----------": {POS: DET, "morph": "Case=Ins|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwYP4----------": {POS: DET, "morph": "Case=Acc|Gender=Masc|Number=Plur|NumType=Ord|PronType=Dem,Ind"}, + "CwYS1----------": {POS: DET, "morph": "Case=Nom|Gender=Masc|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwYS5----------": {POS: DET, "morph": "Case=Voc|Gender=Masc|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwZS2----------": {POS: DET, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwZS3----------": {POS: DET, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwZS6----------": {POS: DET, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CwZS7----------": {POS: DET, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|NumType=Ord|PronType=Dem,Ind"}, + "CyFP1----------": {POS: NUM, "morph": "Case=Nom|Gender=Fem|Number=Plur|NumType=Frac"}, + "CyFP2----------": {POS: NUM, "morph": "Case=Gen|Gender=Fem|Number=Plur|NumType=Frac"}, + "CyFP3----------": {POS: NUM, "morph": "Case=Dat|Gender=Fem|Number=Plur|NumType=Frac"}, + "CyFP4----------": {POS: NUM, "morph": "Case=Acc|Gender=Fem|Number=Plur|NumType=Frac"}, + "CyFP5----------": {POS: NUM, "morph": "Case=Voc|Gender=Fem|Number=Plur|NumType=Frac"}, + "CyFP6----------": {POS: NUM, "morph": "Case=Loc|Gender=Fem|Number=Plur|NumType=Frac"}, + "CyFP7----------": {POS: NUM, "morph": "Case=Ins|Gender=Fem|Number=Plur|NumType=Frac"}, + "CyFP7---------6": {POS: NUM, "morph": "Case=Ins|Gender=Fem|Number=Plur|NumType=Frac|Style=Coll"}, + "CyFS1----------": {POS: NUM, "morph": "Case=Nom|Gender=Fem|Number=Sing|NumType=Frac"}, + "CyFS2----------": {POS: NUM, "morph": "Case=Gen|Gender=Fem|Number=Sing|NumType=Frac"}, + "CyFS3----------": {POS: NUM, "morph": "Case=Dat|Gender=Fem|Number=Sing|NumType=Frac"}, + "CyFS4----------": {POS: NUM, "morph": "Case=Acc|Gender=Fem|Number=Sing|NumType=Frac"}, + "CyFS5----------": {POS: NUM, "morph": "Case=Voc|Gender=Fem|Number=Sing|NumType=Frac"}, + "CyFS6----------": {POS: NUM, "morph": "Case=Loc|Gender=Fem|Number=Sing|NumType=Frac"}, + "CyFS7----------": {POS: NUM, "morph": "Case=Ins|Gender=Fem|Number=Sing|NumType=Frac"}, + "CzFD7----------": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Dual|NumType=Ord|PronType=Int,Rel"}, + "CzFP1----------": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Plur|NumType=Ord|PronType=Int,Rel"}, + "CzFP4----------": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Plur|NumType=Ord|PronType=Int,Rel"}, + "CzFS1----------": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzFS2----------": {POS: DET, "morph": "Case=Gen|Gender=Fem|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzFS3----------": {POS: DET, "morph": "Case=Dat|Gender=Fem|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzFS4----------": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzFS6----------": {POS: DET, "morph": "Case=Loc|Gender=Fem|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzFS7----------": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzIP1----------": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|NumType=Ord|PronType=Int,Rel"}, + "CzIS4----------": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzMP1----------": {POS: DET,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|NumType=Ord|PronType=Int,Rel"}, + "CzMS4----------": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzNP1----------": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Plur|NumType=Ord|PronType=Int,Rel"}, + "CzNP4----------": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Plur|NumType=Ord|PronType=Int,Rel"}, + "CzNS1----------": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzNS4----------": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzXP2----------": {POS: DET, "morph": "Case=Gen|Number=Plur|NumType=Ord|PronType=Int,Rel"}, + "CzXP3----------": {POS: DET, "morph": "Case=Dat|Number=Plur|NumType=Ord|PronType=Int,Rel"}, + "CzXP6----------": {POS: DET, "morph": "Case=Loc|Number=Plur|NumType=Ord|PronType=Int,Rel"}, + "CzXP7----------": {POS: DET, "morph": "Case=Ins|Number=Plur|NumType=Ord|PronType=Int,Rel"}, + "CzYP4----------": {POS: DET, "morph": "Case=Acc|Gender=Masc|Number=Plur|NumType=Ord|PronType=Int,Rel"}, + "CzYS1----------": {POS: DET, "morph": "Case=Nom|Gender=Masc|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzZS2----------": {POS: DET, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzZS3----------": {POS: DET, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzZS6----------": {POS: DET, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "CzZS7----------": {POS: DET, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|NumType=Ord|PronType=Int,Rel"}, + "D!-------------": {POS: ADV, "morph": "Abbr=Yes"}, + "Db-------------": {POS: ADV, "morph": "_"}, + "Db------------1": {POS: ADV, "morph": "_"}, + "Db------------2": {POS: ADV, "morph": "Style=Arch"}, + "Db------------4": {POS: ADV, "morph": "Style=Arch"}, + "Db------------6": {POS: ADV, "morph": "Style=Coll"}, + "Db------------7": {POS: ADV, "morph": "Style=Coll"}, + "Db------------8": {POS: ADV, "morph": "Abbr=Yes"}, + "Db------------9": {POS: ADV, "morph": "_"}, + "Db--------A----": {POS: ADV, "morph": "Polarity=Pos"}, + "Db--------N----": {POS: ADV, "morph": "Polarity=Neg"}, + "Dg-------1A----": {POS: ADV, "morph": "Degree=Pos|Polarity=Pos"}, + "Dg-------1A---1": {POS: ADV, "morph": "Degree=Pos|Polarity=Pos"}, + "Dg-------1A---3": {POS: ADV, "morph": "Degree=Pos|Polarity=Pos|Style=Arch"}, + "Dg-------1A---8": {POS: ADV, "morph": "Abbr=Yes|Degree=Pos|Polarity=Pos"}, + "Dg-------1N----": {POS: ADV, "morph": "Degree=Pos|Polarity=Neg"}, + "Dg-------1N---3": {POS: ADV, "morph": "Degree=Pos|Polarity=Neg|Style=Arch"}, + "Dg-------1N---8": {POS: ADV, "morph": "Abbr=Yes|Degree=Pos|Polarity=Neg"}, + "Dg-------2A----": {POS: ADV, "morph": "Degree=Cmp|Polarity=Pos"}, + "Dg-------2A---1": {POS: ADV, "morph": "Degree=Cmp|Polarity=Pos"}, + "Dg-------2A---2": {POS: ADV, "morph": "Degree=Cmp|Polarity=Pos|Style=Arch"}, + "Dg-------2A---3": {POS: ADV, "morph": "Degree=Cmp|Polarity=Pos|Style=Arch"}, + "Dg-------2A---6": {POS: ADV, "morph": "Degree=Cmp|Polarity=Pos|Style=Coll"}, + "Dg-------2N----": {POS: ADV, "morph": "Degree=Cmp|Polarity=Neg"}, + "Dg-------2N---1": {POS: ADV, "morph": "Degree=Cmp|Polarity=Neg"}, + "Dg-------2N---2": {POS: ADV, "morph": "Degree=Cmp|Polarity=Neg|Style=Arch"}, + "Dg-------2N---3": {POS: ADV, "morph": "Degree=Cmp|Polarity=Neg|Style=Arch"}, + "Dg-------2N---6": {POS: ADV, "morph": "Degree=Cmp|Polarity=Neg|Style=Coll"}, + "Dg-------3A----": {POS: ADV, "morph": "Degree=Sup|Polarity=Pos"}, + "Dg-------3A---1": {POS: ADV, "morph": "Degree=Sup|Polarity=Pos"}, + "Dg-------3A---2": {POS: ADV, "morph": "Degree=Sup|Polarity=Pos|Style=Arch"}, + "Dg-------3A---3": {POS: ADV, "morph": "Degree=Sup|Polarity=Pos|Style=Arch"}, + "Dg-------3A---6": {POS: ADV, "morph": "Degree=Sup|Polarity=Pos|Style=Coll"}, + "Dg-------3N----": {POS: ADV, "morph": "Degree=Sup|Polarity=Neg"}, + "Dg-------3N---1": {POS: ADV, "morph": "Degree=Sup|Polarity=Neg"}, + "Dg-------3N---2": {POS: ADV, "morph": "Degree=Sup|Polarity=Neg|Style=Arch"}, + "Dg-------3N---3": {POS: ADV, "morph": "Degree=Sup|Polarity=Neg|Style=Arch"}, + "Dg-------3N---6": {POS: ADV, "morph": "Degree=Sup|Polarity=Neg|Style=Coll"}, + "II-------------": {POS: INTJ, "morph": "_"}, + "J^-------------": {POS: CCONJ, "morph": "_"}, + "J,-------------": {POS: SCONJ, "morph": "_"}, + "J*-------------": {POS: CCONJ, "morph": "ConjType=Oper"}, + "J^------------1": {POS: CCONJ, "morph": "_"}, + "J,------------1": {POS: SCONJ, "morph": "_"}, + "J^------------2": {POS: CCONJ, "morph": "Style=Arch"}, + "J^------------8": {POS: CCONJ, "morph": "Abbr=Yes"}, + "J,------------8": {POS: SCONJ, "morph": "Abbr=Yes"}, + "J,-P---1-------": {POS: SCONJ, "morph": "Number=Plur|Person=1"}, + "J,-P---2-------": {POS: SCONJ, "morph": "Number=Plur|Person=2"}, + "J,-S---1-------": {POS: SCONJ, "morph": "Number=Sing|Person=1"}, + "J,-S---2-------": {POS: SCONJ, "morph": "Number=Sing|Person=2"}, + "J,-X---3-------": {POS: SCONJ, "morph": "Person=3"}, + "N;-------------": {POS: NOUN, "morph": "Abbr=Yes"}, + "NNFD7-----A----": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Dual|Polarity=Pos"}, + "NNFD7-----N----": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Dual|Polarity=Neg"}, + "NNFP1-----A----": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP1-----A---1": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP1-----A---4": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNFP1-----A---6": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNFP1-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Nom|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP1-----N----": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP1-----N---1": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP1-----N---4": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNFP1-----N---6": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNFP1-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Nom|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP2-----A----": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP2-----A---1": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP2-----A---6": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNFP2-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Gen|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP2-----N----": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP2-----N---1": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP2-----N---6": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNFP2-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Gen|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP3-----A----": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP3-----A---1": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP3-----A---6": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNFP3-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Dat|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP3-----N----": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP3-----N---1": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP3-----N---6": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNFP3-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Dat|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP4-----A----": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP4-----A---1": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP4-----A---4": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNFP4-----A---6": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNFP4-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Acc|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP4-----N----": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP4-----N---1": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP4-----N---4": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNFP4-----N---6": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNFP4-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Acc|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP5-----A----": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP5-----A---1": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP5-----A---4": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNFP5-----A---6": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNFP5-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Voc|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP5-----N----": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP5-----N---1": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP5-----N---4": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNFP5-----N---6": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNFP5-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Voc|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP6-----A----": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP6-----A---1": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP6-----A---6": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNFP6-----A---7": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNFP6-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Loc|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP6-----N----": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP6-----N---1": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP6-----N---6": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNFP6-----N---7": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNFP6-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Loc|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP7-----A----": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP7-----A---1": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP7-----A---2": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNFP7-----A---6": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNFP7-----A---7": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNFP7-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Ins|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFP7-----N----": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP7-----N---1": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFP7-----N---2": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNFP7-----N---6": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNFP7-----N---7": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNFP7-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Ins|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFPX-----A----": {POS: NOUN, "morph": "Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFPX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Fem|Number=Plur|Polarity=Pos"}, + "NNFPX-----N----": {POS: NOUN, "morph": "Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFPX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Fem|Number=Plur|Polarity=Neg"}, + "NNFS1-----A----": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS1-----A---1": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS1-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Nom|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS1-----N----": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS1-----N---1": {POS: NOUN, "morph": "Case=Nom|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS1-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Nom|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS2-----A----": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS2-----A---1": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS2-----A---2": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNFS2-----A---6": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNFS2-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Gen|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS2-----N----": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS2-----N---1": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS2-----N---2": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNFS2-----N---6": {POS: NOUN, "morph": "Case=Gen|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNFS2-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Gen|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS3-----A----": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS3-----A---1": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS3-----A---2": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNFS3-----A---6": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNFS3-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Dat|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS3-----N----": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS3-----N---1": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS3-----N---2": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNFS3-----N---6": {POS: NOUN, "morph": "Case=Dat|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNFS3-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Dat|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS4-----A----": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS4-----A---1": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS4-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS4-----N----": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS4-----N---1": {POS: NOUN, "morph": "Case=Acc|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS4-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Acc|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS5-----A----": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS5-----A---1": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS5-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Voc|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS5-----N----": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS5-----N---1": {POS: NOUN, "morph": "Case=Voc|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS5-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Voc|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS6-----A----": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS6-----A---1": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS6-----A---6": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNFS6-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Loc|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS6-----N----": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS6-----N---1": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS6-----N---6": {POS: NOUN, "morph": "Case=Loc|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNFS6-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Loc|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS7-----A----": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS7-----A---1": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS7-----A---3": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNFS7-----A---6": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNFS7-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Ins|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFS7-----N----": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS7-----N---1": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFS7-----N---3": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNFS7-----N---6": {POS: NOUN, "morph": "Case=Ins|Gender=Fem|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNFS7-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Ins|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFSX-----A----": {POS: NOUN, "morph": "Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFSX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Fem|Number=Sing|Polarity=Pos"}, + "NNFSX-----N----": {POS: NOUN, "morph": "Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFSX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Fem|Number=Sing|Polarity=Neg"}, + "NNFXX-----A----": {POS: NOUN, "morph": "Gender=Fem|Polarity=Pos"}, + "NNFXX-----A---1": {POS: NOUN, "morph": "Gender=Fem|Polarity=Pos"}, + "NNFXX-----A---2": {POS: NOUN, "morph": "Gender=Fem|Polarity=Pos|Style=Arch"}, + "NNFXX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Fem|Polarity=Pos"}, + "NNFXX-----A---9": {POS: NOUN, "morph": "Gender=Fem|Polarity=Pos"}, + "NNFXX-----N----": {POS: NOUN, "morph": "Gender=Fem|Polarity=Neg"}, + "NNFXX-----N---1": {POS: NOUN, "morph": "Gender=Fem|Polarity=Neg"}, + "NNFXX-----N---2": {POS: NOUN, "morph": "Gender=Fem|Polarity=Neg|Style=Arch"}, + "NNFXX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Fem|Polarity=Neg"}, + "NNFXX-----N---9": {POS: NOUN, "morph": "Gender=Fem|Polarity=Neg"}, + "NNIP1-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP1-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP1-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP1-----A---3": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP1-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNIP1-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP1-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP1-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP1-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP1-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP1-----N---3": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP1-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNIP1-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP1-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP2-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP2-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP2-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP2-----A---3": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP2-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNIP2-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP2-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP2-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP2-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP2-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP2-----N---3": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP2-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNIP2-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP2-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP3-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP3-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP3-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP3-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNIP3-----A---7": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNIP3-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP3-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP3-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP3-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP3-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP3-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNIP3-----N---7": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNIP3-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP3-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP4-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP4-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP4-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP4-----A---3": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP4-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNIP4-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP4-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP4-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP4-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP4-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP4-----N---3": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP4-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNIP4-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP4-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP5-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP5-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP5-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP5-----A---3": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP5-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNIP5-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP5-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP5-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP5-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP5-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP5-----N---3": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP5-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNIP5-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP5-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP6-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP6-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP6-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP6-----A---3": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP6-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNIP6-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP6-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP6-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP6-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP6-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP6-----N---3": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP6-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNIP6-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP6-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP7-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP7-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP7-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNIP7-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNIP7-----A---7": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNIP7-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP7-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIP7-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP7-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP7-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNIP7-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNIP7-----N---7": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNIP7-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIP7-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIPX-----A----": {POS: NOUN, "morph": "Animacy=Inan|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIPX-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIPX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNIPX-----N----": {POS: NOUN, "morph": "Animacy=Inan|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIPX-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIPX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNIS1-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS1-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS1-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNIS1-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNIS1-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS1-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS1-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS1-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNIS1-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNIS1-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS2-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS2-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS2-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNIS2-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNIS2-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS2-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS2-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS2-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS2-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNIS2-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNIS2-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS2-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS3-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS3-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS3-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNIS3-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNIS3-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS3-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS3-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS3-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS3-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNIS3-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNIS3-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS3-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS4-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS4-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS4-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNIS4-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNIS4-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS4-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS4-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS4-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNIS4-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNIS4-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS5-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS5-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS5-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNIS5-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNIS5-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS5-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS5-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS5-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS5-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNIS5-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNIS5-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS5-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS6-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS6-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS6-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNIS6-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNIS6-----A---7": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNIS6-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS6-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS6-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS6-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS6-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNIS6-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNIS6-----N---7": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNIS6-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS6-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS7-----A----": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS7-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS7-----A---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNIS7-----A---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNIS7-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS7-----A---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNIS7-----N----": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS7-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS7-----N---2": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNIS7-----N---6": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNIS7-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIS7-----N---9": {POS: NOUN, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNISX-----A----": {POS: NOUN, "morph": "Animacy=Inan|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNISX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNISX-----N----": {POS: NOUN, "morph": "Animacy=Inan|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNISX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNIXX-----A----": {POS: NOUN, "morph": "Animacy=Inan|Gender=Masc|Polarity=Pos"}, + "NNIXX-----A---1": {POS: NOUN, "morph": "Animacy=Inan|Gender=Masc|Polarity=Pos"}, + "NNIXX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Gender=Masc|Polarity=Pos"}, + "NNIXX-----N----": {POS: NOUN, "morph": "Animacy=Inan|Gender=Masc|Polarity=Neg"}, + "NNIXX-----N---1": {POS: NOUN, "morph": "Animacy=Inan|Gender=Masc|Polarity=Neg"}, + "NNIXX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Inan|Gender=Masc|Polarity=Neg"}, + "NNMP1-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP1-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP1-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNMP1-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP1-----A---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP1-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP1-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP1-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP1-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNMP1-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP1-----N---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP1-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP2-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP2-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP2-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNMP2-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP2-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP2-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP2-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP2-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNMP2-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP2-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP3-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP3-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP3-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNMP3-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP3-----A---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP3-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP3-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP3-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP3-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNMP3-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP3-----N---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP3-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP4-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP4-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP4-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNMP4-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP4-----A---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP4-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP4-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP4-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP4-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNMP4-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP4-----N---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP4-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP5-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP5-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP5-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNMP5-----A---5": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP5-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP5-----A---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP5-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP5-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP5-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP5-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNMP5-----N---5": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP5-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP5-----N---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP5-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP6-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP6-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP6-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNMP6-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP6-----A---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP6-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP6-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP6-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP6-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNMP6-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP6-----N---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP6-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP7-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP7-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP7-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNMP7-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP7-----A---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNMP7-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMP7-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP7-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMP7-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNMP7-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP7-----N---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNMP7-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMPX-----A----": {POS: NOUN, "morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMPX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos"}, + "NNMPX-----N----": {POS: NOUN, "morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMPX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg"}, + "NNMS1-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS1-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS1-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNMS1-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS1-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS1-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS1-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS1-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNMS1-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS1-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS2-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS2-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS2-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNMS2-----A---3": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNMS2-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS2-----A---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS2-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS2-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS2-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS2-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNMS2-----N---3": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNMS2-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS2-----N---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS2-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS3-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS3-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS3-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNMS3-----A---3": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNMS3-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS3-----A---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS3-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS3-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS3-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS3-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNMS3-----N---3": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNMS3-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS3-----N---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS3-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS4-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS4-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS4-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNMS4-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS4-----A---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS4-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS4-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS4-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS4-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNMS4-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS4-----N---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS4-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS5-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS5-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS5-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNMS5-----A---4": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNMS5-----A---5": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS5-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS5-----A---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS5-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS5-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS5-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS5-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNMS5-----N---4": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNMS5-----N---5": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS5-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS5-----N---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS5-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Voc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS6-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS6-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS6-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNMS6-----A---3": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNMS6-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS6-----A---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS6-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS6-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS6-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS6-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNMS6-----N---3": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNMS6-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS6-----N---7": {POS: NOUN, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS6-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS7-----A----": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS7-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS7-----A---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNMS7-----A---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNMS7-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMS7-----N----": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS7-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMS7-----N---2": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNMS7-----N---6": {POS: NOUN, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNMS7-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMSX-----A----": {POS: NOUN, "morph": "Animacy=Anim|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMSX-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMSX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Gender=Masc|Number=Sing|Polarity=Pos"}, + "NNMSX-----N----": {POS: NOUN, "morph": "Animacy=Anim|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMSX-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMSX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Gender=Masc|Number=Sing|Polarity=Neg"}, + "NNMXX-----A----": {POS: NOUN, "morph": "Animacy=Anim|Gender=Masc|Polarity=Pos"}, + "NNMXX-----A---1": {POS: NOUN, "morph": "Animacy=Anim|Gender=Masc|Polarity=Pos"}, + "NNMXX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Gender=Masc|Polarity=Pos"}, + "NNMXX-----N----": {POS: NOUN, "morph": "Animacy=Anim|Gender=Masc|Polarity=Neg"}, + "NNMXX-----N---1": {POS: NOUN, "morph": "Animacy=Anim|Gender=Masc|Polarity=Neg"}, + "NNMXX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Animacy=Anim|Gender=Masc|Polarity=Neg"}, + "NNNP1-----A----": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP1-----A---1": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP1-----A---2": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP1-----A---3": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP1-----A---6": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNNP1-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Nom|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP1-----N----": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP1-----N---1": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP1-----N---2": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP1-----N---3": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP1-----N---6": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNNP1-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Nom|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP2-----A----": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP2-----A---1": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP2-----A---2": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP2-----A---3": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP2-----A---6": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNNP2-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Gen|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP2-----N----": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP2-----N---1": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP2-----N---2": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP2-----N---3": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP2-----N---6": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNNP2-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Gen|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP3-----A----": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP3-----A---1": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP3-----A---2": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP3-----A---3": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP3-----A---6": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNNP3-----A---7": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNNP3-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Dat|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP3-----N----": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP3-----N---1": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP3-----N---2": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP3-----N---3": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP3-----N---6": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNNP3-----N---7": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNNP3-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Dat|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP4-----A----": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP4-----A---1": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP4-----A---2": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP4-----A---3": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP4-----A---6": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNNP4-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Acc|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP4-----N----": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP4-----N---1": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP4-----N---2": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP4-----N---3": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP4-----N---6": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNNP4-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Acc|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP5-----A----": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP5-----A---1": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP5-----A---2": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP5-----A---3": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP5-----A---6": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNNP5-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Voc|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP5-----N----": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP5-----N---1": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP5-----N---2": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP5-----N---3": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP5-----N---6": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNNP5-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Voc|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP6-----A----": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP6-----A---1": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP6-----A---2": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP6-----A---3": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP6-----A---6": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNNP6-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Loc|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP6-----N----": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP6-----N---1": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP6-----N---2": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP6-----N---3": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP6-----N---6": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNNP6-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Loc|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP7-----A----": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP7-----A---1": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP7-----A---2": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP7-----A---3": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Pos|Style=Arch"}, + "NNNP7-----A---6": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNNP7-----A---7": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Pos|Style=Coll"}, + "NNNP7-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Ins|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNP7-----N----": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP7-----N---1": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNP7-----N---2": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP7-----N---3": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Neg|Style=Arch"}, + "NNNP7-----N---6": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNNP7-----N---7": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Plur|Polarity=Neg|Style=Coll"}, + "NNNP7-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Ins|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNPX-----A----": {POS: NOUN, "morph": "Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNPX-----A---1": {POS: NOUN, "morph": "Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNPX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Neut|Number=Plur|Polarity=Pos"}, + "NNNPX-----N----": {POS: NOUN, "morph": "Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNPX-----N---1": {POS: NOUN, "morph": "Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNPX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Neut|Number=Plur|Polarity=Neg"}, + "NNNS1-----A----": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS1-----A---1": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS1-----A---2": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNNS1-----A---6": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNNS1-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Nom|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS1-----N----": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS1-----N---1": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS1-----N---2": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNNS1-----N---6": {POS: NOUN, "morph": "Case=Nom|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNNS1-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Nom|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS2-----A----": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS2-----A---1": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS2-----A---2": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNNS2-----A---3": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNNS2-----A---6": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNNS2-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Gen|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS2-----N----": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS2-----N---1": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS2-----N---2": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNNS2-----N---3": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNNS2-----N---6": {POS: NOUN, "morph": "Case=Gen|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNNS2-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Gen|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS3-----A----": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS3-----A---1": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS3-----A---2": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNNS3-----A---3": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNNS3-----A---6": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNNS3-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Dat|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS3-----N----": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS3-----N---1": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS3-----N---2": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNNS3-----N---3": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNNS3-----N---6": {POS: NOUN, "morph": "Case=Dat|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNNS3-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Dat|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS4-----A----": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS4-----A---1": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS4-----A---2": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNNS4-----A---6": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNNS4-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Acc|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS4-----N----": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS4-----N---1": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS4-----N---2": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNNS4-----N---6": {POS: NOUN, "morph": "Case=Acc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNNS4-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Acc|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS5-----A----": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS5-----A---1": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS5-----A---2": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNNS5-----A---6": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNNS5-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Voc|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS5-----N----": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS5-----N---1": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS5-----N---2": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNNS5-----N---6": {POS: NOUN, "morph": "Case=Voc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNNS5-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Voc|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS6-----A----": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS6-----A---1": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS6-----A---2": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNNS6-----A---6": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNNS6-----A---7": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNNS6-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Loc|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS6-----N----": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS6-----N---1": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS6-----N---2": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNNS6-----N---6": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNNS6-----N---7": {POS: NOUN, "morph": "Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNNS6-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Loc|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS7-----A----": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS7-----A---1": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS7-----A---2": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch"}, + "NNNS7-----A---6": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll"}, + "NNNS7-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Ins|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNS7-----N----": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS7-----N---1": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNS7-----N---2": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch"}, + "NNNS7-----N---6": {POS: NOUN, "morph": "Case=Ins|Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll"}, + "NNNS7-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Case=Ins|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNSX-----A----": {POS: NOUN, "morph": "Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNSX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Neut|Number=Sing|Polarity=Pos"}, + "NNNSX-----N----": {POS: NOUN, "morph": "Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNSX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Neut|Number=Sing|Polarity=Neg"}, + "NNNXX-----A----": {POS: NOUN, "morph": "Gender=Neut|Polarity=Pos"}, + "NNNXX-----A---1": {POS: NOUN, "morph": "Gender=Neut|Polarity=Pos"}, + "NNNXX-----A---2": {POS: NOUN, "morph": "Gender=Neut|Polarity=Pos|Style=Arch"}, + "NNNXX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Neut|Polarity=Pos"}, + "NNNXX-----A---9": {POS: NOUN, "morph": "Gender=Neut|Polarity=Pos"}, + "NNNXX-----N----": {POS: NOUN, "morph": "Gender=Neut|Polarity=Neg"}, + "NNNXX-----N---1": {POS: NOUN, "morph": "Gender=Neut|Polarity=Neg"}, + "NNNXX-----N---2": {POS: NOUN, "morph": "Gender=Neut|Polarity=Neg|Style=Arch"}, + "NNNXX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Gender=Neut|Polarity=Neg"}, + "NNNXX-----N---9": {POS: NOUN, "morph": "Gender=Neut|Polarity=Neg"}, + "NNXPX-----A----": {POS: NOUN, "morph": "Number=Plur|Polarity=Pos"}, + "NNXPX-----N----": {POS: NOUN, "morph": "Number=Plur|Polarity=Neg"}, + "NNXSX-----A----": {POS: NOUN, "morph": "Number=Sing|Polarity=Pos"}, + "NNXSX-----N----": {POS: NOUN, "morph": "Number=Sing|Polarity=Neg"}, + "NNXXX-----A----": {POS: NOUN, "morph": "Polarity=Pos"}, + "NNXXX-----A---8": {POS: NOUN, "morph": "Abbr=Yes|Polarity=Pos"}, + "NNXXX-----N----": {POS: NOUN, "morph": "Polarity=Neg"}, + "NNXXX-----N---8": {POS: NOUN, "morph": "Abbr=Yes|Polarity=Neg"}, + "P0-------------": {POS: PRON, "morph": "AdpType=Preppron|PronType=Prs"}, + "P1FD7FS3-------": {POS: DET,"morph": "Case=Ins|Gender=Fem|Gender[psor]=Fem|Number=Dual|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1FD7FS3------2": {POS: DET,"morph": "Case=Ins|Gender=Fem|Gender[psor]=Fem|Number=Dual|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1FSXFS3-------": {POS: DET,"morph": "Gender=Fem|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1FSXFS3------2": {POS: DET,"morph": "Gender=Fem|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1IS4FS3-------": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1IS4FS3------2": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1MS4FS3-------": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1MS4FS3------2": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1NS4FS3-------": {POS: DET,"morph": "Case=Acc|Gender=Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1NS4FS3------2": {POS: DET,"morph": "Case=Acc|Gender=Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1XP1FS3-------": {POS: DET,"morph": "Case=Nom|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1XP1FS3------2": {POS: DET,"morph": "Case=Nom|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1XP2FS3-------": {POS: DET,"morph": "Case=Gen|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1XP2FS3------2": {POS: DET,"morph": "Case=Gen|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1XP3FS3-------": {POS: DET,"morph": "Case=Dat|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1XP3FS3------2": {POS: DET,"morph": "Case=Dat|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1XP4FS3-------": {POS: DET,"morph": "Case=Acc|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1XP4FS3------2": {POS: DET,"morph": "Case=Acc|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1XP6FS3-------": {POS: DET,"morph": "Case=Loc|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1XP6FS3------2": {POS: DET,"morph": "Case=Loc|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1XP7FS3-------": {POS: DET,"morph": "Case=Ins|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1XP7FS3------2": {POS: DET,"morph": "Case=Ins|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1XXXXP3-------": {POS: DET, "morph": "Number[psor]=Plur|Person=3|Poss=Yes|PronType=Rel"}, + "P1XXXXP3------2": {POS: DET, "morph": "Number[psor]=Plur|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1XXXZS3-------": {POS: DET, "morph": "Gender[psor]=Masc,Neut|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1XXXZS3------2": {POS: DET,"morph": "Gender[psor]=Masc,Neut|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1ZS1FS3-------": {POS: DET,"morph": "Case=Nom|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1ZS1FS3------2": {POS: DET,"morph": "Case=Nom|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1ZS2FS3-------": {POS: DET,"morph": "Case=Gen|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1ZS2FS3------2": {POS: DET,"morph": "Case=Gen|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1ZS3FS3-------": {POS: DET,"morph": "Case=Dat|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1ZS3FS3------2": {POS: DET,"morph": "Case=Dat|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1ZS6FS3-------": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1ZS6FS3------2": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P1ZS7FS3-------": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel"}, + "P1ZS7FS3------2": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Rel|Style=Arch"}, + "P4FD7----------": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Int,Rel"}, + "P4FD7---------6": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Int,Rel|Style=Coll"}, + "P4FP1----------": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Int,Rel"}, + "P4FP1---------6": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4FP4----------": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Plur|PronType=Int,Rel"}, + "P4FP4---------6": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4FS1----------": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Sing|PronType=Int,Rel"}, + "P4FS1---------3": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Sing|PronType=Int,Rel|Style=Arch"}, + "P4FS1---------6": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4FS2----------": {POS: DET, "morph": "Case=Gen|Gender=Fem|Number=Sing|PronType=Int,Rel"}, + "P4FS2---------6": {POS: DET, "morph": "Case=Gen|Gender=Fem|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4FS3----------": {POS: DET, "morph": "Case=Dat|Gender=Fem|Number=Sing|PronType=Int,Rel"}, + "P4FS3---------6": {POS: DET, "morph": "Case=Dat|Gender=Fem|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4FS4----------": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Sing|PronType=Int,Rel"}, + "P4FS4---------6": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4FS6----------": {POS: DET, "morph": "Case=Loc|Gender=Fem|Number=Sing|PronType=Int,Rel"}, + "P4FS6---------6": {POS: DET, "morph": "Case=Loc|Gender=Fem|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4FS7----------": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Sing|PronType=Int,Rel"}, + "P4FS7---------6": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4IP1----------": {POS: DET, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Int,Rel"}, + "P4IP1---------6": {POS: DET, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4IS4----------": {POS: DET, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Int,Rel"}, + "P4IS4---------6": {POS: DET, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4MP1----------": {POS: DET, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Int,Rel"}, + "P4MP1---------6": {POS: DET, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4MS4----------": {POS: DET, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Int,Rel"}, + "P4MS4---------6": {POS: DET, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4NP1----------": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Int,Rel"}, + "P4NP1---------6": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4NP1---------7": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4NP4----------": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Plur|PronType=Int,Rel"}, + "P4NP4---------6": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4NS1----------": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Int,Rel"}, + "P4NS1---------6": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4NS4----------": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Int,Rel"}, + "P4NS4---------6": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4XD7----------": {POS: DET, "morph": "Case=Ins|Number=Dual|PronType=Int,Rel"}, + "P4XP2----------": {POS: DET, "morph": "Case=Gen|Number=Plur|PronType=Int,Rel"}, + "P4XP2---------6": {POS: DET, "morph": "Case=Gen|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4XP3----------": {POS: DET, "morph": "Case=Dat|Number=Plur|PronType=Int,Rel"}, + "P4XP3---------6": {POS: DET, "morph": "Case=Dat|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4XP6----------": {POS: DET, "morph": "Case=Loc|Number=Plur|PronType=Int,Rel"}, + "P4XP6---------6": {POS: DET, "morph": "Case=Loc|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4XP7----------": {POS: DET, "morph": "Case=Ins|Number=Plur|PronType=Int,Rel"}, + "P4XP7---------6": {POS: DET, "morph": "Case=Ins|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4XP7---------7": {POS: DET, "morph": "Case=Ins|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4XXX----------": {POS: DET, "morph": "PronType=Int,Rel"}, + "P4YP4----------": {POS: DET, "morph": "Case=Acc|Gender=Masc|Number=Plur|PronType=Int,Rel"}, + "P4YP4---------6": {POS: DET, "morph": "Case=Acc|Gender=Masc|Number=Plur|PronType=Int,Rel|Style=Coll"}, + "P4YS1----------": {POS: DET, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Int,Rel"}, + "P4YS1---------3": {POS: DET, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Int,Rel|Style=Arch"}, + "P4YS1---------6": {POS: DET, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4ZS2----------": {POS: DET, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PronType=Int,Rel"}, + "P4ZS2---------6": {POS: DET, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4ZS3----------": {POS: DET, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PronType=Int,Rel"}, + "P4ZS3---------6": {POS: DET, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4ZS6----------": {POS: DET, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Int,Rel"}, + "P4ZS6---------6": {POS: DET, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P4ZS7----------": {POS: DET, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PronType=Int,Rel"}, + "P4ZS7---------6": {POS: DET, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PronType=Int,Rel|Style=Coll"}, + "P5FS2--3-------": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5FS3--3-------": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5FS4--3-------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5FS4--3------6": {POS: PRON,"morph": "Case=Acc|Gender=Fem|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs|Style=Coll"}, + "P5FS6--3-------": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5FS7--3-------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5NS4--3-------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5XP2--3-------": {POS: PRON, "morph": "Case=Gen|Number=Plur|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5XP3--3-------": {POS: PRON, "morph": "Case=Dat|Number=Plur|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5XP4--3-------": {POS: PRON, "morph": "Case=Acc|Number=Plur|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5XP6--3-------": {POS: PRON, "morph": "Case=Loc|Number=Plur|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5XP7--3-------": {POS: PRON, "morph": "Case=Ins|Number=Plur|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5ZS2--3-------": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5ZS2--3------1": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5ZS3--3-------": {POS: PRON, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5ZS4--3-------": {POS: PRON, "morph": "Case=Acc|Gender=Masc,Neut|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5ZS4--3------1": {POS: PRON, "morph": "Case=Acc|Gender=Masc,Neut|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5ZS6--3-------": {POS: PRON, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P5ZS7--3-------": {POS: PRON, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Person=3|PrepCase=Pre|PronType=Prs"}, + "P6-X2----------": {POS: PRON, "morph": "Case=Gen|PronType=Prs|Reflex=Yes"}, + "P6-X3----------": {POS: PRON, "morph": "Case=Dat|PronType=Prs|Reflex=Yes"}, + "P6-X4----------": {POS: PRON, "morph": "Case=Acc|PronType=Prs|Reflex=Yes"}, + "P6-X6----------": {POS: PRON, "morph": "Case=Loc|PronType=Prs|Reflex=Yes"}, + "P6-X7----------": {POS: PRON, "morph": "Case=Ins|PronType=Prs|Reflex=Yes"}, + "P7-S3----------": {POS: PRON, "morph": "Case=Dat|Number=Sing|PronType=Prs|Reflex=Yes|Variant=Short"}, + "P7-S3--2-------": {POS: PRON, "morph": "Case=Dat|Number=Sing|Person=2|PronType=Prs|Reflex=Yes|Variant=Short"}, + "P7-S4----------": {POS: PRON, "morph": "Case=Acc|Number=Sing|PronType=Prs|Reflex=Yes|Variant=Short"}, + "P7-S4--2-------": {POS: PRON, "morph": "Case=Acc|Number=Sing|Person=2|PronType=Prs|Reflex=Yes|Variant=Short"}, + "P7-X3----------": {POS: PRON, "morph": "Case=Dat|PronType=Prs|Reflex=Yes|Variant=Short"}, + "P7-X4----------": {POS: PRON, "morph": "Case=Acc|PronType=Prs|Reflex=Yes|Variant=Short"}, + "P8FD7----------": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Dual|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FD7---------6": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Dual|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8FP1---------1": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FP4---------1": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS1---------1": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS2----------": {POS: DET, "morph": "Case=Gen|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS2---------1": {POS: DET, "morph": "Case=Gen|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS2---------6": {POS: DET,"morph": "Case=Gen|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8FS3----------": {POS: DET, "morph": "Case=Dat|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS3---------1": {POS: DET, "morph": "Case=Dat|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS3---------6": {POS: DET,"morph": "Case=Dat|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8FS4----------": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS4---------1": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS4---------6": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8FS5---------1": {POS: DET, "morph": "Case=Voc|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS6----------": {POS: DET, "morph": "Case=Loc|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS6---------1": {POS: DET, "morph": "Case=Loc|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS6---------6": {POS: DET,"morph": "Case=Loc|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8FS7----------": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8FS7---------1": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8HP1----------": {POS: DET, "morph": "Case=Nom|Gender=Fem,Neut|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8HP5----------": {POS: DET, "morph": "Case=Voc|Gender=Fem,Neut|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8HP5---------7": {POS: DET,"morph": "Case=Voc|Gender=Fem,Neut|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8HS1----------": {POS: DET, "morph": "Case=Nom|Gender=Fem,Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8HS5----------": {POS: DET, "morph": "Case=Voc|Gender=Fem,Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8IP1----------": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8IP1---------1": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8IP1---------7": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8IP5----------": {POS: DET,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8IP5---------1": {POS: DET,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8IP5---------7": {POS: DET,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8IS4----------": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8IS4---------6": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8MP1----------": {POS: DET,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8MP1---------1": {POS: DET,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8MP5----------": {POS: DET,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8MP5---------1": {POS: DET,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8MS4----------": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8MS4---------6": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8NP1---------1": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8NP4---------1": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8NP5---------1": {POS: DET, "morph": "Case=Voc|Gender=Neut|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8NS1---------1": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8NS4----------": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8NS4---------1": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8NS5---------1": {POS: DET, "morph": "Case=Voc|Gender=Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8XP2----------": {POS: DET, "morph": "Case=Gen|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8XP2---------6": {POS: DET, "morph": "Case=Gen|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8XP3----------": {POS: DET, "morph": "Case=Dat|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8XP3---------6": {POS: DET, "morph": "Case=Dat|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8XP4----------": {POS: DET, "morph": "Case=Acc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8XP4---------7": {POS: DET, "morph": "Case=Acc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8XP6----------": {POS: DET, "morph": "Case=Loc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8XP6---------6": {POS: DET, "morph": "Case=Loc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8XP7----------": {POS: DET, "morph": "Case=Ins|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8YP4---------1": {POS: DET, "morph": "Case=Acc|Gender=Masc|Number=Plur|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8YS1----------": {POS: DET, "morph": "Case=Nom|Gender=Masc|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8YS1---------6": {POS: DET,"morph": "Case=Nom|Gender=Masc|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8YS5----------": {POS: DET, "morph": "Case=Voc|Gender=Masc|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8YS5---------6": {POS: DET,"morph": "Case=Voc|Gender=Masc|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8ZS2----------": {POS: DET, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8ZS2---------6": {POS: DET,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8ZS3----------": {POS: DET, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8ZS3---------6": {POS: DET,"morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8ZS6----------": {POS: DET, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8ZS6---------6": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8ZS6---------7": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P8ZS7----------": {POS: DET, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes"}, + "P8ZS7---------6": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Poss=Yes|PronType=Prs|Reflex=Yes|Style=Coll"}, + "P9FS2----------": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9FS2---------2": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9FS3----------": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9FS3---------2": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9FS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9FS4---------2": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9FS6----------": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9FS6---------2": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9FS7----------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9FS7---------2": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9NS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9NS4---------2": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9XP2----------": {POS: PRON, "morph": "Case=Gen|Number=Plur|PrepCase=Pre|PronType=Rel"}, + "P9XP2---------2": {POS: PRON, "morph": "Case=Gen|Number=Plur|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9XP3----------": {POS: PRON, "morph": "Case=Dat|Number=Plur|PrepCase=Pre|PronType=Rel"}, + "P9XP3---------2": {POS: PRON, "morph": "Case=Dat|Number=Plur|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9XP4----------": {POS: PRON, "morph": "Case=Acc|Number=Plur|PrepCase=Pre|PronType=Rel"}, + "P9XP4---------2": {POS: PRON, "morph": "Case=Acc|Number=Plur|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9XP6----------": {POS: PRON, "morph": "Case=Loc|Number=Plur|PrepCase=Pre|PronType=Rel"}, + "P9XP6---------2": {POS: PRON, "morph": "Case=Loc|Number=Plur|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9XP7----------": {POS: PRON, "morph": "Case=Ins|Number=Plur|PrepCase=Pre|PronType=Rel"}, + "P9XP7---------2": {POS: PRON, "morph": "Case=Ins|Number=Plur|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9ZS2----------": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9ZS2---------1": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9ZS2---------2": {POS: PRON,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9ZS2---------3": {POS: PRON,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9ZS3----------": {POS: PRON, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9ZS3---------2": {POS: PRON,"morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9ZS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9ZS4---------1": {POS: PRON, "morph": "Case=Acc|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9ZS4---------2": {POS: PRON,"morph": "Case=Acc|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9ZS4---------3": {POS: PRON,"morph": "Case=Acc|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9ZS6----------": {POS: PRON, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9ZS6---------2": {POS: PRON,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "P9ZS7----------": {POS: PRON, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel"}, + "P9ZS7---------2": {POS: PRON,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PrepCase=Pre|PronType=Rel|Style=Arch"}, + "PDFD7----------": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Dem"}, + "PDFD7---------2": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Dem|Style=Arch"}, + "PDFD7---------5": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Dem|Style=Coll"}, + "PDFD7---------6": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Dem|Style=Coll"}, + "PDFP1----------": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Dem"}, + "PDFP1---------5": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Dem|Style=Coll"}, + "PDFP1---------6": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Dem|Style=Coll"}, + "PDFP2----------": {POS: DET, "morph": "Case=Gen|Gender=Fem|Number=Plur|PronType=Dem"}, + "PDFP3----------": {POS: DET, "morph": "Case=Dat|Gender=Fem|Number=Plur|PronType=Dem"}, + "PDFP4----------": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Plur|PronType=Dem"}, + "PDFP4---------5": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Plur|PronType=Dem|Style=Coll"}, + "PDFP4---------6": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Plur|PronType=Dem|Style=Coll"}, + "PDFP6----------": {POS: DET, "morph": "Case=Loc|Gender=Fem|Number=Plur|PronType=Dem"}, + "PDFP7----------": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Plur|PronType=Dem"}, + "PDFS1----------": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDFS1---------5": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS1---------6": {POS: DET, "morph": "Case=Nom|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS1---------8": {POS: DET, "morph": "Abbr=Yes|Case=Nom|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDFS2----------": {POS: DET, "morph": "Case=Gen|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDFS2---------5": {POS: DET, "morph": "Case=Gen|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS2---------6": {POS: DET, "morph": "Case=Gen|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS2---------8": {POS: DET, "morph": "Abbr=Yes|Case=Gen|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDFS3----------": {POS: DET, "morph": "Case=Dat|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDFS3---------5": {POS: DET, "morph": "Case=Dat|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS3---------6": {POS: DET, "morph": "Case=Dat|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS3---------8": {POS: DET, "morph": "Abbr=Yes|Case=Dat|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDFS4----------": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDFS4---------5": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS4---------6": {POS: DET, "morph": "Case=Acc|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS4---------8": {POS: DET, "morph": "Abbr=Yes|Case=Acc|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDFS6----------": {POS: DET, "morph": "Case=Loc|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDFS6---------5": {POS: DET, "morph": "Case=Loc|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS6---------6": {POS: DET, "morph": "Case=Loc|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS6---------8": {POS: DET, "morph": "Abbr=Yes|Case=Loc|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDFS7----------": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDFS7---------5": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS7---------6": {POS: DET, "morph": "Case=Ins|Gender=Fem|Number=Sing|PronType=Dem|Style=Coll"}, + "PDFS7---------8": {POS: DET, "morph": "Abbr=Yes|Case=Ins|Gender=Fem|Number=Sing|PronType=Dem"}, + "PDIP1----------": {POS: DET, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDIP1---------5": {POS: DET, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Dem|Style=Coll"}, + "PDIP1---------6": {POS: DET, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Dem|Style=Coll"}, + "PDIP2----------": {POS: DET, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDIP3----------": {POS: DET, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDIP4----------": {POS: DET, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDIP4---------5": {POS: DET, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|PronType=Dem|Style=Coll"}, + "PDIP4---------6": {POS: DET, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|PronType=Dem|Style=Coll"}, + "PDIP6----------": {POS: DET, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDIP7----------": {POS: DET, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDIS1---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDIS2----------": {POS: DET, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDIS2---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDIS3----------": {POS: DET, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDIS3---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDIS4----------": {POS: DET, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDIS4---------5": {POS: DET, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Dem|Style=Coll"}, + "PDIS4---------6": {POS: DET, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Dem|Style=Coll"}, + "PDIS4---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDIS6----------": {POS: DET, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDIS6---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDIS7----------": {POS: DET, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDIS7---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDMP1----------": {POS: DET, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDMP1---------1": {POS: DET, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDMP1---------5": {POS: DET, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Dem|Style=Coll"}, + "PDMP1---------6": {POS: DET, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Dem|Style=Coll"}, + "PDMP2----------": {POS: DET, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDMP3----------": {POS: DET, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDMP4----------": {POS: DET, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDMP4---------5": {POS: DET, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|PronType=Dem|Style=Coll"}, + "PDMP4---------6": {POS: DET, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|PronType=Dem|Style=Coll"}, + "PDMP6----------": {POS: DET, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDMP7----------": {POS: DET, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|PronType=Dem"}, + "PDMS1----------": {POS: DET, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDMS1---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDMS2----------": {POS: DET, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDMS2---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDMS3----------": {POS: DET, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDMS3---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDMS4----------": {POS: DET, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDMS4---------5": {POS: DET, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Dem|Style=Coll"}, + "PDMS4---------6": {POS: DET, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Dem|Style=Coll"}, + "PDMS4---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDMS6---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDMS7----------": {POS: DET, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDMS7---------8": {POS: DET, "morph": "Abbr=Yes|Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDNP1----------": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Dem"}, + "PDNP1---------5": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Dem|Style=Coll"}, + "PDNP1---------6": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Dem|Style=Coll"}, + "PDNP2----------": {POS: DET, "morph": "Case=Gen|Gender=Neut|Number=Plur|PronType=Dem"}, + "PDNP3----------": {POS: DET, "morph": "Case=Dat|Gender=Neut|Number=Plur|PronType=Dem"}, + "PDNP4----------": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Plur|PronType=Dem"}, + "PDNP4---------5": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Plur|PronType=Dem|Style=Coll"}, + "PDNP4---------6": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Plur|PronType=Dem|Style=Coll"}, + "PDNP6----------": {POS: DET, "morph": "Case=Loc|Gender=Neut|Number=Plur|PronType=Dem"}, + "PDNP7----------": {POS: DET, "morph": "Case=Ins|Gender=Neut|Number=Plur|PronType=Dem"}, + "PDNS1----------": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDNS1---------2": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Dem|Style=Arch"}, + "PDNS1---------5": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PDNS1---------6": {POS: DET, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PDNS1---------8": {POS: DET, "morph": "Abbr=Yes|Case=Nom|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDNS2----------": {POS: DET, "morph": "Case=Gen|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDNS2---------8": {POS: DET, "morph": "Abbr=Yes|Case=Gen|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDNS3----------": {POS: DET, "morph": "Case=Dat|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDNS3---------8": {POS: DET, "morph": "Abbr=Yes|Case=Dat|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDNS4----------": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDNS4---------2": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Dem|Style=Arch"}, + "PDNS4---------5": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PDNS4---------6": {POS: DET, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PDNS4---------8": {POS: DET, "morph": "Abbr=Yes|Case=Acc|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDNS6----------": {POS: DET, "morph": "Case=Loc|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDNS6---------8": {POS: DET, "morph": "Abbr=Yes|Case=Loc|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDNS7----------": {POS: DET, "morph": "Case=Ins|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDNS7---------8": {POS: DET, "morph": "Abbr=Yes|Case=Ins|Gender=Neut|Number=Sing|PronType=Dem"}, + "PDXP2----------": {POS: DET, "morph": "Case=Gen|Number=Plur|PronType=Dem"}, + "PDXP2---------1": {POS: DET, "morph": "Case=Gen|Number=Plur|PronType=Dem"}, + "PDXP2---------2": {POS: DET, "morph": "Case=Gen|Number=Plur|PronType=Dem|Style=Arch"}, + "PDXP2---------5": {POS: DET, "morph": "Case=Gen|Number=Plur|PronType=Dem|Style=Coll"}, + "PDXP2---------6": {POS: DET, "morph": "Case=Gen|Number=Plur|PronType=Dem|Style=Coll"}, + "PDXP3----------": {POS: DET, "morph": "Case=Dat|Number=Plur|PronType=Dem"}, + "PDXP3---------1": {POS: DET, "morph": "Case=Dat|Number=Plur|PronType=Dem"}, + "PDXP3---------2": {POS: DET, "morph": "Case=Dat|Number=Plur|PronType=Dem|Style=Arch"}, + "PDXP3---------5": {POS: DET, "morph": "Case=Dat|Number=Plur|PronType=Dem|Style=Coll"}, + "PDXP3---------6": {POS: DET, "morph": "Case=Dat|Number=Plur|PronType=Dem|Style=Coll"}, + "PDXP6----------": {POS: DET, "morph": "Case=Loc|Number=Plur|PronType=Dem"}, + "PDXP6---------1": {POS: DET, "morph": "Case=Loc|Number=Plur|PronType=Dem"}, + "PDXP6---------2": {POS: DET, "morph": "Case=Loc|Number=Plur|PronType=Dem|Style=Arch"}, + "PDXP6---------5": {POS: DET, "morph": "Case=Loc|Number=Plur|PronType=Dem|Style=Coll"}, + "PDXP6---------6": {POS: DET, "morph": "Case=Loc|Number=Plur|PronType=Dem|Style=Coll"}, + "PDXP7----------": {POS: DET, "morph": "Case=Ins|Number=Plur|PronType=Dem"}, + "PDXP7---------2": {POS: DET, "morph": "Case=Ins|Number=Plur|PronType=Dem|Style=Arch"}, + "PDXP7---------5": {POS: DET, "morph": "Case=Ins|Number=Plur|PronType=Dem|Style=Coll"}, + "PDXP7---------6": {POS: DET, "morph": "Case=Ins|Number=Plur|PronType=Dem|Style=Coll"}, + "PDXPX----------": {POS: DET, "morph": "Number=Plur|PronType=Dem"}, + "PDXPX---------8": {POS: DET, "morph": "Abbr=Yes|Number=Plur|PronType=Dem"}, + "PDXS1----------": {POS: DET, "morph": "Case=Nom|Number=Sing|PronType=Dem"}, + "PDXS2----------": {POS: DET, "morph": "Case=Gen|Number=Sing|PronType=Dem"}, + "PDXS3----------": {POS: DET, "morph": "Case=Dat|Number=Sing|PronType=Dem"}, + "PDXS4----------": {POS: DET, "morph": "Case=Acc|Number=Sing|PronType=Dem"}, + "PDXS6----------": {POS: DET, "morph": "Case=Loc|Number=Sing|PronType=Dem"}, + "PDXS7----------": {POS: DET, "morph": "Case=Ins|Number=Sing|PronType=Dem"}, + "PDXSX----------": {POS: DET, "morph": "Number=Sing|PronType=Dem"}, + "PDXSX---------8": {POS: DET, "morph": "Abbr=Yes|Number=Sing|PronType=Dem"}, + "PDXXX----------": {POS: DET, "morph": "PronType=Dem"}, + "PDXXX---------8": {POS: DET, "morph": "Abbr=Yes|PronType=Dem"}, + "PDYS1----------": {POS: DET, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDYS1---------5": {POS: DET, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Dem|Style=Coll"}, + "PDYS1---------6": {POS: DET, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Dem|Style=Coll"}, + "PDYS4----------": {POS: DET, "morph": "Case=Acc|Gender=Masc|Number=Sing|PronType=Dem"}, + "PDZS2----------": {POS: DET, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PronType=Dem"}, + "PDZS2---------5": {POS: DET, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PDZS2---------6": {POS: DET, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PDZS3----------": {POS: DET, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PronType=Dem"}, + "PDZS3---------5": {POS: DET, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PDZS3---------6": {POS: DET, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PDZS6----------": {POS: DET, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Dem"}, + "PDZS6---------1": {POS: DET, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Dem"}, + "PDZS6---------2": {POS: DET, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Dem|Style=Arch"}, + "PDZS6---------5": {POS: DET, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PDZS6---------6": {POS: DET, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PDZS7----------": {POS: DET, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PronType=Dem"}, + "PDZS7---------5": {POS: DET, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PDZS7---------6": {POS: DET, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PronType=Dem|Style=Coll"}, + "PE--1----------": {POS: PRON, "morph": "Case=Nom|PronType=Rel"}, + "PE--2----------": {POS: PRON, "morph": "Case=Gen|PronType=Rel"}, + "PE--3----------": {POS: PRON, "morph": "Case=Dat|PronType=Rel"}, + "PE--4----------": {POS: PRON, "morph": "Case=Acc|PronType=Rel"}, + "PE--6----------": {POS: PRON, "morph": "Case=Loc|PronType=Rel"}, + "PE--7----------": {POS: PRON, "morph": "Case=Ins|PronType=Rel"}, + "PH-S2--1-------": {POS: PRON, "morph": "Case=Gen|Number=Sing|Person=1|PronType=Prs|Variant=Short"}, + "PH-S2--2-------": {POS: PRON, "morph": "Case=Gen|Number=Sing|Person=2|PronType=Prs|Variant=Short"}, + "PH-S3--1-------": {POS: PRON, "morph": "Case=Dat|Number=Sing|Person=1|PronType=Prs|Variant=Short"}, + "PH-S3--2-------": {POS: PRON, "morph": "Case=Dat|Number=Sing|Person=2|PronType=Prs|Variant=Short"}, + "PH-S4--1-------": {POS: PRON, "morph": "Case=Acc|Number=Sing|Person=1|PronType=Prs|Variant=Short"}, + "PH-S4--2-------": {POS: PRON, "morph": "Case=Acc|Number=Sing|Person=2|PronType=Prs|Variant=Short"}, + "PHZS2--3-------": {POS: PRON,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Person=3|PronType=Prs|Variant=Short"}, + "PHZS3--3-------": {POS: PRON,"morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|Person=3|PronType=Prs|Variant=Short"}, + "PHZS4--3-------": {POS: PRON,"morph": "Case=Acc|Gender=Masc,Neut|Number=Sing|Person=3|PronType=Prs|Variant=Short"}, + "PJFD7----------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Dual|PrepCase=Npr|PronType=Rel"}, + "PJFP1----------": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJFP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJFS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJFS1---------2": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJFS2----------": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJFS2---------2": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJFS3----------": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJFS3---------2": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJFS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJFS4---------2": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJFS6----------": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJFS7----------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJFS7---------2": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJIP1----------": {POS: PRON, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJIS4----------": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJIS4---------2": {POS: PRON,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJMP1----------": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJMS4----------": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJMS4---------2": {POS: PRON,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJNP1----------": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJNP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJNS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJNS1---------2": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJNS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJNS4---------2": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJXP1----------": {POS: PRON, "morph": "Case=Nom|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJXP1---------2": {POS: PRON, "morph": "Case=Nom|Number=Plur|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJXP2----------": {POS: PRON, "morph": "Case=Gen|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJXP2---------2": {POS: PRON, "morph": "Case=Gen|Number=Plur|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJXP3----------": {POS: PRON, "morph": "Case=Dat|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJXP3---------2": {POS: PRON, "morph": "Case=Dat|Number=Plur|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJXP4----------": {POS: PRON, "morph": "Case=Acc|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJXP4---------2": {POS: PRON, "morph": "Case=Acc|Number=Plur|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJXP6----------": {POS: PRON, "morph": "Case=Loc|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJXP7----------": {POS: PRON, "morph": "Case=Ins|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJXP7---------2": {POS: PRON, "morph": "Case=Ins|Number=Plur|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJYP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Masc|Number=Plur|PrepCase=Npr|PronType=Rel"}, + "PJYS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Masc|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJYS1---------2": {POS: PRON, "morph": "Case=Nom|Gender=Masc|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJZS2----------": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJZS2---------1": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJZS2---------2": {POS: PRON,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJZS2---------3": {POS: PRON,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJZS3----------": {POS: PRON, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJZS3---------2": {POS: PRON,"morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJZS4---------1": {POS: PRON, "morph": "Case=Acc|Gender=Masc,Neut|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJZS4---------3": {POS: PRON,"morph": "Case=Acc|Gender=Masc,Neut|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PJZS6----------": {POS: PRON, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJZS7----------": {POS: PRON, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PrepCase=Npr|PronType=Rel"}, + "PJZS7---------2": {POS: PRON,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PrepCase=Npr|PronType=Rel|Style=Arch"}, + "PKM-1----------": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|PronType=Int,Rel"}, + "PKM-1---------1": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|PronType=Int,Rel"}, + "PKM-1---------2": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|PronType=Int,Rel|Style=Arch"}, + "PKM-1--2-------": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Person=2|PronType=Int,Rel"}, + "PKM-2----------": {POS: PRON, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|PronType=Int,Rel"}, + "PKM-2---------2": {POS: PRON, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|PronType=Int,Rel|Style=Arch"}, + "PKM-2--2-------": {POS: PRON, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Person=2|PronType=Int,Rel"}, + "PKM-3----------": {POS: PRON, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|PronType=Int,Rel"}, + "PKM-3---------2": {POS: PRON, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|PronType=Int,Rel|Style=Arch"}, + "PKM-3--2-------": {POS: PRON, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Person=2|PronType=Int,Rel"}, + "PKM-4----------": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|PronType=Int,Rel"}, + "PKM-4---------2": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|PronType=Int,Rel|Style=Arch"}, + "PKM-4--2-------": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Person=2|PronType=Int,Rel"}, + "PKM-6----------": {POS: PRON, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|PronType=Int,Rel"}, + "PKM-6---------2": {POS: PRON, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|PronType=Int,Rel|Style=Arch"}, + "PKM-6--2-------": {POS: PRON, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Person=2|PronType=Int,Rel"}, + "PKM-7----------": {POS: PRON, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|PronType=Int,Rel"}, + "PKM-7---------2": {POS: PRON, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|PronType=Int,Rel|Style=Arch"}, + "PKM-7--2-------": {POS: PRON, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Person=2|PronType=Int,Rel"}, + "PLFD7----------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Tot"}, + "PLFP1----------": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Tot"}, + "PLFP1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Tot|Style=Coll"}, + "PLFP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Plur|PronType=Tot"}, + "PLFP5----------": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Plur|PronType=Tot"}, + "PLFS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Sing|PronType=Tot"}, + "PLFS2----------": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|PronType=Tot"}, + "PLFS3----------": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|PronType=Tot"}, + "PLFS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Sing|PronType=Tot"}, + "PLFS5----------": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Sing|PronType=Tot"}, + "PLFS5---------1": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Sing|PronType=Tot"}, + "PLFS6----------": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Sing|PronType=Tot"}, + "PLFS7----------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Sing|PronType=Tot"}, + "PLIP1----------": {POS: PRON, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Tot"}, + "PLIP1---------6": {POS: PRON, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Tot|Style=Coll"}, + "PLIP5----------": {POS: PRON, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|PronType=Tot"}, + "PLIS4----------": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Tot"}, + "PLIS4---------1": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Tot"}, + "PLMP1----------": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Tot"}, + "PLMP1---------6": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Tot|Style=Coll"}, + "PLMP5----------": {POS: PRON, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|PronType=Tot"}, + "PLMS4----------": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Tot"}, + "PLNP1----------": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Tot"}, + "PLNP1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Tot|Style=Coll"}, + "PLNP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Plur|PronType=Tot"}, + "PLNP5----------": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Plur|PronType=Tot"}, + "PLNS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Tot"}, + "PLNS1---------1": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Tot"}, + "PLNS1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Tot|Style=Coll"}, + "PLNS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Tot"}, + "PLNS4---------1": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Tot"}, + "PLNS4---------6": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Tot|Style=Coll"}, + "PLNS5----------": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Sing|PronType=Tot"}, + "PLNS5---------1": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Sing|PronType=Tot"}, + "PLXP2----------": {POS: PRON, "morph": "Case=Gen|Number=Plur|PronType=Tot"}, + "PLXP3----------": {POS: PRON, "morph": "Case=Dat|Number=Plur|PronType=Tot"}, + "PLXP6----------": {POS: PRON, "morph": "Case=Loc|Number=Plur|PronType=Tot"}, + "PLXP7----------": {POS: PRON, "morph": "Case=Ins|Number=Plur|PronType=Tot"}, + "PLXP7---------6": {POS: PRON, "morph": "Case=Ins|Number=Plur|PronType=Tot|Style=Coll"}, + "PLXXX----------": {POS: PRON, "morph": "PronType=Tot"}, + "PLXXX---------8": {POS: PRON, "morph": "Abbr=Yes|PronType=Tot"}, + "PLYP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Masc|Number=Plur|PronType=Tot"}, + "PLYS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Tot"}, + "PLYS1---------1": {POS: PRON, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Tot"}, + "PLYS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Masc|Number=Sing|PronType=Tot"}, + "PLYS5----------": {POS: PRON, "morph": "Case=Voc|Gender=Masc|Number=Sing|PronType=Tot"}, + "PLYS5---------1": {POS: PRON, "morph": "Case=Voc|Gender=Masc|Number=Sing|PronType=Tot"}, + "PLZS2----------": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PronType=Tot"}, + "PLZS3----------": {POS: PRON, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PronType=Tot"}, + "PLZS6----------": {POS: PRON, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Tot"}, + "PLZS7----------": {POS: PRON, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PronType=Tot"}, + "PPFP1--3-------": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Plur|Person=3|PronType=Prs"}, + "PPFP2--3-------": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Plur|Person=3|PronType=Prs"}, + "PPFP3--3-------": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Plur|Person=3|PronType=Prs"}, + "PPFP4--3-------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Plur|Person=3|PronType=Prs"}, + "PPFP6--3-------": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Plur|Person=3|PronType=Prs"}, + "PPFP7--3-------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Plur|Person=3|PronType=Prs"}, + "PPFPX--3-------": {POS: PRON, "morph": "Gender=Fem|Number=Plur|Person=3|PronType=Prs"}, + "PPFS1--3-------": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Sing|Person=3|PronType=Prs"}, + "PPFS2--3-------": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|Person=3|PronType=Prs"}, + "PPFS3--3-------": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|Person=3|PronType=Prs"}, + "PPFS4--3-------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Sing|Person=3|PronType=Prs"}, + "PPFS6--3-------": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Sing|Person=3|PronType=Prs"}, + "PPFS7--3-------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Sing|Person=3|PronType=Prs"}, + "PPFSX--3-------": {POS: PRON, "morph": "Gender=Fem|Number=Sing|Person=3|PronType=Prs"}, + "PPIP1--3-------": {POS: PRON, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPIP2--3-------": {POS: PRON, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPIP3--3-------": {POS: PRON, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPIP4--3-------": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPIP6--3-------": {POS: PRON, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPIP7--3-------": {POS: PRON, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPIS2--3-------": {POS: PRON, "morph": "Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPIS3--3-------": {POS: PRON, "morph": "Animacy=Inan|Case=Dat|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPIS4--3-------": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPIS6--3-------": {POS: PRON, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPIS7--3-------": {POS: PRON, "morph": "Animacy=Inan|Case=Ins|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPMP1--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPMP2--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPMP3--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPMP4--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPMP6--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPMP7--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPMPX--3-------": {POS: PRON, "morph": "Animacy=Anim|Gender=Masc|Number=Plur|Person=3|PronType=Prs"}, + "PPMS1--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPMS2--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPMS3--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPMS4--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPMS6--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPMS7--3-------": {POS: PRON, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPMSX--3-------": {POS: PRON, "morph": "Animacy=Anim|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPNP1--3-------": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Plur|Person=3|PronType=Prs"}, + "PPNP2--3-------": {POS: PRON, "morph": "Case=Gen|Gender=Neut|Number=Plur|Person=3|PronType=Prs"}, + "PPNP3--3-------": {POS: PRON, "morph": "Case=Dat|Gender=Neut|Number=Plur|Person=3|PronType=Prs"}, + "PPNP4--3-------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Plur|Person=3|PronType=Prs"}, + "PPNP7--3-------": {POS: PRON, "morph": "Case=Ins|Gender=Neut|Number=Plur|Person=3|PronType=Prs"}, + "PPNPX--3-------": {POS: PRON, "morph": "Gender=Neut|Number=Plur|Person=3|PronType=Prs"}, + "PPNS1--3-------": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Sing|Person=3|PronType=Prs"}, + "PPNS2--3-------": {POS: PRON, "morph": "Case=Gen|Gender=Neut|Number=Sing|Person=3|PronType=Prs"}, + "PPNS4--3-------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|Person=3|PronType=Prs"}, + "PPNS6--3-------": {POS: PRON, "morph": "Case=Loc|Gender=Neut|Number=Sing|Person=3|PronType=Prs"}, + "PPNS7--3-------": {POS: PRON, "morph": "Case=Ins|Gender=Neut|Number=Sing|Person=3|PronType=Prs"}, + "PPNSX--3-------": {POS: PRON, "morph": "Gender=Neut|Number=Sing|Person=3|PronType=Prs"}, + "PP-P1--1-------": {POS: PRON, "morph": "Case=Nom|Number=Plur|Person=1|PronType=Prs"}, + "PP-P1--2-------": {POS: PRON, "morph": "Case=Nom|Number=Plur|Person=2|PronType=Prs"}, + "PP-P2--1-------": {POS: PRON, "morph": "Case=Gen|Number=Plur|Person=1|PronType=Prs"}, + "PP-P2--2-------": {POS: PRON, "morph": "Case=Gen|Number=Plur|Person=2|PronType=Prs"}, + "PP-P3--1-------": {POS: PRON, "morph": "Case=Dat|Number=Plur|Person=1|PronType=Prs"}, + "PP-P3--2-------": {POS: PRON, "morph": "Case=Dat|Number=Plur|Person=2|PronType=Prs"}, + "PP-P4--1-------": {POS: PRON, "morph": "Case=Acc|Number=Plur|Person=1|PronType=Prs"}, + "PP-P4--2-------": {POS: PRON, "morph": "Case=Acc|Number=Plur|Person=2|PronType=Prs"}, + "PP-P5--1-------": {POS: PRON, "morph": "Case=Voc|Number=Plur|Person=1|PronType=Prs"}, + "PP-P5--2-------": {POS: PRON, "morph": "Case=Voc|Number=Plur|Person=2|PronType=Prs"}, + "PP-P6--1-------": {POS: PRON, "morph": "Case=Loc|Number=Plur|Person=1|PronType=Prs"}, + "PP-P6--2-------": {POS: PRON, "morph": "Case=Loc|Number=Plur|Person=2|PronType=Prs"}, + "PP-P7--1-------": {POS: PRON, "morph": "Case=Ins|Number=Plur|Person=1|PronType=Prs"}, + "PP-P7--1------6": {POS: PRON, "morph": "Case=Ins|Number=Plur|Person=1|PronType=Prs|Style=Coll"}, + "PP-P7--2-------": {POS: PRON, "morph": "Case=Ins|Number=Plur|Person=2|PronType=Prs"}, + "PP-PX--1-------": {POS: PRON, "morph": "Number=Plur|Person=1|PronType=Prs"}, + "PP-PX--2-------": {POS: PRON, "morph": "Number=Plur|Person=2|PronType=Prs"}, + "PP-S1--1-------": {POS: PRON, "morph": "Case=Nom|Number=Sing|Person=1|PronType=Prs"}, + "PP-S1--2-------": {POS: PRON, "morph": "Case=Nom|Number=Sing|Person=2|PronType=Prs"}, + "PP-S1--2P-AA---": {POS: PRON,"morph": "Case=Nom|Number=Sing|Person=2|Polarity=Pos|PronType=Prs|Tense=Pres|Voice=Act"}, + "PP-S2--1-------": {POS: PRON, "morph": "Case=Gen|Number=Sing|Person=1|PronType=Prs"}, + "PP-S2--2-------": {POS: PRON, "morph": "Case=Gen|Number=Sing|Person=2|PronType=Prs"}, + "PP-S3--1-------": {POS: PRON, "morph": "Case=Dat|Number=Sing|Person=1|PronType=Prs"}, + "PP-S3--2-------": {POS: PRON, "morph": "Case=Dat|Number=Sing|Person=2|PronType=Prs"}, + "PP-S4--1-------": {POS: PRON, "morph": "Case=Acc|Number=Sing|Person=1|PronType=Prs"}, + "PP-S4--2-------": {POS: PRON, "morph": "Case=Acc|Number=Sing|Person=2|PronType=Prs"}, + "PP-S5--1-------": {POS: PRON, "morph": "Case=Voc|Number=Sing|Person=1|PronType=Prs"}, + "PP-S5--2-------": {POS: PRON, "morph": "Case=Voc|Number=Sing|Person=2|PronType=Prs"}, + "PP-S6--1-------": {POS: PRON, "morph": "Case=Loc|Number=Sing|Person=1|PronType=Prs"}, + "PP-S6--2-------": {POS: PRON, "morph": "Case=Loc|Number=Sing|Person=2|PronType=Prs"}, + "PP-S7--1-------": {POS: PRON, "morph": "Case=Ins|Number=Sing|Person=1|PronType=Prs"}, + "PP-S7--2-------": {POS: PRON, "morph": "Case=Ins|Number=Sing|Person=2|PronType=Prs"}, + "PP-SX--1-------": {POS: PRON, "morph": "Number=Sing|Person=1|PronType=Prs"}, + "PP-SX--2-------": {POS: PRON, "morph": "Number=Sing|Person=2|PronType=Prs"}, + "PPXP1--3-------": {POS: PRON, "morph": "Case=Nom|Number=Plur|Person=3|PronType=Prs"}, + "PPXP2--3-------": {POS: PRON, "morph": "Case=Gen|Number=Plur|Person=3|PronType=Prs"}, + "PPXP3--3-------": {POS: PRON, "morph": "Case=Dat|Number=Plur|Person=3|PronType=Prs"}, + "PPXP4--3-------": {POS: PRON, "morph": "Case=Acc|Number=Plur|Person=3|PronType=Prs"}, + "PPXP7--3-------": {POS: PRON, "morph": "Case=Ins|Number=Plur|Person=3|PronType=Prs"}, + "PPXPX--3-------": {POS: PRON, "morph": "Number=Plur|Person=3|PronType=Prs"}, + "PPXS3--3-------": {POS: PRON, "morph": "Case=Dat|Number=Sing|Person=3|PronType=Prs"}, + "PP-XX--2-------": {POS: PRON, "morph": "Person=2|PronType=Prs"}, + "PPYS1--3-------": {POS: PRON, "morph": "Case=Nom|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPYS2--3-------": {POS: PRON, "morph": "Case=Gen|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPYS4--3-------": {POS: PRON, "morph": "Case=Acc|Gender=Masc|Number=Sing|Person=3|PronType=Prs"}, + "PPZS2--3------1": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Person=3|PronType=Prs"}, + "PPZS3--3-------": {POS: PRON, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|Person=3|PronType=Prs"}, + "PPZS4--3------2": {POS: PRON, "morph": "Case=Acc|Gender=Masc,Neut|Number=Sing|Person=3|PronType=Prs|Style=Arch"}, + "PPZS7--3-------": {POS: PRON, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Person=3|PronType=Prs"}, + "PQ--1----------": {POS: PRON, "morph": "Animacy=Inan|Case=Nom|PronType=Int,Rel"}, + "PQ--1---------9": {POS: PRON, "morph": "Animacy=Inan|Case=Nom|PronType=Int,Rel"}, + "PQ--2----------": {POS: PRON, "morph": "Animacy=Inan|Case=Gen|PronType=Int,Rel"}, + "PQ--2---------9": {POS: PRON, "morph": "Animacy=Inan|Case=Gen|PronType=Int,Rel"}, + "PQ--3----------": {POS: PRON, "morph": "Animacy=Inan|Case=Dat|PronType=Int,Rel"}, + "PQ--3---------9": {POS: PRON, "morph": "Animacy=Inan|Case=Dat|PronType=Int,Rel"}, + "PQ--4----------": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|PronType=Int,Rel"}, + "PQ--4---------9": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|PronType=Int,Rel"}, + "PQ--6----------": {POS: PRON, "morph": "Animacy=Inan|Case=Loc|PronType=Int,Rel"}, + "PQ--6---------9": {POS: PRON, "morph": "Animacy=Inan|Case=Loc|PronType=Int,Rel"}, + "PQ--7----------": {POS: PRON, "morph": "Animacy=Inan|Case=Ins|PronType=Int,Rel"}, + "PQ--7---------9": {POS: PRON, "morph": "Animacy=Inan|Case=Ins|PronType=Int,Rel"}, + "PQ--X----------": {POS: PRON, "morph": "Animacy=Inan|PronType=Int,Rel"}, + "PQ--X---------9": {POS: PRON, "morph": "Animacy=Inan|PronType=Int,Rel"}, + "PSFD7FS3-------": {POS: DET,"morph": "Case=Ins|Gender=Fem|Gender[psor]=Fem|Number=Dual|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSFD7-P1-------": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Dual|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSFD7-P2-------": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Dual|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSFD7-S1-------": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Dual|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFD7-S1------6": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Dual|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFD7-S2-------": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Dual|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFD7-S2------6": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Dual|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFP1-S1------1": {POS: DET,"morph": "Case=Nom|Gender=Fem|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFP1-S2------1": {POS: DET,"morph": "Case=Nom|Gender=Fem|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFP4-S1------1": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFP4-S2------1": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFPX-P1-------": {POS: DET, "morph": "Gender=Fem|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSFPX-S1-------": {POS: DET, "morph": "Gender=Fem|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFPX-X1-------": {POS: DET, "morph": "Gender=Fem|Number=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS1-S1------1": {POS: DET,"morph": "Case=Nom|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS1-S2------1": {POS: DET,"morph": "Case=Nom|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS2-P1-------": {POS: DET,"morph": "Case=Gen|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS2-P2-------": {POS: DET,"morph": "Case=Gen|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS2-S1-------": {POS: DET,"morph": "Case=Gen|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS2-S1------1": {POS: DET,"morph": "Case=Gen|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS2-S1------6": {POS: DET,"morph": "Case=Gen|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFS2-S2-------": {POS: DET,"morph": "Case=Gen|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS2-S2------1": {POS: DET,"morph": "Case=Gen|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS2-S2------6": {POS: DET,"morph": "Case=Gen|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFS3-P1-------": {POS: DET,"morph": "Case=Dat|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS3-P2-------": {POS: DET,"morph": "Case=Dat|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS3-S1-------": {POS: DET,"morph": "Case=Dat|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS3-S1------1": {POS: DET,"morph": "Case=Dat|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS3-S1------6": {POS: DET,"morph": "Case=Dat|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFS3-S2-------": {POS: DET,"morph": "Case=Dat|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS3-S2------1": {POS: DET,"morph": "Case=Dat|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS3-S2------6": {POS: DET,"morph": "Case=Dat|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFS4-P1-------": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS4-P1------6": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFS4-P2-------": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS4-P2------6": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFS4-S1-------": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS4-S1------1": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS4-S1------6": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFS4-S2-------": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS4-S2------1": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS4-S2------6": {POS: DET,"morph": "Case=Acc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFS5-S1------1": {POS: DET,"morph": "Case=Voc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS5-S2------1": {POS: DET,"morph": "Case=Voc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS6-P1-------": {POS: DET,"morph": "Case=Loc|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS6-P2-------": {POS: DET,"morph": "Case=Loc|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS6-S1-------": {POS: DET,"morph": "Case=Loc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS6-S1------1": {POS: DET,"morph": "Case=Loc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS6-S1------6": {POS: DET,"morph": "Case=Loc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFS6-S2-------": {POS: DET,"morph": "Case=Loc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS6-S2------1": {POS: DET,"morph": "Case=Loc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS6-S2------6": {POS: DET,"morph": "Case=Loc|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSFS7-P1-------": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS7-P2-------": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS7-S1-------": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS7-S1------1": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFS7-S2-------": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFS7-S2------1": {POS: DET,"morph": "Case=Ins|Gender=Fem|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSFSXFS3-------": {POS: DET,"morph": "Gender=Fem|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSFSX-P1-------": {POS: DET, "morph": "Gender=Fem|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSFSX-S1-------": {POS: DET, "morph": "Gender=Fem|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSFSX-X1-------": {POS: DET, "morph": "Gender=Fem|Number=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSHP1-P1-------": {POS: DET,"morph": "Case=Nom|Gender=Fem,Neut|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSHP1-P2-------": {POS: DET,"morph": "Case=Nom|Gender=Fem,Neut|Number=Plur|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSHP1-S1-------": {POS: DET,"morph": "Case=Nom|Gender=Fem,Neut|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSHP1-S2-------": {POS: DET,"morph": "Case=Nom|Gender=Fem,Neut|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSHP5-S1-------": {POS: DET,"morph": "Case=Voc|Gender=Fem,Neut|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSHP5-S1------7": {POS: DET,"morph": "Case=Voc|Gender=Fem,Neut|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSHP5-S2-------": {POS: DET,"morph": "Case=Voc|Gender=Fem,Neut|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSHP5-S2------7": {POS: DET,"morph": "Case=Voc|Gender=Fem,Neut|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSHS1-P1-------": {POS: DET,"morph": "Case=Nom|Gender=Fem,Neut|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSHS1-P2-------": {POS: DET,"morph": "Case=Nom|Gender=Fem,Neut|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSHS1-S1-------": {POS: DET,"morph": "Case=Nom|Gender=Fem,Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSHS1-S2-------": {POS: DET,"morph": "Case=Nom|Gender=Fem,Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSHS5-P1-------": {POS: DET,"morph": "Case=Voc|Gender=Fem,Neut|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSHS5-P2-------": {POS: DET,"morph": "Case=Voc|Gender=Fem,Neut|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSHS5-S1-------": {POS: DET,"morph": "Case=Voc|Gender=Fem,Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSHS5-S2-------": {POS: DET,"morph": "Case=Voc|Gender=Fem,Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSIP1-P1-------": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSIP1-P2-------": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSIP1-S1-------": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSIP1-S1------1": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSIP1-S1------7": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSIP1-S2-------": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSIP1-S2------1": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSIP1-S2------7": {POS: DET,"morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSIP5-S1-------": {POS: DET,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSIP5-S1------1": {POS: DET,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSIP5-S1------7": {POS: DET,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSIP5-S2-------": {POS: DET,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSIP5-S2------1": {POS: DET,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSIP5-S2------7": {POS: DET,"morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSIPX-P1-------": {POS: DET,"morph": "Animacy=Inan|Gender=Masc|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSIPX-S1-------": {POS: DET,"morph": "Animacy=Inan|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSIPX-X1-------": {POS: DET, "morph": "Animacy=Inan|Gender=Masc|Number=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSIS4FS3-------": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSIS4-P1-------": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSIS4-P2-------": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSIS4-S1-------": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSIS4-S1------6": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSIS4-S2-------": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSIS4-S2------6": {POS: DET,"morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSISX-P1-------": {POS: DET,"morph": "Animacy=Inan|Gender=Masc|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSISX-S1-------": {POS: DET,"morph": "Animacy=Inan|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSISX-X1-------": {POS: DET, "morph": "Animacy=Inan|Gender=Masc|Number=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSMP1-P1-------": {POS: DET,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSMP1-P2-------": {POS: DET,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSMP1-S1-------": {POS: DET,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSMP1-S1------1": {POS: DET,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSMP1-S1------7": {POS: DET,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSMP1-S2-------": {POS: DET,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSMP1-S2------1": {POS: DET,"morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSMP5-P1-------": {POS: DET,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSMP5-P2-------": {POS: DET,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSMP5-S1-------": {POS: DET,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSMP5-S1------1": {POS: DET,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSMP5-S1------7": {POS: DET,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSMP5-S2-------": {POS: DET,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSMP5-S2------1": {POS: DET,"morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSMPX-P1-------": {POS: DET,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSMPX-S1-------": {POS: DET,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSMPX-X1-------": {POS: DET, "morph": "Animacy=Anim|Gender=Masc|Number=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSMS4FS3-------": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSMS4-P1-------": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSMS4-P2-------": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSMS4-S1-------": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSMS4-S1------6": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSMS4-S2-------": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSMS4-S2------6": {POS: DET,"morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSMSX-P1-------": {POS: DET,"morph": "Animacy=Anim|Gender=Masc|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSMSX-S1-------": {POS: DET,"morph": "Animacy=Anim|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSMSX-X1-------": {POS: DET, "morph": "Animacy=Anim|Gender=Masc|Number=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSNP1-S1------1": {POS: DET,"morph": "Case=Nom|Gender=Neut|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSNP1-S2------1": {POS: DET,"morph": "Case=Nom|Gender=Neut|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSNP4-S1------1": {POS: DET,"morph": "Case=Acc|Gender=Neut|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSNP4-S2------1": {POS: DET,"morph": "Case=Acc|Gender=Neut|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSNP5-S1------1": {POS: DET,"morph": "Case=Voc|Gender=Neut|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSNP5-S2------1": {POS: DET,"morph": "Case=Voc|Gender=Neut|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSNPX-P1-------": {POS: DET, "morph": "Gender=Neut|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSNPX-S1-------": {POS: DET, "morph": "Gender=Neut|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSNPX-X1-------": {POS: DET, "morph": "Gender=Neut|Number=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSNS1-S1------1": {POS: DET,"morph": "Case=Nom|Gender=Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSNS1-S2------1": {POS: DET,"morph": "Case=Nom|Gender=Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSNS4FS3-------": {POS: DET,"morph": "Case=Acc|Gender=Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSNS4-P1-------": {POS: DET,"morph": "Case=Acc|Gender=Neut|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSNS4-P2-------": {POS: DET,"morph": "Case=Acc|Gender=Neut|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSNS4-S1-------": {POS: DET,"morph": "Case=Acc|Gender=Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSNS4-S1------1": {POS: DET,"morph": "Case=Acc|Gender=Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSNS4-S2-------": {POS: DET,"morph": "Case=Acc|Gender=Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSNS4-S2------1": {POS: DET,"morph": "Case=Acc|Gender=Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSNS5-S1------1": {POS: DET,"morph": "Case=Voc|Gender=Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSNS5-S2------1": {POS: DET,"morph": "Case=Voc|Gender=Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSNSX-P1-------": {POS: DET, "morph": "Gender=Neut|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSNSX-S1-------": {POS: DET, "morph": "Gender=Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSNSX-X1-------": {POS: DET, "morph": "Gender=Neut|Number=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSXP1FS3-------": {POS: DET,"morph": "Case=Nom|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSXP2FS3-------": {POS: DET,"morph": "Case=Gen|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSXP2-P1-------": {POS: DET, "morph": "Case=Gen|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSXP2-P2-------": {POS: DET, "morph": "Case=Gen|Number=Plur|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSXP2-S1-------": {POS: DET, "morph": "Case=Gen|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSXP2-S1------6": {POS: DET,"morph": "Case=Gen|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSXP2-S2-------": {POS: DET, "morph": "Case=Gen|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSXP2-S2------6": {POS: DET,"morph": "Case=Gen|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSXP3FS3-------": {POS: DET,"morph": "Case=Dat|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSXP3-P1-------": {POS: DET, "morph": "Case=Dat|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSXP3-P2-------": {POS: DET, "morph": "Case=Dat|Number=Plur|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSXP3-S1-------": {POS: DET, "morph": "Case=Dat|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSXP3-S1------6": {POS: DET,"morph": "Case=Dat|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSXP3-S2-------": {POS: DET, "morph": "Case=Dat|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSXP3-S2------6": {POS: DET,"morph": "Case=Dat|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSXP4FS3-------": {POS: DET,"morph": "Case=Acc|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSXP4-P1-------": {POS: DET, "morph": "Case=Acc|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSXP4-P2-------": {POS: DET, "morph": "Case=Acc|Number=Plur|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSXP4-S1-------": {POS: DET, "morph": "Case=Acc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSXP4-S1------7": {POS: DET,"morph": "Case=Acc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSXP4-S2-------": {POS: DET, "morph": "Case=Acc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSXP4-S2------7": {POS: DET,"morph": "Case=Acc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSXP5FS3-------": {POS: DET,"morph": "Case=Voc|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSXP6FS3-------": {POS: DET,"morph": "Case=Loc|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSXP6-P1-------": {POS: DET, "morph": "Case=Loc|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSXP6-P2-------": {POS: DET, "morph": "Case=Loc|Number=Plur|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSXP6-S1-------": {POS: DET, "morph": "Case=Loc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSXP6-S1------6": {POS: DET,"morph": "Case=Loc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSXP6-S2-------": {POS: DET, "morph": "Case=Loc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSXP6-S2------6": {POS: DET,"morph": "Case=Loc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSXP7FS3-------": {POS: DET,"morph": "Case=Ins|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSXP7FS3------6": {POS: DET,"morph": "Case=Ins|Gender[psor]=Fem|Number=Plur|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSXP7-P1-------": {POS: DET, "morph": "Case=Ins|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSXP7-P1------6": {POS: DET,"morph": "Case=Ins|Number=Plur|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSXP7-P2-------": {POS: DET, "morph": "Case=Ins|Number=Plur|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSXP7-P2------6": {POS: DET,"morph": "Case=Ins|Number=Plur|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSXP7-S1-------": {POS: DET, "morph": "Case=Ins|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSXP7-S2-------": {POS: DET, "morph": "Case=Ins|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSXXXNS3-------": {POS: DET, "morph": "Gender[psor]=Neut|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSXXX-P1-------": {POS: DET, "morph": "Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSXXX-S1-------": {POS: DET, "morph": "Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSXXX-X2-------": {POS: DET, "morph": "Person=2|Poss=Yes|PronType=Prs"}, + "PSXXXXP3-------": {POS: DET, "morph": "Number[psor]=Plur|Person=3|Poss=Yes|PronType=Prs"}, + "PSXXXYS3-------": {POS: DET, "morph": "Gender[psor]=Masc|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSXXXZS3-------": {POS: DET, "morph": "Gender[psor]=Masc,Neut|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSYP4-S1------1": {POS: DET,"morph": "Case=Acc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSYP4-S1------7": {POS: DET,"morph": "Case=Acc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSYP4-S2------1": {POS: DET,"morph": "Case=Acc|Gender=Masc|Number=Plur|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSYS1-P1-------": {POS: DET,"morph": "Case=Nom|Gender=Masc|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSYS1-P2-------": {POS: DET,"morph": "Case=Nom|Gender=Masc|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSYS1-S1-------": {POS: DET,"morph": "Case=Nom|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSYS1-S1------6": {POS: DET,"morph": "Case=Nom|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSYS1-S2-------": {POS: DET,"morph": "Case=Nom|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSYS1-S2------6": {POS: DET,"morph": "Case=Nom|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSYS5-P1-------": {POS: DET,"morph": "Case=Voc|Gender=Masc|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSYS5-P2-------": {POS: DET,"morph": "Case=Voc|Gender=Masc|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSYS5-S1-------": {POS: DET,"morph": "Case=Voc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSYS5-S1------6": {POS: DET,"morph": "Case=Voc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSYS5-S2-------": {POS: DET,"morph": "Case=Voc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSYS5-S2------6": {POS: DET,"morph": "Case=Voc|Gender=Masc|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS1FS3-------": {POS: DET,"morph": "Case=Nom|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSZS2FS3-------": {POS: DET,"morph": "Case=Gen|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSZS2-P1-------": {POS: DET,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSZS2-P2-------": {POS: DET,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSZS2-S1-------": {POS: DET,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSZS2-S1------6": {POS: DET,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS2-S2-------": {POS: DET,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSZS2-S2------6": {POS: DET,"morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS3FS3-------": {POS: DET,"morph": "Case=Dat|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSZS3-P1-------": {POS: DET,"morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSZS3-P2-------": {POS: DET,"morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSZS3-S1-------": {POS: DET,"morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSZS3-S1------6": {POS: DET,"morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS3-S2-------": {POS: DET,"morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSZS3-S2------6": {POS: DET,"morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS5FS3-------": {POS: DET,"morph": "Case=Voc|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSZS6FS3-------": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSZS6-P1-------": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSZS6-P2-------": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSZS6-S1-------": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSZS6-S1------6": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS6-S1------7": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS6-S2-------": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSZS6-S2------6": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS6-S2------7": {POS: DET,"morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS7FS3-------": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Gender[psor]=Fem|Number=Sing|Number[psor]=Sing|Person=3|Poss=Yes|PronType=Prs"}, + "PSZS7-P1-------": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSZS7-P1------6": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS7-P1------8": {POS: DET,"morph": "Abbr=Yes|Case=Ins|Gender=Masc,Neut|Number=Sing|Number[psor]=Plur|Person=1|Poss=Yes|PronType=Prs"}, + "PSZS7-P2-------": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs"}, + "PSZS7-P2------6": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Number[psor]=Plur|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS7-S1-------": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs"}, + "PSZS7-S1------6": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=1|Poss=Yes|PronType=Prs|Style=Coll"}, + "PSZS7-S2-------": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs"}, + "PSZS7-S2------6": {POS: DET,"morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|Number[psor]=Sing|Person=2|Poss=Yes|PronType=Prs|Style=Coll"}, + "PW--1----------": {POS: PRON, "morph": "Case=Nom|PronType=Neg"}, + "PW--2----------": {POS: PRON, "morph": "Case=Gen|PronType=Neg"}, + "PW--2---------2": {POS: PRON, "morph": "Case=Gen|PronType=Neg|Style=Arch"}, + "PW--3----------": {POS: PRON, "morph": "Case=Dat|PronType=Neg"}, + "PW--3---------2": {POS: PRON, "morph": "Case=Dat|PronType=Neg|Style=Arch"}, + "PW--4----------": {POS: PRON, "morph": "Case=Acc|PronType=Neg"}, + "PW--6----------": {POS: PRON, "morph": "Case=Loc|PronType=Neg"}, + "PW--6---------2": {POS: PRON, "morph": "Case=Loc|PronType=Neg|Style=Arch"}, + "PW--7----------": {POS: PRON, "morph": "Case=Ins|PronType=Neg"}, + "PW--7---------2": {POS: PRON, "morph": "Case=Ins|PronType=Neg|Style=Arch"}, + "PWFD7----------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Neg"}, + "PWFD7---------6": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Neg|Style=Coll"}, + "PWFP1----------": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Neg"}, + "PWFP1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Neg|Style=Coll"}, + "PWFP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Plur|PronType=Neg"}, + "PWFP4---------6": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Plur|PronType=Neg|Style=Coll"}, + "PWFP5----------": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Plur|PronType=Neg"}, + "PWFP5---------6": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Plur|PronType=Neg|Style=Coll"}, + "PWFS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Sing|PronType=Neg"}, + "PWFS2----------": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|PronType=Neg"}, + "PWFS2---------6": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|PronType=Neg|Style=Coll"}, + "PWFS3----------": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|PronType=Neg"}, + "PWFS3---------6": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|PronType=Neg|Style=Coll"}, + "PWFS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Sing|PronType=Neg"}, + "PWFS5----------": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Sing|PronType=Neg"}, + "PWFS6----------": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Sing|PronType=Neg"}, + "PWFS6---------6": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Sing|PronType=Neg|Style=Coll"}, + "PWFS7----------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Sing|PronType=Neg"}, + "PWIP1----------": {POS: PRON, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Neg"}, + "PWIP1---------6": {POS: PRON, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Neg|Style=Coll"}, + "PWIP5----------": {POS: PRON, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|PronType=Neg"}, + "PWIP5---------6": {POS: PRON, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|PronType=Neg|Style=Coll"}, + "PWIS4----------": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Neg"}, + "PWIS4---------6": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Neg|Style=Coll"}, + "PWM-1----------": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|PronType=Neg"}, + "PWM-2----------": {POS: PRON, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|PronType=Neg"}, + "PWM-3----------": {POS: PRON, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|PronType=Neg"}, + "PWM-4----------": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|PronType=Neg"}, + "PWM-6----------": {POS: PRON, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|PronType=Neg"}, + "PWM-7----------": {POS: PRON, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|PronType=Neg"}, + "PWMP1----------": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Neg"}, + "PWMP1---------6": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Neg|Style=Coll"}, + "PWMP5----------": {POS: PRON, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|PronType=Neg"}, + "PWMP5---------6": {POS: PRON, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|PronType=Neg|Style=Coll"}, + "PWMS4----------": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Neg"}, + "PWMS4---------6": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Neg|Style=Coll"}, + "PWNP1----------": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Neg"}, + "PWNP1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Neg|Style=Coll"}, + "PWNP1---------7": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Neg|Style=Coll"}, + "PWNP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Plur|PronType=Neg"}, + "PWNP4---------6": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Plur|PronType=Neg|Style=Coll"}, + "PWNP5----------": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Plur|PronType=Neg"}, + "PWNP5---------6": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Plur|PronType=Neg|Style=Coll"}, + "PWNS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Neg"}, + "PWNS1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Neg|Style=Coll"}, + "PWNS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Neg"}, + "PWNS4---------6": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Neg|Style=Coll"}, + "PWNS5----------": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Sing|PronType=Neg"}, + "PWNS5---------6": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Sing|PronType=Neg|Style=Coll"}, + "PW--X----------": {POS: PRON, "morph": "PronType=Neg"}, + "PWXP2----------": {POS: PRON, "morph": "Case=Gen|Number=Plur|PronType=Neg"}, + "PWXP2---------6": {POS: PRON, "morph": "Case=Gen|Number=Plur|PronType=Neg|Style=Coll"}, + "PWXP3----------": {POS: PRON, "morph": "Case=Dat|Number=Plur|PronType=Neg"}, + "PWXP3---------6": {POS: PRON, "morph": "Case=Dat|Number=Plur|PronType=Neg|Style=Coll"}, + "PWXP6----------": {POS: PRON, "morph": "Case=Loc|Number=Plur|PronType=Neg"}, + "PWXP6---------6": {POS: PRON, "morph": "Case=Loc|Number=Plur|PronType=Neg|Style=Coll"}, + "PWXP7----------": {POS: PRON, "morph": "Case=Ins|Number=Plur|PronType=Neg"}, + "PWXP7---------6": {POS: PRON, "morph": "Case=Ins|Number=Plur|PronType=Neg|Style=Coll"}, + "PWXP7---------7": {POS: PRON, "morph": "Case=Ins|Number=Plur|PronType=Neg|Style=Coll"}, + "PWYP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Masc|Number=Plur|PronType=Neg"}, + "PWYP4---------6": {POS: PRON, "morph": "Case=Acc|Gender=Masc|Number=Plur|PronType=Neg|Style=Coll"}, + "PWYS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Neg"}, + "PWYS1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Neg|Style=Coll"}, + "PWYS5----------": {POS: PRON, "morph": "Case=Voc|Gender=Masc|Number=Sing|PronType=Neg"}, + "PWYS5---------6": {POS: PRON, "morph": "Case=Voc|Gender=Masc|Number=Sing|PronType=Neg|Style=Coll"}, + "PWZS2----------": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PronType=Neg"}, + "PWZS2---------6": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PronType=Neg|Style=Coll"}, + "PWZS3----------": {POS: PRON, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PronType=Neg"}, + "PWZS3---------6": {POS: PRON, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PronType=Neg|Style=Coll"}, + "PWZS6----------": {POS: PRON, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Neg"}, + "PWZS6---------6": {POS: PRON, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Neg|Style=Coll"}, + "PWZS6---------7": {POS: PRON, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Neg|Style=Coll"}, + "PWZS7----------": {POS: PRON, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PronType=Neg"}, + "PWZS7---------6": {POS: PRON, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PronType=Neg|Style=Coll"}, + "PY-------------": {POS: PRON, "morph": "AdpType=Preppron|PronType=Int,Rel"}, + "PZ--1----------": {POS: PRON, "morph": "Case=Nom|PronType=Ind"}, + "PZ--1---------1": {POS: PRON, "morph": "Case=Nom|PronType=Ind"}, + "PZ--1---------2": {POS: PRON, "morph": "Case=Nom|PronType=Ind|Style=Arch"}, + "PZ--1---------4": {POS: PRON, "morph": "Case=Nom|PronType=Ind|Style=Arch"}, + "PZ--2----------": {POS: PRON, "morph": "Case=Gen|PronType=Ind"}, + "PZ--2---------1": {POS: PRON, "morph": "Case=Gen|PronType=Ind"}, + "PZ--2---------2": {POS: PRON, "morph": "Case=Gen|PronType=Ind|Style=Arch"}, + "PZ--3----------": {POS: PRON, "morph": "Case=Dat|PronType=Ind"}, + "PZ--3---------1": {POS: PRON, "morph": "Case=Dat|PronType=Ind"}, + "PZ--3---------2": {POS: PRON, "morph": "Case=Dat|PronType=Ind|Style=Arch"}, + "PZ--4----------": {POS: PRON, "morph": "Case=Acc|PronType=Ind"}, + "PZ--4---------1": {POS: PRON, "morph": "Case=Acc|PronType=Ind"}, + "PZ--4---------2": {POS: PRON, "morph": "Case=Acc|PronType=Ind|Style=Arch"}, + "PZ--4---------4": {POS: PRON, "morph": "Case=Acc|PronType=Ind|Style=Arch"}, + "PZ--5----------": {POS: PRON, "morph": "Case=Voc|PronType=Ind"}, + "PZ--5---------1": {POS: PRON, "morph": "Case=Voc|PronType=Ind"}, + "PZ--5---------2": {POS: PRON, "morph": "Case=Voc|PronType=Ind|Style=Arch"}, + "PZ--6----------": {POS: PRON, "morph": "Case=Loc|PronType=Ind"}, + "PZ--6---------1": {POS: PRON, "morph": "Case=Loc|PronType=Ind"}, + "PZ--6---------2": {POS: PRON, "morph": "Case=Loc|PronType=Ind|Style=Arch"}, + "PZ--7----------": {POS: PRON, "morph": "Case=Ins|PronType=Ind"}, + "PZ--7---------1": {POS: PRON, "morph": "Case=Ins|PronType=Ind"}, + "PZ--7---------2": {POS: PRON, "morph": "Case=Ins|PronType=Ind|Style=Arch"}, + "PZFD7----------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Ind"}, + "PZFD7---------1": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Ind"}, + "PZFD7---------6": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Dual|PronType=Ind|Style=Coll"}, + "PZFP1----------": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Ind"}, + "PZFP1---------1": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Ind"}, + "PZFP1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Plur|PronType=Ind|Style=Coll"}, + "PZFP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Plur|PronType=Ind"}, + "PZFP4---------1": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Plur|PronType=Ind"}, + "PZFP4---------6": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Plur|PronType=Ind|Style=Coll"}, + "PZFP5----------": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Plur|PronType=Ind"}, + "PZFP5---------1": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Plur|PronType=Ind"}, + "PZFP5---------6": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Plur|PronType=Ind|Style=Coll"}, + "PZFS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS1---------1": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Fem|Number=Sing|PronType=Ind|Style=Coll"}, + "PZFS2----------": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS2---------1": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS2---------6": {POS: PRON, "morph": "Case=Gen|Gender=Fem|Number=Sing|PronType=Ind|Style=Coll"}, + "PZFS3----------": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS3---------1": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS3---------6": {POS: PRON, "morph": "Case=Dat|Gender=Fem|Number=Sing|PronType=Ind|Style=Coll"}, + "PZFS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS4---------1": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS4---------6": {POS: PRON, "morph": "Case=Acc|Gender=Fem|Number=Sing|PronType=Ind|Style=Coll"}, + "PZFS5----------": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS5---------1": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS5---------6": {POS: PRON, "morph": "Case=Voc|Gender=Fem|Number=Sing|PronType=Ind|Style=Coll"}, + "PZFS6----------": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS6---------1": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS6---------6": {POS: PRON, "morph": "Case=Loc|Gender=Fem|Number=Sing|PronType=Ind|Style=Coll"}, + "PZFS7----------": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS7---------1": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Sing|PronType=Ind"}, + "PZFS7---------6": {POS: PRON, "morph": "Case=Ins|Gender=Fem|Number=Sing|PronType=Ind|Style=Coll"}, + "PZIP1----------": {POS: PRON, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Ind"}, + "PZIP1---------1": {POS: PRON, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Ind"}, + "PZIP1---------6": {POS: PRON, "morph": "Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Ind|Style=Coll"}, + "PZIP5----------": {POS: PRON, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|PronType=Ind"}, + "PZIP5---------1": {POS: PRON, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|PronType=Ind"}, + "PZIP5---------6": {POS: PRON, "morph": "Animacy=Inan|Case=Voc|Gender=Masc|Number=Plur|PronType=Ind|Style=Coll"}, + "PZIS4----------": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Ind"}, + "PZIS4---------1": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Ind"}, + "PZIS4---------6": {POS: PRON, "morph": "Animacy=Inan|Case=Acc|Gender=Masc|Number=Sing|PronType=Ind|Style=Coll"}, + "PZIS6---------7": {POS: PRON, "morph": "Animacy=Inan|Case=Loc|Gender=Masc|Number=Sing|PronType=Ind|Style=Coll"}, + "PZM-1----------": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|PronType=Ind"}, + "PZM-1---------1": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|PronType=Ind"}, + "PZM-2----------": {POS: PRON, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|PronType=Ind"}, + "PZM-2---------1": {POS: PRON, "morph": "Animacy=Anim|Case=Gen|Gender=Masc|PronType=Ind"}, + "PZM-3----------": {POS: PRON, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|PronType=Ind"}, + "PZM-3---------1": {POS: PRON, "morph": "Animacy=Anim|Case=Dat|Gender=Masc|PronType=Ind"}, + "PZM-4----------": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|PronType=Ind"}, + "PZM-4---------1": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|PronType=Ind"}, + "PZM-5----------": {POS: PRON, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|PronType=Ind"}, + "PZM-5---------1": {POS: PRON, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|PronType=Ind"}, + "PZM-6----------": {POS: PRON, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|PronType=Ind"}, + "PZM-6---------1": {POS: PRON, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|PronType=Ind"}, + "PZM-7----------": {POS: PRON, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|PronType=Ind"}, + "PZM-7---------1": {POS: PRON, "morph": "Animacy=Anim|Case=Ins|Gender=Masc|PronType=Ind"}, + "PZMP1----------": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Ind"}, + "PZMP1---------1": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Ind"}, + "PZMP1---------6": {POS: PRON, "morph": "Animacy=Anim|Case=Nom|Gender=Masc|Number=Plur|PronType=Ind|Style=Coll"}, + "PZMP5----------": {POS: PRON, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|PronType=Ind"}, + "PZMP5---------1": {POS: PRON, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|PronType=Ind"}, + "PZMP5---------6": {POS: PRON, "morph": "Animacy=Anim|Case=Voc|Gender=Masc|Number=Plur|PronType=Ind|Style=Coll"}, + "PZMS4----------": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Ind"}, + "PZMS4---------1": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Ind"}, + "PZMS4---------6": {POS: PRON, "morph": "Animacy=Anim|Case=Acc|Gender=Masc|Number=Sing|PronType=Ind|Style=Coll"}, + "PZMS6---------7": {POS: PRON, "morph": "Animacy=Anim|Case=Loc|Gender=Masc|Number=Sing|PronType=Ind|Style=Coll"}, + "PZNP1----------": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Ind"}, + "PZNP1---------1": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Ind"}, + "PZNP1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Plur|PronType=Ind|Style=Coll"}, + "PZNP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Plur|PronType=Ind"}, + "PZNP4---------1": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Plur|PronType=Ind"}, + "PZNP4---------6": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Plur|PronType=Ind|Style=Coll"}, + "PZNP5----------": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Plur|PronType=Ind"}, + "PZNP5---------1": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Plur|PronType=Ind"}, + "PZNP5---------6": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Plur|PronType=Ind|Style=Coll"}, + "PZNS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Ind"}, + "PZNS1---------1": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Ind"}, + "PZNS1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Neut|Number=Sing|PronType=Ind|Style=Coll"}, + "PZNS4----------": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Ind"}, + "PZNS4---------1": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Ind"}, + "PZNS4---------6": {POS: PRON, "morph": "Case=Acc|Gender=Neut|Number=Sing|PronType=Ind|Style=Coll"}, + "PZNS5----------": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Sing|PronType=Ind"}, + "PZNS5---------1": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Sing|PronType=Ind"}, + "PZNS5---------6": {POS: PRON, "morph": "Case=Voc|Gender=Neut|Number=Sing|PronType=Ind|Style=Coll"}, + "PZNS6---------7": {POS: PRON, "morph": "Case=Loc|Gender=Neut|Number=Sing|PronType=Ind|Style=Coll"}, + "PZXP2----------": {POS: PRON, "morph": "Case=Gen|Number=Plur|PronType=Ind"}, + "PZXP2---------1": {POS: PRON, "morph": "Case=Gen|Number=Plur|PronType=Ind"}, + "PZXP2---------6": {POS: PRON, "morph": "Case=Gen|Number=Plur|PronType=Ind|Style=Coll"}, + "PZXP3----------": {POS: PRON, "morph": "Case=Dat|Number=Plur|PronType=Ind"}, + "PZXP3---------1": {POS: PRON, "morph": "Case=Dat|Number=Plur|PronType=Ind"}, + "PZXP3---------6": {POS: PRON, "morph": "Case=Dat|Number=Plur|PronType=Ind|Style=Coll"}, + "PZXP6----------": {POS: PRON, "morph": "Case=Loc|Number=Plur|PronType=Ind"}, + "PZXP6---------1": {POS: PRON, "morph": "Case=Loc|Number=Plur|PronType=Ind"}, + "PZXP6---------6": {POS: PRON, "morph": "Case=Loc|Number=Plur|PronType=Ind|Style=Coll"}, + "PZXP7----------": {POS: PRON, "morph": "Case=Ins|Number=Plur|PronType=Ind"}, + "PZXP7---------1": {POS: PRON, "morph": "Case=Ins|Number=Plur|PronType=Ind"}, + "PZXP7---------6": {POS: PRON, "morph": "Case=Ins|Number=Plur|PronType=Ind|Style=Coll"}, + "PZXP7---------7": {POS: PRON, "morph": "Case=Ins|Number=Plur|PronType=Ind|Style=Coll"}, + "PZXXX----------": {POS: PRON, "morph": "PronType=Ind"}, + "PZYP4----------": {POS: PRON, "morph": "Case=Acc|Gender=Masc|Number=Plur|PronType=Ind"}, + "PZYP4---------1": {POS: PRON, "morph": "Case=Acc|Gender=Masc|Number=Plur|PronType=Ind"}, + "PZYP4---------6": {POS: PRON, "morph": "Case=Acc|Gender=Masc|Number=Plur|PronType=Ind|Style=Coll"}, + "PZYS1----------": {POS: PRON, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Ind"}, + "PZYS1---------1": {POS: PRON, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Ind"}, + "PZYS1---------6": {POS: PRON, "morph": "Case=Nom|Gender=Masc|Number=Sing|PronType=Ind|Style=Coll"}, + "PZYS2----------": {POS: PRON, "morph": "Case=Gen|Gender=Masc|Number=Sing|PronType=Ind"}, + "PZYS3----------": {POS: PRON, "morph": "Case=Dat|Gender=Masc|Number=Sing|PronType=Ind"}, + "PZYS5----------": {POS: PRON, "morph": "Case=Voc|Gender=Masc|Number=Sing|PronType=Ind"}, + "PZYS5---------1": {POS: PRON, "morph": "Case=Voc|Gender=Masc|Number=Sing|PronType=Ind"}, + "PZYS5---------6": {POS: PRON, "morph": "Case=Voc|Gender=Masc|Number=Sing|PronType=Ind|Style=Coll"}, + "PZZS2----------": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PronType=Ind"}, + "PZZS2---------1": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PronType=Ind"}, + "PZZS2---------6": {POS: PRON, "morph": "Case=Gen|Gender=Masc,Neut|Number=Sing|PronType=Ind|Style=Coll"}, + "PZZS3----------": {POS: PRON, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PronType=Ind"}, + "PZZS3---------1": {POS: PRON, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PronType=Ind"}, + "PZZS3---------6": {POS: PRON, "morph": "Case=Dat|Gender=Masc,Neut|Number=Sing|PronType=Ind|Style=Coll"}, + "PZZS6----------": {POS: PRON, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Ind"}, + "PZZS6---------1": {POS: PRON, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Ind"}, + "PZZS6---------6": {POS: PRON, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Ind|Style=Coll"}, + "PZZS6---------7": {POS: PRON, "morph": "Case=Loc|Gender=Masc,Neut|Number=Sing|PronType=Ind|Style=Coll"}, + "PZZS7----------": {POS: PRON, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PronType=Ind"}, + "PZZS7---------1": {POS: PRON, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PronType=Ind"}, + "PZZS7---------6": {POS: PRON, "morph": "Case=Ins|Gender=Masc,Neut|Number=Sing|PronType=Ind|Style=Coll"}, + "RF-------------": {POS: ADP, "morph": "AdpType=Comprep"}, + "RR--1----------": {POS: ADP, "morph": "AdpType=Prep|Case=Nom"}, + "RR--1---------8": {POS: ADP, "morph": "Abbr=Yes|AdpType=Prep|Case=Nom"}, + "RR--2----------": {POS: ADP, "morph": "AdpType=Prep|Case=Gen"}, + "RR--2---------1": {POS: ADP, "morph": "AdpType=Prep|Case=Gen"}, + "RR--2---------3": {POS: ADP, "morph": "AdpType=Prep|Case=Gen|Style=Arch"}, + "RR--2---------8": {POS: ADP, "morph": "Abbr=Yes|AdpType=Prep|Case=Gen"}, + "RR--3----------": {POS: ADP, "morph": "AdpType=Prep|Case=Dat"}, + "RR--3---------8": {POS: ADP, "morph": "Abbr=Yes|AdpType=Prep|Case=Dat"}, + "RR--4----------": {POS: ADP, "morph": "AdpType=Prep|Case=Acc"}, + "RR--4---------8": {POS: ADP, "morph": "Abbr=Yes|AdpType=Prep|Case=Acc"}, + "RR--6----------": {POS: ADP, "morph": "AdpType=Prep|Case=Loc"}, + "RR--7----------": {POS: ADP, "morph": "AdpType=Prep|Case=Ins"}, + "RR--7---------8": {POS: ADP, "morph": "Abbr=Yes|AdpType=Prep|Case=Ins"}, + "RR--X----------": {POS: ADP, "morph": "AdpType=Prep"}, + "RR--X---------8": {POS: ADP, "morph": "Abbr=Yes|AdpType=Prep"}, + "RV--1----------": {POS: ADP, "morph": "AdpType=Voc|Case=Nom"}, + "RV--2----------": {POS: ADP, "morph": "AdpType=Voc|Case=Gen"}, + "RV--2---------1": {POS: ADP, "morph": "AdpType=Voc|Case=Gen"}, + "RV--3----------": {POS: ADP, "morph": "AdpType=Voc|Case=Dat"}, + "RV--3---------1": {POS: ADP, "morph": "AdpType=Voc|Case=Dat"}, + "RV--4----------": {POS: ADP, "morph": "AdpType=Voc|Case=Acc"}, + "RV--4---------1": {POS: ADP, "morph": "AdpType=Voc|Case=Acc"}, + "RV--6----------": {POS: ADP, "morph": "AdpType=Voc|Case=Loc"}, + "RV--7----------": {POS: ADP, "morph": "AdpType=Voc|Case=Ins"}, + "TT-------------": {POS: PART, "morph": "_"}, + "TT------------1": {POS: PART, "morph": "_"}, + "TT------------8": {POS: PART, "morph": "Abbr=Yes"}, + "V~-------------": {POS: VERB, "morph": "Abbr=Yes"}, + "VB-P---1F-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---1F-AA--6": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---1F-AA--7": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---1F-AA--8": {POS: VERB,"morph": "Abbr=Yes|Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---1F-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---1F-NA--6": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---1F-NA--7": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---1F-NA--8": {POS: VERB,"morph": "Abbr=Yes|Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-AA--1": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-AA--6": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-AA--7": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-NA--1": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-NA--6": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---1P-NA--7": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---2F-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Pos|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---2F-AA--7": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Pos|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---2F-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Neg|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---2F-NA--7": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Neg|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---2P-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---2P-AA--1": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---2P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---2P-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---2P-AA--6": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---2P-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---2P-NA--1": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---2P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---2P-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---2P-NA--6": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3F-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---3F-AA--1": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---3F-AA--7": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---3F-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---3F-NA--1": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---3F-NA--7": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-AA--1": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-AA--4": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-AA--5": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-AA--6": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-AA--7": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-NA--1": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-NA--4": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-NA--5": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-NA--6": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-P---3P-NA--7": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1F-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---1F-AA--1": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---1F-AA--7": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---1F-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---1F-NA--1": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---1F-NA--7": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-AA--1": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-AA--4": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-AA--6": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-AA--7": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-NA--1": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-NA--4": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---1P-NA--6": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---2F-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Pos|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---2F-AA--7": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Pos|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---2F-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Neg|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---2F-NA--7": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Neg|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---2P-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---2P-AA--1": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---2P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---2P-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---2P-AA--6": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---2P-AA--7": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---2P-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---2P-NA--1": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---2P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---2P-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---2P-NA--6": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3F-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---3F-AA--7": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---3F-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---3F-NA--7": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Style=Coll|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-AA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-AA--1": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-AA--4": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-AA--5": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-AA--6": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-AA--7": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-AA--8": {POS: VERB,"morph": "Abbr=Yes|Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-NA---": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-NA--1": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-NA--4": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-NA--5": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-NA--6": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-S---3P-NA--7": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Style=Coll|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-X---XF-AA---": {POS: VERB, "morph": "Mood=Ind|Polarity=Pos|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-X---XF-NA---": {POS: VERB, "morph": "Mood=Ind|Polarity=Neg|Tense=Fut|VerbForm=Fin|Voice=Act"}, + "VB-X---XP-AA---": {POS: VERB, "morph": "Mood=Ind|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "VB-X---XP-NA---": {POS: VERB, "morph": "Mood=Ind|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act"}, + "Vc-P---1-------": {POS: VERB, "morph": "Mood=Cnd|Number=Plur|Person=1|VerbForm=Fin"}, + "Vc-P---1------6": {POS: VERB, "morph": "Mood=Cnd|Number=Plur|Person=1|Style=Coll|VerbForm=Fin"}, + "Vc-P---2-------": {POS: VERB, "morph": "Mood=Cnd|Number=Plur|Person=2|VerbForm=Fin"}, + "Vc-S---1-------": {POS: VERB, "morph": "Mood=Cnd|Number=Sing|Person=1|VerbForm=Fin"}, + "Vc-S---1------6": {POS: VERB, "morph": "Mood=Cnd|Number=Sing|Person=1|Style=Coll|VerbForm=Fin"}, + "Vc-S---2-------": {POS: VERB, "morph": "Mood=Cnd|Number=Sing|Person=2|VerbForm=Fin"}, + "Vc-X---3-------": {POS: VERB, "morph": "Mood=Cnd|Person=3|VerbForm=Fin"}, + "VeHS------A----": {POS: VERB,"morph": "Aspect=Imp|Gender=Fem,Neut|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Conv|Voice=Act"}, + "VeHS------A---2": {POS: VERB,"morph": "Aspect=Imp|Gender=Fem,Neut|Number=Sing|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Conv|Voice=Act"}, + "VeHS------N----": {POS: VERB,"morph": "Aspect=Imp|Gender=Fem,Neut|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Conv|Voice=Act"}, + "VeHS------N---2": {POS: VERB,"morph": "Aspect=Imp|Gender=Fem,Neut|Number=Sing|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Conv|Voice=Act"}, + "VeXP------A----": {POS: VERB, "morph": "Aspect=Imp|Number=Plur|Polarity=Pos|Tense=Pres|VerbForm=Conv|Voice=Act"}, + "VeXP------A---2": {POS: VERB,"morph": "Aspect=Imp|Number=Plur|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Conv|Voice=Act"}, + "VeXP------N----": {POS: VERB, "morph": "Aspect=Imp|Number=Plur|Polarity=Neg|Tense=Pres|VerbForm=Conv|Voice=Act"}, + "VeXP------N---2": {POS: VERB,"morph": "Aspect=Imp|Number=Plur|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Conv|Voice=Act"}, + "VeYS------A----": {POS: VERB,"morph": "Aspect=Imp|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Pres|VerbForm=Conv|Voice=Act"}, + "VeYS------N----": {POS: VERB,"morph": "Aspect=Imp|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Pres|VerbForm=Conv|Voice=Act"}, + "Vf--------A----": {POS: VERB, "morph": "Polarity=Pos|VerbForm=Inf"}, + "Vf--------A---1": {POS: VERB, "morph": "Polarity=Pos|VerbForm=Inf"}, + "Vf--------A---2": {POS: VERB, "morph": "Polarity=Pos|Style=Arch|VerbForm=Inf"}, + "Vf--------A---3": {POS: VERB, "morph": "Polarity=Pos|Style=Arch|VerbForm=Inf"}, + "Vf--------A---4": {POS: VERB, "morph": "Polarity=Pos|Style=Arch|VerbForm=Inf"}, + "Vf--------A---6": {POS: VERB, "morph": "Polarity=Pos|Style=Coll|VerbForm=Inf"}, + "Vf--------A---8": {POS: VERB, "morph": "Abbr=Yes|Polarity=Pos|VerbForm=Inf"}, + "Vf--------N----": {POS: VERB, "morph": "Polarity=Neg|VerbForm=Inf"}, + "Vf--------N---1": {POS: VERB, "morph": "Polarity=Neg|VerbForm=Inf"}, + "Vf--------N---2": {POS: VERB, "morph": "Polarity=Neg|Style=Arch|VerbForm=Inf"}, + "Vf--------N---3": {POS: VERB, "morph": "Polarity=Neg|Style=Arch|VerbForm=Inf"}, + "Vf--------N---4": {POS: VERB, "morph": "Polarity=Neg|Style=Arch|VerbForm=Inf"}, + "Vf--------N---6": {POS: VERB, "morph": "Polarity=Neg|Style=Coll|VerbForm=Inf"}, + "Vi-P---1--A----": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=1|Polarity=Pos|VerbForm=Fin"}, + "Vi-P---1--A---1": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=1|Polarity=Pos|VerbForm=Fin"}, + "Vi-P---1--A---2": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=1|Polarity=Pos|Style=Arch|VerbForm=Fin"}, + "Vi-P---1--A---3": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=1|Polarity=Pos|Style=Arch|VerbForm=Fin"}, + "Vi-P---1--A---6": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=1|Polarity=Pos|Style=Coll|VerbForm=Fin"}, + "Vi-P---1--N----": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=1|Polarity=Neg|VerbForm=Fin"}, + "Vi-P---1--N---1": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=1|Polarity=Neg|VerbForm=Fin"}, + "Vi-P---1--N---2": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=1|Polarity=Neg|Style=Arch|VerbForm=Fin"}, + "Vi-P---1--N---3": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=1|Polarity=Neg|Style=Arch|VerbForm=Fin"}, + "Vi-P---1--N---6": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=1|Polarity=Neg|Style=Coll|VerbForm=Fin"}, + "Vi-P---2--A----": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Pos|VerbForm=Fin"}, + "Vi-P---2--A---1": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Pos|VerbForm=Fin"}, + "Vi-P---2--A---2": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Pos|Style=Arch|VerbForm=Fin"}, + "Vi-P---2--A---3": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Pos|Style=Arch|VerbForm=Fin"}, + "Vi-P---2--A---6": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Pos|Style=Coll|VerbForm=Fin"}, + "Vi-P---2--A---7": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Pos|Style=Coll|VerbForm=Fin"}, + "Vi-P---2--N----": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Neg|VerbForm=Fin"}, + "Vi-P---2--N---1": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Neg|VerbForm=Fin"}, + "Vi-P---2--N---2": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Neg|Style=Arch|VerbForm=Fin"}, + "Vi-P---2--N---3": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Neg|Style=Arch|VerbForm=Fin"}, + "Vi-P---2--N---6": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Neg|Style=Coll|VerbForm=Fin"}, + "Vi-P---2--N---7": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=2|Polarity=Neg|Style=Coll|VerbForm=Fin"}, + "Vi-P---3--A---1": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=3|Polarity=Pos|VerbForm=Fin"}, + "Vi-P---3--A---2": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=3|Polarity=Pos|Style=Arch|VerbForm=Fin"}, + "Vi-P---3--A---3": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=3|Polarity=Pos|Style=Arch|VerbForm=Fin"}, + "Vi-P---3--A---4": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=3|Polarity=Pos|Style=Arch|VerbForm=Fin"}, + "Vi-P---3--A---9": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=3|Polarity=Pos|VerbForm=Fin"}, + "Vi-P---3--N---1": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=3|Polarity=Neg|VerbForm=Fin"}, + "Vi-P---3--N---2": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=3|Polarity=Neg|Style=Arch|VerbForm=Fin"}, + "Vi-P---3--N---3": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=3|Polarity=Neg|Style=Arch|VerbForm=Fin"}, + "Vi-P---3--N---4": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=3|Polarity=Neg|Style=Arch|VerbForm=Fin"}, + "Vi-P---3--N---9": {POS: VERB, "morph": "Mood=Imp|Number=Plur|Person=3|Polarity=Neg|VerbForm=Fin"}, + "Vi-S---2--A----": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=2|Polarity=Pos|VerbForm=Fin"}, + "Vi-S---2--A---1": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=2|Polarity=Pos|VerbForm=Fin"}, + "Vi-S---2--A---2": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=2|Polarity=Pos|Style=Arch|VerbForm=Fin"}, + "Vi-S---2--A---6": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=2|Polarity=Pos|Style=Coll|VerbForm=Fin"}, + "Vi-S---2--A---7": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=2|Polarity=Pos|Style=Coll|VerbForm=Fin"}, + "Vi-S---2--A---8": {POS: VERB, "morph": "Abbr=Yes|Mood=Imp|Number=Sing|Person=2|Polarity=Pos|VerbForm=Fin"}, + "Vi-S---2--N----": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=2|Polarity=Neg|VerbForm=Fin"}, + "Vi-S---2--N---1": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=2|Polarity=Neg|VerbForm=Fin"}, + "Vi-S---2--N---2": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=2|Polarity=Neg|Style=Arch|VerbForm=Fin"}, + "Vi-S---2--N---6": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=2|Polarity=Neg|Style=Coll|VerbForm=Fin"}, + "Vi-S---2--N---7": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=2|Polarity=Neg|Style=Coll|VerbForm=Fin"}, + "Vi-S---3--A----": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=3|Polarity=Pos|VerbForm=Fin"}, + "Vi-S---3--A---2": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=3|Polarity=Pos|Style=Arch|VerbForm=Fin"}, + "Vi-S---3--A---3": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=3|Polarity=Pos|Style=Arch|VerbForm=Fin"}, + "Vi-S---3--A---4": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=3|Polarity=Pos|Style=Arch|VerbForm=Fin"}, + "Vi-S---3--A---9": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=3|Polarity=Pos|VerbForm=Fin"}, + "Vi-S---3--N----": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=3|Polarity=Neg|VerbForm=Fin"}, + "Vi-S---3--N---2": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=3|Polarity=Neg|Style=Arch|VerbForm=Fin"}, + "Vi-S---3--N---3": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=3|Polarity=Neg|Style=Arch|VerbForm=Fin"}, + "Vi-S---3--N---4": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=3|Polarity=Neg|Style=Arch|VerbForm=Fin"}, + "Vi-S---3--N---9": {POS: VERB, "morph": "Mood=Imp|Number=Sing|Person=3|Polarity=Neg|VerbForm=Fin"}, + "Vi-X---2--A----": {POS: VERB, "morph": "Mood=Imp|Person=2|Polarity=Pos|VerbForm=Fin"}, + "Vi-X---2--N----": {POS: VERB, "morph": "Mood=Imp|Person=2|Polarity=Neg|VerbForm=Fin"}, + "VmHS------A----": {POS: VERB,"morph": "Aspect=Perf|Gender=Fem,Neut|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VmHS------A---4": {POS: VERB,"morph": "Aspect=Perf|Gender=Fem,Neut|Number=Sing|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VmHS------N----": {POS: VERB,"morph": "Aspect=Perf|Gender=Fem,Neut|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VmHS------N---4": {POS: VERB,"morph": "Aspect=Perf|Gender=Fem,Neut|Number=Sing|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VmXP------A----": {POS: VERB, "morph": "Aspect=Perf|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VmXP------A---4": {POS: VERB,"morph": "Aspect=Perf|Number=Plur|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VmXP------N----": {POS: VERB, "morph": "Aspect=Perf|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VmXP------N---4": {POS: VERB,"morph": "Aspect=Perf|Number=Plur|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VmYS------A----": {POS: VERB,"morph": "Aspect=Perf|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VmYS------A---4": {POS: VERB,"morph": "Aspect=Perf|Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VmYS------N----": {POS: VERB,"morph": "Aspect=Perf|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VmYS------N---4": {POS: VERB,"morph": "Aspect=Perf|Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Conv|Voice=Act"}, + "VpFS---2R-AA---": {POS: VERB,"morph": "Gender=Fem|Number=Sing|Person=2|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpFS---2R-AA--1": {POS: VERB,"morph": "Gender=Fem|Number=Sing|Person=2|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpFS---2R-AA--6": {POS: VERB,"morph": "Gender=Fem|Number=Sing|Person=2|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpFS---2R-NA---": {POS: VERB,"morph": "Gender=Fem|Number=Sing|Person=2|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpFS---2R-NA--1": {POS: VERB,"morph": "Gender=Fem|Number=Sing|Person=2|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpFS---2R-NA--6": {POS: VERB,"morph": "Gender=Fem|Number=Sing|Person=2|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpMP---XR-AA---": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpMP---XR-AA--1": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpMP---XR-AA--3": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpMP---XR-AA--6": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpMP---XR-NA---": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpMP---XR-NA--1": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpMP---XR-NA--3": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpMP---XR-NA--6": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---2R-AA---": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Person=2|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---2R-AA--1": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Person=2|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---2R-AA--6": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Person=2|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---2R-NA---": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Person=2|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---2R-NA--1": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Person=2|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---2R-NA--6": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Person=2|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---XR-AA---": {POS: VERB, "morph": "Gender=Neut|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---XR-AA--1": {POS: VERB, "morph": "Gender=Neut|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---XR-AA--3": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---XR-AA--6": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---XR-NA---": {POS: VERB, "morph": "Gender=Neut|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---XR-NA--1": {POS: VERB, "morph": "Gender=Neut|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---XR-NA--3": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpNS---XR-NA--6": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpQW---XR-AA---": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpQW---XR-AA--1": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpQW---XR-AA--3": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpQW---XR-AA--6": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpQW---XR-NA---": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpQW---XR-NA--1": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpQW---XR-NA--3": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpQW---XR-NA--6": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpTP---XR-AA---": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpTP---XR-AA--1": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpTP---XR-AA--3": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpTP---XR-AA--6": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpTP---XR-NA---": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpTP---XR-NA--1": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpTP---XR-NA--3": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpTP---XR-NA--6": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpXP---XR-AA---": {POS: VERB, "morph": "Number=Plur|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpXP---XR-NA---": {POS: VERB, "morph": "Number=Plur|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpXS---XR-AA---": {POS: VERB, "morph": "Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpXS---XR-NA---": {POS: VERB, "morph": "Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpXX---XR-AA---": {POS: VERB, "morph": "Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpXX---XR-NA---": {POS: VERB, "morph": "Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---2R-AA---": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Person=2|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---2R-AA--1": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Person=2|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---2R-AA--6": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Person=2|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---2R-NA---": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Person=2|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---2R-NA--1": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Person=2|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---2R-NA--6": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Person=2|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---XR-AA---": {POS: VERB, "morph": "Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---XR-AA--1": {POS: VERB, "morph": "Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---XR-AA--6": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---XR-AA--8": {POS: VERB,"morph": "Abbr=Yes|Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---XR-AA--9": {POS: VERB, "morph": "Gender=Masc|Number=Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---XR-NA---": {POS: VERB, "morph": "Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---XR-NA--1": {POS: VERB, "morph": "Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---XR-NA--6": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|Voice=Act"}, + "VpYS---XR-NA--8": {POS: VERB,"morph": "Abbr=Yes|Gender=Masc|Number=Sing|Polarity=Neg|Tense=Past|VerbForm=Part|Voice=Act"}, + "VqMP---XR-AA--2": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqMP---XR-AA--3": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqMP---XR-AA--7": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqMP---XR-NA--2": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqMP---XR-NA--3": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqMP---XR-NA--7": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqNS---XR-AA--2": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqNS---XR-AA--3": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqNS---XR-AA--7": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqNS---XR-NA--2": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqNS---XR-NA--3": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqNS---XR-NA--7": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqQW---XR-AA--2": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqQW---XR-AA--3": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqQW---XR-AA--7": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqQW---XR-NA--2": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqQW---XR-NA--3": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqQW---XR-NA--7": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqTP---XR-AA--2": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqTP---XR-AA--3": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqTP---XR-AA--7": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqTP---XR-NA--2": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqTP---XR-NA--3": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqTP---XR-NA--7": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqYS---XR-AA--2": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqYS---XR-AA--3": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqYS---XR-AA--7": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Polarity=Pos|Style=Coll|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqYS---XR-NA--2": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqYS---XR-NA--3": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VqYS---XR-NA--7": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Polarity=Neg|Style=Coll|Tense=Past|VerbForm=Part|VerbType=Verbconj|Voice=Act"}, + "VsFS---2H-AP---": {POS: VERB,"morph": "Gender=Fem|Number=Sing|Person=2|Polarity=Pos|Tense=Past,Pres|VerbForm=Part|Voice=Pass"}, + "VsFS---2H-AP--2": {POS: VERB,"morph": "Gender=Fem|Number=Sing|Person=2|Polarity=Pos|Style=Arch|Tense=Past,Pres|VerbForm=Part|Voice=Pass"}, + "VsFS---2H-NP---": {POS: VERB,"morph": "Gender=Fem|Number=Sing|Person=2|Polarity=Neg|Tense=Past,Pres|VerbForm=Part|Voice=Pass"}, + "VsFS---2H-NP--2": {POS: VERB,"morph": "Gender=Fem|Number=Sing|Person=2|Polarity=Neg|Style=Arch|Tense=Past,Pres|VerbForm=Part|Voice=Pass"}, + "VsFS4--XX-AP---": {POS: VERB, "morph": "Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos|VerbForm=Part|Voice=Pass"}, + "VsFS4--XX-AP--2": {POS: VERB,"morph": "Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos|Style=Arch|VerbForm=Part|Voice=Pass"}, + "VsFS4--XX-NP---": {POS: VERB, "morph": "Case=Acc|Gender=Fem|Number=Sing|Polarity=Neg|VerbForm=Part|Voice=Pass"}, + "VsFS4--XX-NP--2": {POS: VERB,"morph": "Case=Acc|Gender=Fem|Number=Sing|Polarity=Neg|Style=Arch|VerbForm=Part|Voice=Pass"}, + "VsMP---XX-AP---": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos|VerbForm=Part|Voice=Pass"}, + "VsMP---XX-AP--2": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Pos|Style=Arch|VerbForm=Part|Voice=Pass"}, + "VsMP---XX-NP---": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg|VerbForm=Part|Voice=Pass"}, + "VsMP---XX-NP--2": {POS: VERB,"morph": "Animacy=Anim|Gender=Masc|Number=Plur|Polarity=Neg|Style=Arch|VerbForm=Part|Voice=Pass"}, + "VsNS---2H-AP---": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Person=2|Polarity=Pos|Tense=Past,Pres|VerbForm=Part|Voice=Pass"}, + "VsNS---2H-AP--2": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Person=2|Polarity=Pos|Style=Arch|Tense=Past,Pres|VerbForm=Part|Voice=Pass"}, + "VsNS---2H-NP---": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Person=2|Polarity=Neg|Tense=Past,Pres|VerbForm=Part|Voice=Pass"}, + "VsNS---2H-NP--2": {POS: VERB,"morph": "Gender=Neut|Number=Sing|Person=2|Polarity=Neg|Style=Arch|Tense=Past,Pres|VerbForm=Part|Voice=Pass"}, + "VsNS---XX-AP---": {POS: VERB, "morph": "Gender=Neut|Number=Sing|Polarity=Pos|VerbForm=Part|Voice=Pass"}, + "VsNS---XX-AP--2": {POS: VERB, "morph": "Gender=Neut|Number=Sing|Polarity=Pos|Style=Arch|VerbForm=Part|Voice=Pass"}, + "VsNS---XX-NP---": {POS: VERB, "morph": "Gender=Neut|Number=Sing|Polarity=Neg|VerbForm=Part|Voice=Pass"}, + "VsNS---XX-NP--2": {POS: VERB, "morph": "Gender=Neut|Number=Sing|Polarity=Neg|Style=Arch|VerbForm=Part|Voice=Pass"}, + "VsQW---XX-AP---": {POS: VERB, "morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|VerbForm=Part|Voice=Pass"}, + "VsQW---XX-AP--2": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Style=Arch|VerbForm=Part|Voice=Pass"}, + "VsQW---XX-NP---": {POS: VERB, "morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Neg|VerbForm=Part|Voice=Pass"}, + "VsQW---XX-NP--2": {POS: VERB,"morph": "Gender=Fem,Neut|Number=Plur,Sing|Polarity=Neg|Style=Arch|VerbForm=Part|Voice=Pass"}, + "VsTP---XX-AP---": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Pos|VerbForm=Part|Voice=Pass"}, + "VsTP---XX-AP--2": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Pos|Style=Arch|VerbForm=Part|Voice=Pass"}, + "VsTP---XX-NP---": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Neg|VerbForm=Part|Voice=Pass"}, + "VsTP---XX-NP--2": {POS: VERB,"morph": "Animacy=Inan|Gender=Fem,Masc|Number=Plur|Polarity=Neg|Style=Arch|VerbForm=Part|Voice=Pass"}, + "VsYS---2H-AP---": {POS: VERB,"morph": "Gender=Masc|Number=Sing|Person=2|Polarity=Pos|Tense=Past,Pres|VerbForm=Part|Voice=Pass"}, + "VsYS---XX-AP---": {POS: VERB, "morph": "Gender=Masc|Number=Sing|Polarity=Pos|VerbForm=Part|Voice=Pass"}, + "VsYS---XX-AP--2": {POS: VERB, "morph": "Gender=Masc|Number=Sing|Polarity=Pos|Style=Arch|VerbForm=Part|Voice=Pass"}, + "VsYS---XX-NP---": {POS: VERB, "morph": "Gender=Masc|Number=Sing|Polarity=Neg|VerbForm=Part|Voice=Pass"}, + "VsYS---XX-NP--2": {POS: VERB, "morph": "Gender=Masc|Number=Sing|Polarity=Neg|Style=Arch|VerbForm=Part|Voice=Pass"}, + "Vt-P---1F-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---1F-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---1F-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---1F-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---1P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---1P-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---1P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---1P-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=1|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---2F-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Pos|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---2F-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Neg|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---2P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---2P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=2|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---3F-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---3F-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---3F-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---3F-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---3P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---3P-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---3P-AA--9": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---3P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---3P-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-P---3P-NA--9": {POS: VERB,"morph": "Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---1F-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---1F-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---1F-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---1F-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---1P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---1P-AA--3": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---1P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---1P-NA--3": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=1|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---2F-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Pos|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---2F-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Neg|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---2P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---2P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=2|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---3F-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---3F-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Style=Arch|Tense=Fut|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---3P-AA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Pos|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "Vt-S---3P-NA--2": {POS: VERB,"morph": "Mood=Ind|Number=Sing|Person=3|Polarity=Neg|Style=Arch|Tense=Pres|VerbForm=Fin|VerbType=Verbconj|Voice=Act"}, + "X@-------------": {POS: X, "morph": "_"}, + "X@------------0": {POS: X, "morph": "_"}, + "X@------------1": {POS: X, "morph": "_"}, + "Xx-------------": {POS: X, "morph": "Abbr=Yes"}, + "XX-------------": {POS: X, "morph": "_"}, + "XX------------8": {POS: X, "morph": "Abbr=Yes"}, + "Z:-------------": {POS: PUNCT, "morph": "_"}, + "Z#-------------": {POS: PUNCT, "morph": "PunctType=Root"}, +} diff --git a/spacy/lang/en/syntax_iterators.py b/spacy/lang/en/syntax_iterators.py index 2a1b0867e..00a1bac42 100644 --- a/spacy/lang/en/syntax_iterators.py +++ b/spacy/lang/en/syntax_iterators.py @@ -6,10 +6,21 @@ from ...tokens import Doc, Span def noun_chunks(doclike: Union[Doc, Span]) -> Iterator[Span]: - """Detect base noun phrases from a dependency parse. Works on Doc and Span.""" - # fmt: off - labels = ["nsubj", "dobj", "nsubjpass", "pcomp", "pobj", "dative", "appos", "attr", "ROOT"] - # fmt: on + """ + Detect base noun phrases from a dependency parse. Works on both Doc and Span. + """ + labels = [ + "oprd", + "nsubj", + "dobj", + "nsubjpass", + "pcomp", + "pobj", + "dative", + "appos", + "attr", + "ROOT", + ] doc = doclike.doc # Ensure works on both Doc and Span. if not doc.has_annotation("DEP"): raise ValueError(Errors.E029) diff --git a/spacy/lang/mk/__init__.py b/spacy/lang/mk/__init__.py new file mode 100644 index 000000000..ef2670b4a --- /dev/null +++ b/spacy/lang/mk/__init__.py @@ -0,0 +1,48 @@ +from typing import Optional +from thinc.api import Model +from .lemmatizer import MacedonianLemmatizer +from .stop_words import STOP_WORDS +from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS +from .lex_attrs import LEX_ATTRS +from ..tokenizer_exceptions import BASE_EXCEPTIONS + +from ...language import Language +from ...attrs import LANG +from ...util import update_exc +from ...lookups import Lookups + + +class MacedonianDefaults(Language.Defaults): + lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters[LANG] = lambda text: "mk" + + # Optional: replace flags with custom functions, e.g. like_num() + lex_attr_getters.update(LEX_ATTRS) + + # Merge base exceptions and custom tokenizer exceptions + tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) + stop_words = STOP_WORDS + + @classmethod + def create_lemmatizer(cls, nlp=None, lookups=None): + if lookups is None: + lookups = Lookups() + return MacedonianLemmatizer(lookups) + + +class Macedonian(Language): + lang = "mk" + Defaults = MacedonianDefaults + + +@Macedonian.factory( + "lemmatizer", + assigns=["token.lemma"], + default_config={"model": None, "mode": "rule"}, + default_score_weights={"lemma_acc": 1.0}, +) +def make_lemmatizer(nlp: Language, model: Optional[Model], name: str, mode: str): + return MacedonianLemmatizer(nlp.vocab, model, name, mode=mode) + + +__all__ = ["Macedonian"] diff --git a/spacy/lang/mk/lemmatizer.py b/spacy/lang/mk/lemmatizer.py new file mode 100644 index 000000000..f7126bd36 --- /dev/null +++ b/spacy/lang/mk/lemmatizer.py @@ -0,0 +1,55 @@ +from typing import List +from collections import OrderedDict + +from ...pipeline import Lemmatizer +from ...tokens import Token + + +class MacedonianLemmatizer(Lemmatizer): + def rule_lemmatize(self, token: Token) -> List[str]: + string = token.text + univ_pos = token.pos_.lower() + morphology = token.morph.to_dict() + + if univ_pos in ("", "eol", "space"): + return [string.lower()] + + if string[-3:] == 'јќи': + string = string[:-3] + univ_pos = "verb" + + if callable(self.is_base_form) and self.is_base_form(univ_pos, morphology): + return [string.lower()] + index_table = self.lookups.get_table("lemma_index", {}) + exc_table = self.lookups.get_table("lemma_exc", {}) + rules_table = self.lookups.get_table("lemma_rules", {}) + if not any((index_table.get(univ_pos), exc_table.get(univ_pos), rules_table.get(univ_pos))): + if univ_pos == "propn": + return [string] + else: + return [string.lower()] + + index = index_table.get(univ_pos, {}) + exceptions = exc_table.get(univ_pos, {}) + rules = rules_table.get(univ_pos, []) + + orig = string + string = string.lower() + forms = [] + + for old, new in rules: + if string.endswith(old): + form = string[: len(string) - len(old)] + new + if not form: + continue + if form in index or not form.isalpha(): + forms.append(form) + + forms = list(OrderedDict.fromkeys(forms)) + for form in exceptions.get(string, []): + if form not in forms: + forms.insert(0, form) + if not forms: + forms.append(orig) + + return forms diff --git a/spacy/lang/mk/lex_attrs.py b/spacy/lang/mk/lex_attrs.py new file mode 100644 index 000000000..ffe8fe727 --- /dev/null +++ b/spacy/lang/mk/lex_attrs.py @@ -0,0 +1,55 @@ +from ...attrs import LIKE_NUM + +_num_words = [ + "нула", "еден", "една", "едно", "два", "две", "три", "четири", "пет", "шест", "седум", "осум", "девет", "десет", + "единаесет", "дванаесет", "тринаесет", "четиринаесет", "петнаесет", "шеснаесет", "седумнаесет", "осумнаесет", + "деветнаесет", "дваесет", "триесет", "четириесет", "педесет", "шеесет", "седумдесет", "осумдесет", "деведесет", + "сто", "двесте", "триста", "четиристотини", "петстотини", "шестотини", "седумстотини", "осумстотини", + "деветстотини", "илјада", "илјади", 'милион', 'милиони', 'милијарда', 'милијарди', 'билион', 'билиони', + + "двајца", "тројца", "четворица", "петмина", "шестмина", "седуммина", "осуммина", "деветмина", "обата", "обајцата", + + "прв", "втор", "трет", "четврт", "седм", "осм", "двестоти", + + "два-три", "два-триесет", "два-триесетмина", "два-тринаесет", "два-тројца", "две-три", "две-тристотини", + "пет-шеесет", "пет-шеесетмина", "пет-шеснаесетмина", "пет-шест", "пет-шестмина", "пет-шестотини", "петина", + "осмина", "седум-осум", "седум-осумдесет", "седум-осуммина", "седум-осумнаесет", "седум-осумнаесетмина", + "три-четириесет", "три-четиринаесет", "шеесет", "шеесетина", "шеесетмина", "шеснаесет", "шеснаесетмина", + "шест-седум", "шест-седумдесет", "шест-седумнаесет", "шест-седумстотини", "шестоти", "шестотини" +] + + +def like_num(text): + if text.startswith(("+", "-", "±", "~")): + text = text[1:] + text = text.replace(",", "").replace(".", "") + if text.isdigit(): + return True + if text.count("/") == 1: + num, denom = text.split("/") + if num.isdigit() and denom.isdigit(): + return True + + text_lower = text.lower() + if text_lower in _num_words: + return True + + if text_lower.endswith(("а", "о", "и")): + if text_lower[:-1] in _num_words: + return True + + if text_lower.endswith(("ти", "та", "то", "на")): + if text_lower[:-2] in _num_words: + return True + + if text_lower.endswith(("ата", "иот", "ите", "ина", "чки")): + if text_lower[:-3] in _num_words: + return True + + if text_lower.endswith(("мина", "тина")): + if text_lower[:-4] in _num_words: + return True + return False + + +LEX_ATTRS = {LIKE_NUM: like_num} diff --git a/spacy/lang/mk/stop_words.py b/spacy/lang/mk/stop_words.py new file mode 100644 index 000000000..312a456c5 --- /dev/null +++ b/spacy/lang/mk/stop_words.py @@ -0,0 +1,815 @@ +STOP_WORDS = set( + """ +а +абре +aв +аи +ако +алало +ам +ама +аман +ами +амин +априли-ли-ли +ау +аух +ауч +ах +аха +аха-ха +аш +ашколсум +ашколсун +ај +ајде +ајс +аџаба +бавно +бам +бам-бум +бап +бар +баре +барем +бау +бау-бау +баш +бај +бе +беа +бев +бевме +бевте +без +безбели +бездруго +белки +беше +би +бидејќи +бим +бис +бла +блазе +богами +божем +боц +браво +бравос +бре +бреј +брзо +бришка +бррр +бу +бум +буф +буц +бујрум +ваа +вам +варај +варда +вас +вај +ве +велат +вели +версус +веќе +ви +виа +види +вие +вистина +витос +внатре +во +воз +вон +впрочем +врв +вред +време +врз +всушност +втор +галиба +ги +гитла +го +годе +годишник +горе +гра +гуц +гљу +да +даан +дава +дал +дали +дан +два +дваесет +дванаесет +двајца +две +двесте +движам +движат +движи +движиме +движите +движиш +де +деведесет +девет +деветнаесет +деветстотини +деветти +дека +дел +делми +демек +десет +десетина +десетти +деситици +дејгиди +дејди +ди +дилми +дин +дип +дно +до +доволно +додека +додуша +докај +доколку +доправено +доправи +досамоти +доста +држи +дрн +друг +друга +другата +други +другиот +другите +друго +другото +дум +дур +дури +е +евала +еве +евет +ега +егиди +еден +едикојси +единаесет +единствено +еднаш +едно +ексик +ела +елбете +елем +ели +ем +еми +ене +ете +еурека +ех +еј +жими +жити +за +завал +заврши +зад +задека +задоволна +задржи +заедно +зар +зарад +заради +заре +зарем +затоа +зашто +згора +зема +земе +земува +зер +значи +зошто +зуј +и +иако +из +извезен +изгледа +измеѓу +износ +или +или-или +илјада +илјади +им +има +имаа +имаат +имавме +имавте +имам +имаме +имате +имаш +имаше +име +имено +именува +имплицира +имплицираат +имплицирам +имплицираме +имплицирате +имплицираш +инаку +индицира +исечок +исклучен +исклучена +исклучени +исклучено +искористен +искористена +искористени +искористено +искористи +искрај +исти +исто +итака +итн +их +иха +ихуу +иш +ишала +иј +ка +каде +кажува +како +каков +камоли +кај +ква +ки +кит +кло +клум +кога +кого +кого-годе +кое +кои +количество +количина +колку +кому +кон +користена +користени +користено +користи +кот +котрр +кош-кош +кој +која +којзнае +којшто +кр-кр-кр +крај +крек +крз +крк +крц +куку +кукуригу +куш +ле +лебами +леле +лели +ли +лиду +луп +ма +макар +малку +марш +мат +мац +машала +ме +мене +место +меѓу +меѓувреме +меѓутоа +ми +мое +може +можеби +молам +моли +мор +мора +море +мори +мразец +му +муклец +мутлак +муц +мјау +на +навидум +навистина +над +надвор +назад +накај +накрај +нали +нам +наместо +наоколу +направено +направи +напред +нас +наспоред +наспрема +наспроти +насред +натаму +натема +начин +наш +наша +наше +наши +нај +најдоцна +најмалку +најмногу +не +неа +него +негов +негова +негови +негово +незе +нека +некаде +некако +некаков +некого +некое +некои +неколку +некому +некој +некојси +нели +немој +нему +неоти +нечиј +нешто +нејзе +нејзин +нејзини +нејзино +нејсе +ни +нив +нивен +нивна +нивни +нивно +ние +низ +никаде +никако +никогаш +никого +никому +никој +ним +нити +нито +ниту +ничиј +ништо +но +нѐ +о +обр +ова +ова-она +оваа +овај +овде +овега +овие +овој +од +одавде +оди +однесува +односно +одошто +околу +олеле +олкацок +он +она +онаа +онака +онаков +онде +они +оние +оно +оној +оп +освем +освен +осем +осми +осум +осумдесет +осумнаесет +осумстотитни +отаде +оти +откако +откај +откога +отколку +оттаму +оттука +оф +ох +ој +па +пак +папа +пардон +пате-ќуте +пати +пау +паче +пеесет +пеки +пет +петнаесет +петстотини +петти +пи +пи-пи +пис +плас +плус +по +побавно +поблиску +побрзо +побуни +повеќе +повторно +под +подалеку +подолу +подоцна +подруго +позади +поинаква +поинакви +поинакво +поинаков +поинаку +покаже +покажува +покрај +полно +помалку +помеѓу +понатаму +понекогаш +понекој +поради +поразличен +поразлична +поразлични +поразлично +поседува +после +последен +последна +последни +последно +поспоро +потег +потоа +пошироко +прави +празно +прв +пред +през +преку +претежно +претходен +претходна +претходни +претходник +претходно +при +присвои +притоа +причинува +пријатно +просто +против +прр +пст +пук +пусто +пуф +пуј +пфуј +пшт +ради +различен +различна +различни +различно +разни +разоружен +разредлив +рамките +рамнообразно +растревожено +растреперено +расчувствувано +ратоборно +рече +роден +с +сакан +сам +сама +сами +самите +само +самоти +свое +свои +свој +своја +се +себе +себеси +сега +седми +седум +седумдесет +седумнаесет +седумстотини +секаде +секаков +секи +секогаш +секого +секому +секој +секојдневно +сем +сенешто +сепак +сериозен +сериозна +сериозни +сериозно +сет +сечиј +сешто +си +сиктер +сиот +сип +сиреч +сите +сичко +скок +скоро +скрц +следбеник +следбеничка +следен +следователно +следствено +сме +со +соне +сопствен +сопствена +сопствени +сопствено +сосе +сосем +сполај +според +споро +спрема +спроти +спротив +сред +среде +среќно +срочен +сст +става +ставаат +ставам +ставаме +ставате +ставаш +стави +сте +сто +стоп +страна +сум +сума +супер +сус +сѐ +та +таа +така +таква +такви +таков +тамам +таму +тангар-мангар +тандар-мандар +тап +твое +те +тебе +тебека +тек +текот +ти +тие +тизе +тик-так +тики +тоа +тогаш +тој +трак +трака-трука +трас +треба +трет +три +триесет +тринаест +триста +труп +трупа +трус +ту +тука +туку +тукушто +туф +у +уа +убаво +уви +ужасно +уз +ура +уу +уф +уха +уш +уште +фазен +фала +фил +филан +фис +фиу +фиљан +фоб +фон +ха +ха-ха +хе +хеј +хеј +хи +хм +хо +цак +цап +целина +цело +цигу-лигу +циц +чекај +често +четврт +четири +четириесет +четиринаесет +четирстотини +чие +чии +чик +чик-чирик +чини +чиш +чиј +чија +чијшто +чкрап +чому +чук +чукш +чуму +чунки +шеесет +шеснаесет +шест +шести +шестотини +ширум +шлак +шлап +шлапа-шлупа +шлуп +шмрк +што +штогоде +штом +штотуку +штрак +штрап +штрап-штруп +шуќур +ѓиди +ѓоа +ѓоамити +ѕан +ѕе +ѕин +ја +јадец +јазе +јали +јас +јаска +јок +ќе +ќешки +ѝ +џагара-магара +џанам +џив-џив + """.split() +) diff --git a/spacy/lang/mk/tokenizer_exceptions.py b/spacy/lang/mk/tokenizer_exceptions.py new file mode 100644 index 000000000..1a359ba53 --- /dev/null +++ b/spacy/lang/mk/tokenizer_exceptions.py @@ -0,0 +1,100 @@ +from ...symbols import ORTH, NORM + + +_exc = {} + + +_abbr_exc = [ + {ORTH: "м", NORM: "метар"}, + {ORTH: "мм", NORM: "милиметар"}, + {ORTH: "цм", NORM: "центиметар"}, + {ORTH: "см", NORM: "сантиметар"}, + {ORTH: "дм", NORM: "дециметар"}, + {ORTH: "км", NORM: "километар"}, + {ORTH: "кг", NORM: "килограм"}, + {ORTH: "дкг", NORM: "декаграм"}, + {ORTH: "дг", NORM: "дециграм"}, + {ORTH: "мг", NORM: "милиграм"}, + {ORTH: "г", NORM: "грам"}, + {ORTH: "т", NORM: "тон"}, + {ORTH: "кл", NORM: "килолитар"}, + {ORTH: "хл", NORM: "хектолитар"}, + {ORTH: "дкл", NORM: "декалитар"}, + {ORTH: "л", NORM: "литар"}, + {ORTH: "дл", NORM: "децилитар"} + +] +for abbr in _abbr_exc: + _exc[abbr[ORTH]] = [abbr] + +_abbr_line_exc = [ + {ORTH: "д-р", NORM: "доктор"}, + {ORTH: "м-р", NORM: "магистер"}, + {ORTH: "г-ѓа", NORM: "госпоѓа"}, + {ORTH: "г-ца", NORM: "госпоѓица"}, + {ORTH: "г-дин", NORM: "господин"}, + +] + +for abbr in _abbr_line_exc: + _exc[abbr[ORTH]] = [abbr] + +_abbr_dot_exc = [ + {ORTH: "в.", NORM: "век"}, + {ORTH: "в.д.", NORM: "вршител на должност"}, + {ORTH: "г.", NORM: "година"}, + {ORTH: "г.г.", NORM: "господин господин"}, + {ORTH: "м.р.", NORM: "машки род"}, + {ORTH: "год.", NORM: "женски род"}, + {ORTH: "с.р.", NORM: "среден род"}, + {ORTH: "н.е.", NORM: "наша ера"}, + {ORTH: "о.г.", NORM: "оваа година"}, + {ORTH: "о.м.", NORM: "овој месец"}, + {ORTH: "с.", NORM: "село"}, + {ORTH: "т.", NORM: "точка"}, + {ORTH: "т.е.", NORM: "то ест"}, + {ORTH: "т.н.", NORM: "таканаречен"}, + + {ORTH: "бр.", NORM: "број"}, + {ORTH: "гр.", NORM: "град"}, + {ORTH: "др.", NORM: "другар"}, + {ORTH: "и др.", NORM: "и друго"}, + {ORTH: "и сл.", NORM: "и слично"}, + {ORTH: "кн.", NORM: "книга"}, + {ORTH: "мн.", NORM: "множина"}, + {ORTH: "на пр.", NORM: "на пример"}, + {ORTH: "св.", NORM: "свети"}, + {ORTH: "сп.", NORM: "списание"}, + {ORTH: "с.", NORM: "страница"}, + {ORTH: "стр.", NORM: "страница"}, + {ORTH: "чл.", NORM: "член"}, + + {ORTH: "арх.", NORM: "архитект"}, + {ORTH: "бел.", NORM: "белешка"}, + {ORTH: "гимн.", NORM: "гимназија"}, + {ORTH: "ден.", NORM: "денар"}, + {ORTH: "ул.", NORM: "улица"}, + {ORTH: "инж.", NORM: "инженер"}, + {ORTH: "проф.", NORM: "професор"}, + {ORTH: "студ.", NORM: "студент"}, + {ORTH: "бот.", NORM: "ботаника"}, + {ORTH: "мат.", NORM: "математика"}, + {ORTH: "мед.", NORM: "медицина"}, + {ORTH: "прил.", NORM: "прилог"}, + {ORTH: "прид.", NORM: "придавка"}, + {ORTH: "сврз.", NORM: "сврзник"}, + {ORTH: "физ.", NORM: "физика"}, + {ORTH: "хем.", NORM: "хемија"}, + {ORTH: "пр. н.", NORM: "природни науки"}, + {ORTH: "истор.", NORM: "историја"}, + {ORTH: "геогр.", NORM: "географија"}, + {ORTH: "литер.", NORM: "литература"}, + + +] + +for abbr in _abbr_dot_exc: + _exc[abbr[ORTH]] = [abbr] + + +TOKENIZER_EXCEPTIONS = _exc diff --git a/spacy/lang/tr/__init__.py b/spacy/lang/tr/__init__.py index 788adb6fb..679411acf 100644 --- a/spacy/lang/tr/__init__.py +++ b/spacy/lang/tr/__init__.py @@ -1,4 +1,4 @@ -from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS +from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS, TOKEN_MATCH from .stop_words import STOP_WORDS from .syntax_iterators import SYNTAX_ITERATORS from .lex_attrs import LEX_ATTRS @@ -9,6 +9,7 @@ class TurkishDefaults(Language.Defaults): tokenizer_exceptions = TOKENIZER_EXCEPTIONS lex_attr_getters = LEX_ATTRS stop_words = STOP_WORDS + token_match = TOKEN_MATCH syntax_iterators = SYNTAX_ITERATORS diff --git a/spacy/lang/tr/tokenizer_exceptions.py b/spacy/lang/tr/tokenizer_exceptions.py index b84ef89a2..747905189 100644 --- a/spacy/lang/tr/tokenizer_exceptions.py +++ b/spacy/lang/tr/tokenizer_exceptions.py @@ -1,119 +1,181 @@ -from ..tokenizer_exceptions import BASE_EXCEPTIONS +import re + +from ..punctuation import ALPHA_LOWER, ALPHA from ...symbols import ORTH, NORM -from ...util import update_exc -_exc = {"sağol": [{ORTH: "sağ"}, {ORTH: "ol", NORM: "olun"}]} +_exc = {} -for exc_data in [ - {ORTH: "A.B.D.", NORM: "Amerika Birleşik Devletleri"}, - {ORTH: "Alb.", NORM: "Albay"}, - {ORTH: "Ar.Gör.", NORM: "Araştırma Görevlisi"}, - {ORTH: "Arş.Gör.", NORM: "Araştırma Görevlisi"}, - {ORTH: "Asb.", NORM: "Astsubay"}, - {ORTH: "Astsb.", NORM: "Astsubay"}, - {ORTH: "As.İz.", NORM: "Askeri İnzibat"}, - {ORTH: "Atğm", NORM: "Asteğmen"}, - {ORTH: "Av.", NORM: "Avukat"}, - {ORTH: "Apt.", NORM: "Apartmanı"}, - {ORTH: "Bçvş.", NORM: "Başçavuş"}, +_abbr_period_exc = [ + {ORTH: "A.B.D.", NORM: "Amerika"}, + {ORTH: "Alb.", NORM: "albay"}, + {ORTH: "Ank.", NORM: "Ankara"}, + {ORTH: "Ar.Gör."}, + {ORTH: "Arş.Gör."}, + {ORTH: "Asb.", NORM: "astsubay"}, + {ORTH: "Astsb.", NORM: "astsubay"}, + {ORTH: "As.İz."}, + {ORTH: "as.iz."}, + {ORTH: "Atğm", NORM: "asteğmen"}, + {ORTH: "Av.", NORM: "avukat"}, + {ORTH: "Apt.", NORM: "apartmanı"}, + {ORTH: "apt.", NORM: "apartmanı"}, + {ORTH: "Bçvş.", NORM: "başçavuş"}, + {ORTH: "bçvş.", NORM: "başçavuş"}, {ORTH: "bk.", NORM: "bakınız"}, {ORTH: "bknz.", NORM: "bakınız"}, - {ORTH: "Bnb.", NORM: "Binbaşı"}, + {ORTH: "Bnb.", NORM: "binbaşı"}, {ORTH: "bnb.", NORM: "binbaşı"}, - {ORTH: "Böl.", NORM: "Bölümü"}, - {ORTH: "Bşk.", NORM: "Başkanlığı"}, - {ORTH: "Bştbp.", NORM: "Baştabip"}, - {ORTH: "Bul.", NORM: "Bulvarı"}, - {ORTH: "Cad.", NORM: "Caddesi"}, + {ORTH: "Böl.", NORM: "bölümü"}, + {ORTH: "böl.", NORM: "bölümü"}, + {ORTH: "Bşk.", NORM: "başkanlığı"}, + {ORTH: "bşk.", NORM: "başkanlığı"}, + {ORTH: "Bştbp.", NORM: "baştabip"}, + {ORTH: "bştbp.", NORM: "baştabip"}, + {ORTH: "Bul.", NORM: "bulvarı"}, + {ORTH: "bul.", NORM: "bulvarı"}, + {ORTH: "Cad.", NORM: "caddesi"}, + {ORTH: "cad.", NORM: "caddesi"}, {ORTH: "çev.", NORM: "çeviren"}, - {ORTH: "Çvş.", NORM: "Çavuş"}, + {ORTH: "Çvş.", NORM: "çavuş"}, + {ORTH: "çvş.", NORM: "çavuş"}, {ORTH: "dak.", NORM: "dakika"}, {ORTH: "dk.", NORM: "dakika"}, - {ORTH: "Doç.", NORM: "Doçent"}, - {ORTH: "doğ.", NORM: "doğum tarihi"}, + {ORTH: "Doç.", NORM: "doçent"}, + {ORTH: "doğ."}, + {ORTH: "Dr.", NORM: "doktor"}, + {ORTH: "dr.", NORM:"doktor"}, {ORTH: "drl.", NORM: "derleyen"}, - {ORTH: "Dz.", NORM: "Deniz"}, - {ORTH: "Dz.K.K.lığı", NORM: "Deniz Kuvvetleri Komutanlığı"}, - {ORTH: "Dz.Kuv.", NORM: "Deniz Kuvvetleri"}, - {ORTH: "Dz.Kuv.K.", NORM: "Deniz Kuvvetleri Komutanlığı"}, + {ORTH: "Dz.", NORM: "deniz"}, + {ORTH: "Dz.K.K.lığı"}, + {ORTH: "Dz.Kuv."}, + {ORTH: "Dz.Kuv.K."}, {ORTH: "dzl.", NORM: "düzenleyen"}, - {ORTH: "Ecz.", NORM: "Eczanesi"}, + {ORTH: "Ecz.", NORM: "eczanesi"}, + {ORTH: "ecz.", NORM: "eczanesi"}, {ORTH: "ekon.", NORM: "ekonomi"}, - {ORTH: "Fak.", NORM: "Fakültesi"}, - {ORTH: "Gn.", NORM: "Genel"}, + {ORTH: "Fak.", NORM: "fakültesi"}, + {ORTH: "Gn.", NORM: "genel"}, {ORTH: "Gnkur.", NORM: "Genelkurmay"}, {ORTH: "Gn.Kur.", NORM: "Genelkurmay"}, {ORTH: "gr.", NORM: "gram"}, - {ORTH: "Hst.", NORM: "Hastanesi"}, - {ORTH: "Hs.Uzm.", NORM: "Hesap Uzmanı"}, + {ORTH: "Hst.", NORM: "hastanesi"}, + {ORTH: "hst.", NORM: "hastanesi"}, + {ORTH: "Hs.Uzm."}, {ORTH: "huk.", NORM: "hukuk"}, - {ORTH: "Hv.", NORM: "Hava"}, - {ORTH: "Hv.K.K.lığı", NORM: "Hava Kuvvetleri Komutanlığı"}, - {ORTH: "Hv.Kuv.", NORM: "Hava Kuvvetleri"}, - {ORTH: "Hv.Kuv.K.", NORM: "Hava Kuvvetleri Komutanlığı"}, - {ORTH: "Hz.", NORM: "Hazreti"}, - {ORTH: "Hz.Öz.", NORM: "Hizmete Özel"}, - {ORTH: "İng.", NORM: "İngilizce"}, - {ORTH: "Jeol.", NORM: "Jeoloji"}, + {ORTH: "Hv.", NORM: "hava"}, + {ORTH: "Hv.K.K.lığı"}, + {ORTH: "Hv.Kuv."}, + {ORTH: "Hv.Kuv.K."}, + {ORTH: "Hz.", NORM: "hazreti"}, + {ORTH: "Hz.Öz."}, + {ORTH: "İng.", NORM: "ingilizce"}, + {ORTH: "İst.", NORM: "İstanbul"}, + {ORTH: "Jeol.", NORM: "jeoloji"}, {ORTH: "jeol.", NORM: "jeoloji"}, - {ORTH: "Korg.", NORM: "Korgeneral"}, - {ORTH: "Kur.", NORM: "Kurmay"}, - {ORTH: "Kur.Bşk.", NORM: "Kurmay Başkanı"}, - {ORTH: "Kuv.", NORM: "Kuvvetleri"}, - {ORTH: "Ltd.", NORM: "Limited"}, - {ORTH: "Mah.", NORM: "Mahallesi"}, + {ORTH: "Korg.", NORM: "korgeneral"}, + {ORTH: "Kur.", NORM: "kurmay"}, + {ORTH: "Kur.Bşk."}, + {ORTH: "Kuv.", NORM: "kuvvetleri"}, + {ORTH: "Ltd.", NORM: "limited"}, + {ORTH: "ltd.", NORM: "limited"}, + {ORTH: "Mah.", NORM: "mahallesi"}, {ORTH: "mah.", NORM: "mahallesi"}, {ORTH: "max.", NORM: "maksimum"}, {ORTH: "min.", NORM: "minimum"}, - {ORTH: "Müh.", NORM: "Mühendisliği"}, + {ORTH: "Müh.", NORM: "mühendisliği"}, {ORTH: "müh.", NORM: "mühendisliği"}, - {ORTH: "MÖ.", NORM: "Milattan Önce"}, - {ORTH: "Onb.", NORM: "Onbaşı"}, - {ORTH: "Ord.", NORM: "Ordinaryüs"}, - {ORTH: "Org.", NORM: "Orgeneral"}, - {ORTH: "Ped.", NORM: "Pedagoji"}, - {ORTH: "Prof.", NORM: "Profesör"}, - {ORTH: "Sb.", NORM: "Subay"}, - {ORTH: "Sn.", NORM: "Sayın"}, + {ORTH: "M.Ö."}, + {ORTH: "M.S."}, + {ORTH: "Onb.", NORM: "onbaşı"}, + {ORTH: "Ord.", NORM: "ordinaryüs"}, + {ORTH: "Org.", NORM: "orgeneral"}, + {ORTH: "Ped.", NORM: "pedagoji"}, + {ORTH: "Prof.", NORM: "profesör"}, + {ORTH: "prof.", NORM: "profesör"}, + {ORTH: "Sb.", NORM: "subay"}, + {ORTH: "Sn.", NORM: "sayın"}, {ORTH: "sn.", NORM: "saniye"}, - {ORTH: "Sok.", NORM: "Sokak"}, - {ORTH: "Şb.", NORM: "Şube"}, - {ORTH: "Şti.", NORM: "Şirketi"}, - {ORTH: "Tbp.", NORM: "Tabip"}, - {ORTH: "T.C.", NORM: "Türkiye Cumhuriyeti"}, - {ORTH: "Tel.", NORM: "Telefon"}, + {ORTH: "Sok.", NORM: "sokak"}, + {ORTH: "sok.", NORM: "sokak"}, + {ORTH: "Şb.", NORM: "şube"}, + {ORTH: "şb.", NORM: "şube"}, + {ORTH: "Şti.", NORM: "şirketi"}, + {ORTH: "şti.", NORM: "şirketi"}, + {ORTH: "Tbp.", NORM: "tabip"}, + {ORTH: "tbp.", NORM: "tabip"}, + {ORTH: "T.C."}, + {ORTH: "Tel.", NORM: "telefon"}, {ORTH: "tel.", NORM: "telefon"}, {ORTH: "telg.", NORM: "telgraf"}, - {ORTH: "Tğm.", NORM: "Teğmen"}, + {ORTH: "Tğm.", NORM: "teğmen"}, {ORTH: "tğm.", NORM: "teğmen"}, {ORTH: "tic.", NORM: "ticaret"}, - {ORTH: "Tug.", NORM: "Tugay"}, - {ORTH: "Tuğg.", NORM: "Tuğgeneral"}, - {ORTH: "Tümg.", NORM: "Tümgeneral"}, - {ORTH: "Uzm.", NORM: "Uzman"}, - {ORTH: "Üçvş.", NORM: "Üstçavuş"}, - {ORTH: "Üni.", NORM: "Üniversitesi"}, - {ORTH: "Ütğm.", NORM: "Üsteğmen"}, - {ORTH: "vb.", NORM: "ve benzeri"}, + {ORTH: "Tug.", NORM: "tugay"}, + {ORTH: "Tuğg.", NORM: "tuğgeneral"}, + {ORTH: "Tümg.", NORM: "tümgeneral"}, + {ORTH: "Uzm.", NORM: "uzman"}, + {ORTH: "Üçvş.", NORM: "üstçavuş"}, + {ORTH: "Üni.", NORM: "üniversitesi"}, + {ORTH: "Ütğm.", NORM: "üsteğmen"}, + {ORTH: "vb."}, {ORTH: "vs.", NORM: "vesaire"}, - {ORTH: "Yard.", NORM: "Yardımcı"}, - {ORTH: "Yar.", NORM: "Yardımcı"}, - {ORTH: "Yd.Sb.", NORM: "Yedek Subay"}, - {ORTH: "Yard.Doç.", NORM: "Yardımcı Doçent"}, - {ORTH: "Yar.Doç.", NORM: "Yardımcı Doçent"}, - {ORTH: "Yb.", NORM: "Yarbay"}, - {ORTH: "Yrd.", NORM: "Yardımcı"}, - {ORTH: "Yrd.Doç.", NORM: "Yardımcı Doçent"}, - {ORTH: "Y.Müh.", NORM: "Yüksek mühendis"}, - {ORTH: "Y.Mim.", NORM: "Yüksek mimar"}, -]: - _exc[exc_data[ORTH]] = [exc_data] + {ORTH: "Yard.", NORM: "yardımcı"}, + {ORTH: "Yar.", NORM: "yardımcı"}, + {ORTH: "Yd.Sb."}, + {ORTH: "Yard.Doç."}, + {ORTH: "Yar.Doç."}, + {ORTH: "Yb.", NORM: "yarbay"}, + {ORTH: "Yrd.", NORM: "yardımcı"}, + {ORTH: "Yrd.Doç."}, + {ORTH: "Y.Müh."}, + {ORTH: "Y.Mim."}, + {ORTH: "yy.", NORM: "yüzyıl"}, +] + +for abbr in _abbr_period_exc: + _exc[abbr[ORTH]] = [abbr] + +_abbr_exc = [ + {ORTH: "AB", NORM: "Avrupa Birliği"}, + {ORTH: "ABD", NORM: "Amerika"}, + {ORTH: "ABS", NORM: "fren"}, + {ORTH: "AOÇ"}, + {ORTH: "ASKİ"}, + {ORTH: "Bağ-kur", NORM: "Bağkur"}, + {ORTH: "BDDK"}, + {ORTH: "BJK", NORM: "Beşiktaş"}, + {ORTH: "ESA", NORM: "Avrupa uzay ajansı"}, + {ORTH: "FB", NORM: "Fenerbahçe"}, + {ORTH: "GATA"}, + {ORTH: "GS", NORM: "Galatasaray"}, + {ORTH: "İSKİ"}, + {ORTH: "KBB"}, + {ORTH: "RTÜK", NORM: "radyo ve televizyon üst kurulu"}, + {ORTH: "TBMM"}, + {ORTH: "TC"}, + {ORTH: "TÜİK", NORM: "Türkiye istatistik kurumu"}, + {ORTH: "YÖK"}, +] + +for abbr in _abbr_exc: + _exc[abbr[ORTH]] = [abbr] -for orth in ["Dr.", "yy."]: - _exc[orth] = [{ORTH: orth}] +_num = r"[+-]?\d+([,.]\d+)*" +_ord_num = r"(\d+\.)" +_date = r"(((\d{1,2}[./-]){2})?(\d{4})|(\d{1,2}[./]\d{1,2}(\.)?))" +_dash_num = r"(([{al}\d]+/\d+)|(\d+/[{al}]))".format(al=ALPHA) +_roman_num = "M{0,3}(?:C[MD]|D?C{0,3})(?:X[CL]|L?X{0,3})(?:I[XV]|V?I{0,3})" +_roman_ord = r"({rn})\.".format(rn=_roman_num) +_time_exp = r"\d+(:\d+)*" -TOKENIZER_EXCEPTIONS = update_exc(BASE_EXCEPTIONS, _exc) +_inflections = r"'[{al}]+".format(al=ALPHA_LOWER) +_abbrev_inflected = r"[{a}]+\.'[{al}]+".format(a=ALPHA, al=ALPHA_LOWER) + +_nums = r"(({d})|({dn})|({te})|({on})|({n})|({ro})|({rn}))({inf})?".format(d=_date, dn=_dash_num, te=_time_exp, on=_ord_num, n=_num, ro=_roman_ord, rn=_roman_num, inf=_inflections) + +TOKENIZER_EXCEPTIONS = _exc +TOKEN_MATCH = re.compile(r"^({abbr})|({n})$".format(n=_nums, abbr=_abbrev_inflected)).match diff --git a/spacy/lang/zh/__init__.py b/spacy/lang/zh/__init__.py index 30560ed0d..9a8a21a63 100644 --- a/spacy/lang/zh/__init__.py +++ b/spacy/lang/zh/__init__.py @@ -17,7 +17,7 @@ from ... import util # fmt: off -_PKUSEG_INSTALL_MSG = "install spacy-pkuseg with `pip install spacy-pkuseg==0.0.26`" +_PKUSEG_INSTALL_MSG = "install spacy-pkuseg with `pip install \"spacy-pkuseg>=0.0.27,<0.1.0\"` or `conda install -c conda-forge \"spacy-pkuseg>=0.0.27,<0.1.0\"`" # fmt: on DEFAULT_CONFIG = """ diff --git a/spacy/language.py b/spacy/language.py index dd790e85f..995acbd7b 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -121,6 +121,7 @@ class Language: max_length: int = 10 ** 6, meta: Dict[str, Any] = {}, create_tokenizer: Optional[Callable[["Language"], Callable[[str], Doc]]] = None, + batch_size: int = 1000, **kwargs, ) -> None: """Initialise a Language object. @@ -138,6 +139,7 @@ class Language: 100,000 characters in one text. create_tokenizer (Callable): Function that takes the nlp object and returns a tokenizer. + batch_size (int): Default batch size for pipe and evaluate. DOCS: https://nightly.spacy.io/api/language#init """ @@ -173,6 +175,7 @@ class Language: tokenizer_cfg = {"tokenizer": self._config["nlp"]["tokenizer"]} create_tokenizer = registry.resolve(tokenizer_cfg)["tokenizer"] self.tokenizer = create_tokenizer(self) + self.batch_size = batch_size def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) @@ -968,10 +971,6 @@ class Language: DOCS: https://nightly.spacy.io/api/language#call """ - if len(text) > self.max_length: - raise ValueError( - Errors.E088.format(length=len(text), max_length=self.max_length) - ) doc = self.make_doc(text) if component_cfg is None: component_cfg = {} @@ -1045,6 +1044,11 @@ class Language: text (str): The text to process. RETURNS (Doc): The processed doc. """ + if len(text) > self.max_length: + raise ValueError( + Errors.E088.format(length=len(text), max_length=self.max_length) + ) + return self.tokenizer(text) return self.tokenizer(text) def update( @@ -1267,7 +1271,7 @@ class Language: self, examples: Iterable[Example], *, - batch_size: int = 256, + batch_size: Optional[int] = None, scorer: Optional[Scorer] = None, component_cfg: Optional[Dict[str, Dict[str, Any]]] = None, scorer_cfg: Optional[Dict[str, Any]] = None, @@ -1275,7 +1279,7 @@ class Language: """Evaluate a model's pipeline components. examples (Iterable[Example]): `Example` objects. - batch_size (int): Batch size to use. + batch_size (Optional[int]): Batch size to use. scorer (Optional[Scorer]): Scorer to use. If not passed in, a new one will be created. component_cfg (dict): An optional dictionary with extra keyword @@ -1287,6 +1291,8 @@ class Language: DOCS: https://nightly.spacy.io/api/language#evaluate """ validate_examples(examples, "Language.evaluate") + if batch_size is None: + batch_size = self.batch_size if component_cfg is None: component_cfg = {} if scorer_cfg is None: @@ -1365,7 +1371,7 @@ class Language: texts: Iterable[str], *, as_tuples: bool = False, - batch_size: int = 1000, + batch_size: Optional[int] = None, disable: Iterable[str] = SimpleFrozenList(), component_cfg: Optional[Dict[str, Dict[str, Any]]] = None, n_process: int = 1, @@ -1376,7 +1382,7 @@ class Language: as_tuples (bool): If set to True, inputs should be a sequence of (text, context) tuples. Output will then be a sequence of (doc, context) tuples. Defaults to False. - batch_size (int): The number of texts to buffer. + batch_size (Optional[int]): The number of texts to buffer. disable (List[str]): Names of the pipeline components to disable. component_cfg (Dict[str, Dict]): An optional dictionary with extra keyword arguments for specific components. @@ -1403,6 +1409,8 @@ class Language: return if component_cfg is None: component_cfg = {} + if batch_size is None: + batch_size = self.batch_size pipes = ( [] @@ -1617,6 +1625,7 @@ class Language: nlp.add_pipe(source_name, source=source_nlps[model], name=pipe_name) disabled_pipes = [*config["nlp"]["disabled"], *disable] nlp._disabled = set(p for p in disabled_pipes if p not in exclude) + nlp.batch_size = config["nlp"]["batch_size"] nlp.config = filled if auto_fill else config if after_pipeline_creation is not None: nlp = after_pipeline_creation(nlp) diff --git a/spacy/matcher/matcher.pxd b/spacy/matcher/matcher.pxd index e1f6bc773..52a30d94c 100644 --- a/spacy/matcher/matcher.pxd +++ b/spacy/matcher/matcher.pxd @@ -26,6 +26,7 @@ cdef enum quantifier_t: ZERO_PLUS ONE ONE_PLUS + FINAL_ID cdef struct AttrValueC: diff --git a/spacy/matcher/matcher.pyx b/spacy/matcher/matcher.pyx index a4d20ec55..31699bfa1 100644 --- a/spacy/matcher/matcher.pyx +++ b/spacy/matcher/matcher.pyx @@ -2,7 +2,7 @@ from typing import List from libcpp.vector cimport vector -from libc.stdint cimport int32_t +from libc.stdint cimport int32_t, int8_t from libc.string cimport memset, memcmp from cymem.cymem cimport Pool from murmurhash.mrmr cimport hash64 @@ -308,7 +308,7 @@ cdef find_matches(TokenPatternC** patterns, int n, object doclike, int length, e # avoid any processing or mem alloc if the document is empty return output if len(predicates) > 0: - predicate_cache = mem.alloc(length * len(predicates), sizeof(char)) + predicate_cache = mem.alloc(length * len(predicates), sizeof(int8_t)) if extensions is not None and len(extensions) >= 1: nr_extra_attr = max(extensions.values()) + 1 extra_attr_values = mem.alloc(length * nr_extra_attr, sizeof(attr_t)) @@ -349,7 +349,7 @@ cdef find_matches(TokenPatternC** patterns, int n, object doclike, int length, e cdef void transition_states(vector[PatternStateC]& states, vector[MatchC]& matches, - char* cached_py_predicates, + int8_t* cached_py_predicates, Token token, const attr_t* extra_attrs, py_predicates) except *: cdef int q = 0 cdef vector[PatternStateC] new_states @@ -421,7 +421,7 @@ cdef void transition_states(vector[PatternStateC]& states, vector[MatchC]& match states.push_back(new_states[i]) -cdef int update_predicate_cache(char* cache, +cdef int update_predicate_cache(int8_t* cache, const TokenPatternC* pattern, Token token, predicates) except -1: # If the state references any extra predicates, check whether they match. # These are cached, so that we don't call these potentially expensive @@ -459,7 +459,7 @@ cdef void finish_states(vector[MatchC]& matches, vector[PatternStateC]& states) cdef action_t get_action(PatternStateC state, const TokenC* token, const attr_t* extra_attrs, - const char* predicate_matches) nogil: + const int8_t* predicate_matches) nogil: """We need to consider: a) Does the token match the specification? [Yes, No] b) What's the quantifier? [1, 0+, ?] @@ -517,7 +517,7 @@ cdef action_t get_action(PatternStateC state, Problem: If a quantifier is matching, we're adding a lot of open partials """ - cdef char is_match + cdef int8_t is_match is_match = get_is_match(state, token, extra_attrs, predicate_matches) quantifier = get_quantifier(state) is_final = get_is_final(state) @@ -569,9 +569,9 @@ cdef action_t get_action(PatternStateC state, return RETRY -cdef char get_is_match(PatternStateC state, +cdef int8_t get_is_match(PatternStateC state, const TokenC* token, const attr_t* extra_attrs, - const char* predicate_matches) nogil: + const int8_t* predicate_matches) nogil: for i in range(state.pattern.nr_py): if predicate_matches[state.pattern.py_predicates[i]] == -1: return 0 @@ -586,8 +586,8 @@ cdef char get_is_match(PatternStateC state, return True -cdef char get_is_final(PatternStateC state) nogil: - if state.pattern[1].nr_attr == 0 and state.pattern[1].attrs != NULL: +cdef int8_t get_is_final(PatternStateC state) nogil: + if state.pattern[1].quantifier == FINAL_ID: id_attr = state.pattern[1].attrs[0] if id_attr.attr != ID: with gil: @@ -597,7 +597,7 @@ cdef char get_is_final(PatternStateC state) nogil: return 0 -cdef char get_quantifier(PatternStateC state) nogil: +cdef int8_t get_quantifier(PatternStateC state) nogil: return state.pattern.quantifier @@ -626,36 +626,20 @@ cdef TokenPatternC* init_pattern(Pool mem, attr_t entity_id, object token_specs) pattern[i].nr_py = len(predicates) pattern[i].key = hash64(pattern[i].attrs, pattern[i].nr_attr * sizeof(AttrValueC), 0) i = len(token_specs) - # Even though here, nr_attr == 0, we're storing the ID value in attrs[0] (bug-prone, thread carefully!) - pattern[i].attrs = mem.alloc(2, sizeof(AttrValueC)) + # Use quantifier to identify final ID pattern node (rather than previous + # uninitialized quantifier == 0/ZERO + nr_attr == 0 + non-zero-length attrs) + pattern[i].quantifier = FINAL_ID + pattern[i].attrs = mem.alloc(1, sizeof(AttrValueC)) pattern[i].attrs[0].attr = ID pattern[i].attrs[0].value = entity_id - pattern[i].nr_attr = 0 + pattern[i].nr_attr = 1 pattern[i].nr_extra_attr = 0 pattern[i].nr_py = 0 return pattern cdef attr_t get_ent_id(const TokenPatternC* pattern) nogil: - # There have been a few bugs here. We used to have two functions, - # get_ent_id and get_pattern_key that tried to do the same thing. These - # are now unified to try to solve the "ghost match" problem. - # Below is the previous implementation of get_ent_id and the comment on it, - # preserved for reference while we figure out whether the heisenbug in the - # matcher is resolved. - # - # - # cdef attr_t get_ent_id(const TokenPatternC* pattern) nogil: - # # The code was originally designed to always have pattern[1].attrs.value - # # be the ent_id when we get to the end of a pattern. However, Issue #2671 - # # showed this wasn't the case when we had a reject-and-continue before a - # # match. - # # The patch to #2671 was wrong though, which came up in #3839. - # while pattern.attrs.attr != ID: - # pattern += 1 - # return pattern.attrs.value - while pattern.nr_attr != 0 or pattern.nr_extra_attr != 0 or pattern.nr_py != 0 \ - or pattern.quantifier != ZERO: + while pattern.quantifier != FINAL_ID: pattern += 1 id_attr = pattern[0].attrs[0] if id_attr.attr != ID: diff --git a/spacy/ml/extract_ngrams.py b/spacy/ml/extract_ngrams.py index bdc297232..93878c81b 100644 --- a/spacy/ml/extract_ngrams.py +++ b/spacy/ml/extract_ngrams.py @@ -23,10 +23,7 @@ def forward(model: Model, docs, is_train: bool): keys, vals = model.ops.xp.unique(keys, return_counts=True) batch_keys.append(keys) batch_vals.append(vals) - # The dtype here matches what thinc is expecting -- which differs per - # platform (by int definition). This should be fixed once the problem - # is fixed on Thinc's side. - lengths = model.ops.asarray([arr.shape[0] for arr in batch_keys], dtype=numpy.int_) + lengths = model.ops.asarray([arr.shape[0] for arr in batch_keys], dtype="int32") batch_keys = model.ops.xp.concatenate(batch_keys) batch_vals = model.ops.asarray(model.ops.xp.concatenate(batch_vals), dtype="f") diff --git a/spacy/ml/models/__init__.py b/spacy/ml/models/__init__.py index 67e70421f..f03237019 100644 --- a/spacy/ml/models/__init__.py +++ b/spacy/ml/models/__init__.py @@ -1,4 +1,5 @@ from .entity_linker import * # noqa +from .multi_task import * # noqa from .parser import * # noqa from .tagger import * # noqa from .textcat import * # noqa diff --git a/spacy/ml/models/multi_task.py b/spacy/ml/models/multi_task.py index ac990c015..7c0589bff 100644 --- a/spacy/ml/models/multi_task.py +++ b/spacy/ml/models/multi_task.py @@ -1,7 +1,14 @@ -from typing import Optional, Iterable, Tuple, List, TYPE_CHECKING -import numpy +from typing import Optional, Iterable, Tuple, List, Callable, TYPE_CHECKING from thinc.api import chain, Maxout, LayerNorm, Softmax, Linear, zero_init, Model from thinc.api import MultiSoftmax, list2array +from thinc.api import to_categorical, CosineDistance, L2Distance + +from ...util import registry +from ...errors import Errors +from ...attrs import ID + +import numpy +from functools import partial if TYPE_CHECKING: # This lets us add type hints for mypy etc. without causing circular imports @@ -9,6 +16,74 @@ if TYPE_CHECKING: from ...tokens import Doc # noqa: F401 +@registry.architectures.register("spacy.PretrainVectors.v1") +def create_pretrain_vectors( + maxout_pieces: int, hidden_size: int, loss: str +) -> Callable[["Vocab", Model], Model]: + def create_vectors_objective(vocab: "Vocab", tok2vec: Model) -> Model: + model = build_cloze_multi_task_model( + vocab, tok2vec, hidden_size=hidden_size, maxout_pieces=maxout_pieces + ) + model.attrs["loss"] = create_vectors_loss() + return model + + def create_vectors_loss() -> Callable: + if loss == "cosine": + distance = CosineDistance(normalize=True, ignore_zeros=True) + return partial(get_vectors_loss, distance=distance) + elif loss == "L2": + distance = L2Distance(normalize=True) + return partial(get_vectors_loss, distance=distance) + else: + raise ValueError(Errors.E906.format(found=loss, supported="'cosine', 'L2'")) + + return create_vectors_objective + + +@registry.architectures.register("spacy.PretrainCharacters.v1") +def create_pretrain_characters( + maxout_pieces: int, hidden_size: int, n_characters: int +) -> Callable[["Vocab", Model], Model]: + def create_characters_objective(vocab: "Vocab", tok2vec: Model) -> Model: + model = build_cloze_characters_multi_task_model( + vocab, + tok2vec, + hidden_size=hidden_size, + maxout_pieces=maxout_pieces, + nr_char=n_characters, + ) + model.attrs["loss"] = partial(get_characters_loss, nr_char=n_characters) + return model + + return create_characters_objective + + +def get_vectors_loss(ops, docs, prediction, distance): + """Compute a loss based on a distance between the documents' vectors and + the prediction. + """ + # The simplest way to implement this would be to vstack the + # token.vector values, but that's a bit inefficient, especially on GPU. + # Instead we fetch the index into the vectors table for each of our tokens, + # and look them up all at once. This prevents data copying. + ids = ops.flatten([doc.to_array(ID).ravel() for doc in docs]) + target = docs[0].vocab.vectors.data[ids] + d_target, loss = distance(prediction, target) + return loss, d_target + + +def get_characters_loss(ops, docs, prediction, nr_char): + """Compute a loss based on a number of characters predicted from the docs.""" + target_ids = numpy.vstack([doc.to_utf8_array(nr_char=nr_char) for doc in docs]) + target_ids = target_ids.reshape((-1,)) + target = ops.asarray(to_categorical(target_ids, n_classes=256), dtype="f") + target = target.reshape((-1, 256 * nr_char)) + diff = prediction - target + loss = (diff ** 2).sum() + d_target = diff / float(prediction.shape[0]) + return loss, d_target + + def build_multi_task_model( tok2vec: Model, maxout_pieces: int, @@ -33,23 +108,19 @@ def build_multi_task_model( def build_cloze_multi_task_model( - vocab: "Vocab", - tok2vec: Model, - maxout_pieces: int, - hidden_size: int, - nO: Optional[int] = None, + vocab: "Vocab", tok2vec: Model, maxout_pieces: int, hidden_size: int ) -> Model: - # nO = vocab.vectors.data.shape[1] + nO = vocab.vectors.data.shape[1] output_layer = chain( list2array(), Maxout( - nO=nO, + nO=hidden_size, nI=tok2vec.get_dim("nO"), nP=maxout_pieces, normalize=True, dropout=0.0, ), - Linear(nO=nO, nI=nO, init_W=zero_init), + Linear(nO=nO, nI=hidden_size, init_W=zero_init), ) model = chain(tok2vec, output_layer) model = build_masked_language_model(vocab, model) diff --git a/spacy/ml/models/textcat.py b/spacy/ml/models/textcat.py index d4aed2839..2ec036810 100644 --- a/spacy/ml/models/textcat.py +++ b/spacy/ml/models/textcat.py @@ -61,14 +61,14 @@ def build_bow_text_classifier( @registry.architectures.register("spacy.TextCatEnsemble.v2") -def build_text_classifier( +def build_text_classifier_v2( tok2vec: Model[List[Doc], List[Floats2d]], linear_model: Model[List[Doc], Floats2d], nO: Optional[int] = None, ) -> Model[List[Doc], Floats2d]: exclusive_classes = not linear_model.attrs["multi_label"] with Model.define_operators({">>": chain, "|": concatenate}): - width = tok2vec.get_dim("nO") + width = tok2vec.maybe_get_dim("nO") cnn_model = ( tok2vec >> list2ragged() @@ -94,7 +94,7 @@ def build_text_classifier( # TODO: move to legacy @registry.architectures.register("spacy.TextCatEnsemble.v1") -def build_text_classifier( +def build_text_classifier_v1( width: int, embed_size: int, pretrained_vectors: Optional[bool], diff --git a/spacy/ml/staticvectors.py b/spacy/ml/staticvectors.py index f0213a9b8..71d825905 100644 --- a/spacy/ml/staticvectors.py +++ b/spacy/ml/staticvectors.py @@ -42,9 +42,13 @@ def forward( rows = model.ops.flatten( [doc.vocab.vectors.find(keys=doc.to_array(key_attr)) for doc in docs] ) + try: + vectors_data = model.ops.gemm(model.ops.as_contig(V[rows]), W, trans2=True) + except ValueError: + raise RuntimeError(Errors.E896) output = Ragged( - model.ops.gemm(model.ops.as_contig(V[rows]), W, trans2=True), - model.ops.asarray([len(doc) for doc in docs], dtype="i"), + vectors_data, + model.ops.asarray([len(doc) for doc in docs], dtype="i") ) mask = None if is_train: diff --git a/spacy/pipeline/_parser_internals/__init__.pxd b/spacy/pipeline/_parser_internals/__init__.pxd new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/pipeline/_parser_internals/_beam_utils.pxd b/spacy/pipeline/_parser_internals/_beam_utils.pxd new file mode 100644 index 000000000..de3573fbc --- /dev/null +++ b/spacy/pipeline/_parser_internals/_beam_utils.pxd @@ -0,0 +1,6 @@ +from ...typedefs cimport class_t, hash_t + +# These are passed as callbacks to thinc.search.Beam +cdef int transition_state(void* _dest, void* _src, class_t clas, void* _moves) except -1 + +cdef int check_final_state(void* _state, void* extra_args) except -1 diff --git a/spacy/pipeline/_parser_internals/_beam_utils.pyx b/spacy/pipeline/_parser_internals/_beam_utils.pyx new file mode 100644 index 000000000..a7f34daaf --- /dev/null +++ b/spacy/pipeline/_parser_internals/_beam_utils.pyx @@ -0,0 +1,296 @@ +# cython: infer_types=True +# cython: profile=True +cimport numpy as np +import numpy +from cpython.ref cimport PyObject, Py_XDECREF +from thinc.extra.search cimport Beam +from thinc.extra.search import MaxViolation +from thinc.extra.search cimport MaxViolation + +from ...typedefs cimport hash_t, class_t +from .transition_system cimport TransitionSystem, Transition +from ...errors import Errors +from .stateclass cimport StateC, StateClass + + +# These are passed as callbacks to thinc.search.Beam +cdef int transition_state(void* _dest, void* _src, class_t clas, void* _moves) except -1: + dest = _dest + src = _src + moves = _moves + dest.clone(src) + moves[clas].do(dest, moves[clas].label) + + +cdef int check_final_state(void* _state, void* extra_args) except -1: + state = _state + return state.is_final() + + +cdef class BeamBatch(object): + cdef public TransitionSystem moves + cdef public object states + cdef public object docs + cdef public object golds + cdef public object beams + + def __init__(self, TransitionSystem moves, states, golds, + int width, float density=0.): + cdef StateClass state + self.moves = moves + self.states = states + self.docs = [state.doc for state in states] + self.golds = golds + self.beams = [] + cdef Beam beam + cdef StateC* st + for state in states: + beam = Beam(self.moves.n_moves, width, min_density=density) + beam.initialize(self.moves.init_beam_state, + self.moves.del_beam_state, state.c.length, + state.c._sent) + for i in range(beam.width): + st = beam.at(i) + st.offset = state.c.offset + beam.check_done(check_final_state, NULL) + self.beams.append(beam) + + @property + def is_done(self): + return all(b.is_done for b in self.beams) + + def __getitem__(self, i): + return self.beams[i] + + def __len__(self): + return len(self.beams) + + def get_states(self): + cdef Beam beam + cdef StateC* state + cdef StateClass stcls + states = [] + for beam, doc in zip(self, self.docs): + for i in range(beam.size): + state = beam.at(i) + stcls = StateClass.borrow(state, doc) + states.append(stcls) + return states + + def get_unfinished_states(self): + return [st for st in self.get_states() if not st.is_final()] + + def advance(self, float[:, ::1] scores, follow_gold=False): + cdef Beam beam + cdef int nr_class = scores.shape[1] + cdef const float* c_scores = &scores[0, 0] + docs = self.docs + for i, beam in enumerate(self): + if not beam.is_done: + nr_state = self._set_scores(beam, c_scores, nr_class) + assert nr_state + if self.golds is not None: + self._set_costs( + beam, + docs[i], + self.golds[i], + follow_gold=follow_gold + ) + c_scores += nr_state * nr_class + beam.advance(transition_state, NULL, self.moves.c) + beam.check_done(check_final_state, NULL) + + cdef int _set_scores(self, Beam beam, const float* scores, int nr_class) except -1: + cdef int nr_state = 0 + for i in range(beam.size): + state = beam.at(i) + if not state.is_final(): + for j in range(nr_class): + beam.scores[i][j] = scores[nr_state * nr_class + j] + self.moves.set_valid(beam.is_valid[i], state) + nr_state += 1 + else: + for j in range(beam.nr_class): + beam.scores[i][j] = 0 + beam.costs[i][j] = 0 + return nr_state + + def _set_costs(self, Beam beam, doc, gold, int follow_gold=False): + cdef const StateC* state + for i in range(beam.size): + state = beam.at(i) + if state.is_final(): + for j in range(beam.nr_class): + beam.is_valid[i][j] = 0 + beam.costs[i][j] = 9000 + else: + self.moves.set_costs(beam.is_valid[i], beam.costs[i], + state, gold) + if follow_gold: + min_cost = 0 + for j in range(beam.nr_class): + if beam.is_valid[i][j] and beam.costs[i][j] < min_cost: + min_cost = beam.costs[i][j] + for j in range(beam.nr_class): + if beam.costs[i][j] > min_cost: + beam.is_valid[i][j] = 0 + + +def update_beam(TransitionSystem moves, states, golds, model, int width, beam_density=0.0): + cdef MaxViolation violn + pbeam = BeamBatch(moves, states, golds, width=width, density=beam_density) + gbeam = BeamBatch(moves, states, golds, width=width, density=0.0) + cdef StateClass state + beam_maps = [] + backprops = [] + violns = [MaxViolation() for _ in range(len(states))] + dones = [False for _ in states] + while not pbeam.is_done or not gbeam.is_done: + # The beam maps let us find the right row in the flattened scores + # array for each state. States are identified by (example id, + # history). We keep a different beam map for each step (since we'll + # have a flat scores array for each step). The beam map will let us + # take the per-state losses, and compute the gradient for each (step, + # state, class). + # Gather all states from the two beams in a list. Some stats may occur + # in both beams. To figure out which beam each state belonged to, + # we keep two lists of indices, p_indices and g_indices + states, p_indices, g_indices, beam_map = get_unique_states(pbeam, gbeam) + beam_maps.append(beam_map) + if not states: + break + # Now that we have our flat list of states, feed them through the model + scores, bp_scores = model.begin_update(states) + assert scores.size != 0 + # Store the callbacks for the backward pass + backprops.append(bp_scores) + # Unpack the scores for the two beams. The indices arrays + # tell us which example and state the scores-row refers to. + # Now advance the states in the beams. The gold beam is constrained to + # to follow only gold analyses. + if not pbeam.is_done: + pbeam.advance(model.ops.as_contig(scores[p_indices])) + if not gbeam.is_done: + gbeam.advance(model.ops.as_contig(scores[g_indices]), follow_gold=True) + # Track the "maximum violation", to use in the update. + for i, violn in enumerate(violns): + if not dones[i]: + violn.check_crf(pbeam[i], gbeam[i]) + if pbeam[i].is_done and gbeam[i].is_done: + dones[i] = True + histories = [] + grads = [] + for violn in violns: + if violn.p_hist: + histories.append(violn.p_hist + violn.g_hist) + d_loss = [d_l * violn.cost for d_l in violn.p_probs + violn.g_probs] + grads.append(d_loss) + else: + histories.append([]) + grads.append([]) + loss = 0.0 + states_d_scores = get_gradient(moves.n_moves, beam_maps, histories, grads) + for i, (d_scores, bp_scores) in enumerate(zip(states_d_scores, backprops)): + loss += (d_scores**2).mean() + bp_scores(d_scores) + return loss + + +def collect_states(beams, docs): + cdef StateClass state + cdef Beam beam + states = [] + for state_or_beam, doc in zip(beams, docs): + if isinstance(state_or_beam, StateClass): + states.append(state_or_beam) + else: + beam = state_or_beam + state = StateClass.borrow(beam.at(0), doc) + states.append(state) + return states + + +def get_unique_states(pbeams, gbeams): + seen = {} + states = [] + p_indices = [] + g_indices = [] + beam_map = {} + docs = pbeams.docs + cdef Beam pbeam, gbeam + if len(pbeams) != len(gbeams): + raise ValueError(Errors.E079.format(pbeams=len(pbeams), gbeams=len(gbeams))) + for eg_id, (pbeam, gbeam, doc) in enumerate(zip(pbeams, gbeams, docs)): + if not pbeam.is_done: + for i in range(pbeam.size): + state = StateClass.borrow(pbeam.at(i), doc) + if not state.is_final(): + key = tuple([eg_id] + pbeam.histories[i]) + if key in seen: + raise ValueError(Errors.E080.format(key=key)) + seen[key] = len(states) + p_indices.append(len(states)) + states.append(state) + beam_map.update(seen) + if not gbeam.is_done: + for i in range(gbeam.size): + state = StateClass.borrow(gbeam.at(i), doc) + if not state.is_final(): + key = tuple([eg_id] + gbeam.histories[i]) + if key in seen: + g_indices.append(seen[key]) + else: + g_indices.append(len(states)) + beam_map[key] = len(states) + states.append(state) + p_indices = numpy.asarray(p_indices, dtype='i') + g_indices = numpy.asarray(g_indices, dtype='i') + return states, p_indices, g_indices, beam_map + + +def get_gradient(nr_class, beam_maps, histories, losses): + """The global model assigns a loss to each parse. The beam scores + are additive, so the same gradient is applied to each action + in the history. This gives the gradient of a single *action* + for a beam state -- so we have "the gradient of loss for taking + action i given history H." + + Histories: Each hitory is a list of actions + Each candidate has a history + Each beam has multiple candidates + Each batch has multiple beams + So history is list of lists of lists of ints + """ + grads = [] + nr_steps = [] + for eg_id, hists in enumerate(histories): + nr_step = 0 + for loss, hist in zip(losses[eg_id], hists): + assert not numpy.isnan(loss) + if loss != 0.0: + nr_step = max(nr_step, len(hist)) + nr_steps.append(nr_step) + for i in range(max(nr_steps)): + grads.append(numpy.zeros((max(beam_maps[i].values())+1, nr_class), + dtype='f')) + if len(histories) != len(losses): + raise ValueError(Errors.E081.format(n_hist=len(histories), losses=len(losses))) + for eg_id, hists in enumerate(histories): + for loss, hist in zip(losses[eg_id], hists): + assert not numpy.isnan(loss) + if loss == 0.0: + continue + key = tuple([eg_id]) + # Adjust loss for length + # We need to do this because each state in a short path is scored + # multiple times, as we add in the average cost when we run out + # of actions. + avg_loss = loss / len(hist) + loss += avg_loss * (nr_steps[eg_id] - len(hist)) + for step, clas in enumerate(hist): + i = beam_maps[step][key] + # In step j, at state i action clas + # resulted in loss + grads[step][i, clas] += loss + key = key + tuple([clas]) + return grads diff --git a/spacy/pipeline/_parser_internals/_state.pxd b/spacy/pipeline/_parser_internals/_state.pxd index 0d0dd8c05..a6bf926f9 100644 --- a/spacy/pipeline/_parser_internals/_state.pxd +++ b/spacy/pipeline/_parser_internals/_state.pxd @@ -1,6 +1,9 @@ from libc.string cimport memcpy, memset from libc.stdlib cimport calloc, free from libc.stdint cimport uint32_t, uint64_t +cimport libcpp +from libcpp.vector cimport vector +from libcpp.set cimport set from cpython.exc cimport PyErr_CheckSignals, PyErr_SetFromErrno from murmurhash.mrmr cimport hash64 @@ -14,89 +17,48 @@ from ...typedefs cimport attr_t cdef inline bint is_space_token(const TokenC* token) nogil: return Lexeme.c_check_flag(token.lex, IS_SPACE) -cdef struct RingBufferC: - int[8] data - int i - int default - -cdef inline int ring_push(RingBufferC* ring, int value) nogil: - ring.data[ring.i] = value - ring.i += 1 - if ring.i >= 8: - ring.i = 0 - -cdef inline int ring_get(RingBufferC* ring, int i) nogil: - if i >= ring.i: - return ring.default - else: - return ring.data[ring.i-i] +cdef struct ArcC: + int head + int child + attr_t label cdef cppclass StateC: - int* _stack - int* _buffer - bint* shifted - TokenC* _sent - SpanC* _ents + int* _heads + const TokenC* _sent + vector[int] _stack + vector[int] _rebuffer + vector[SpanC] _ents + vector[ArcC] _left_arcs + vector[ArcC] _right_arcs + vector[libcpp.bool] _unshiftable + set[int] _sent_starts TokenC _empty_token - RingBufferC _hist int length int offset - int _s_i int _b_i - int _e_i - int _break __init__(const TokenC* sent, int length) nogil: - cdef int PADDING = 5 - this._buffer = calloc(length + (PADDING * 2), sizeof(int)) - this._stack = calloc(length + (PADDING * 2), sizeof(int)) - this.shifted = calloc(length + (PADDING * 2), sizeof(bint)) - this._sent = calloc(length + (PADDING * 2), sizeof(TokenC)) - this._ents = calloc(length + (PADDING * 2), sizeof(SpanC)) - if not (this._buffer and this._stack and this.shifted - and this._sent and this._ents): + this._sent = sent + this._heads = calloc(length, sizeof(int)) + if not (this._sent and this._heads): with gil: PyErr_SetFromErrno(MemoryError) PyErr_CheckSignals() - memset(&this._hist, 0, sizeof(this._hist)) this.offset = 0 - cdef int i - for i in range(length + (PADDING * 2)): - this._ents[i].end = -1 - this._sent[i].l_edge = i - this._sent[i].r_edge = i - for i in range(PADDING): - this._sent[i].lex = &EMPTY_LEXEME - this._sent += PADDING - this._ents += PADDING - this._buffer += PADDING - this._stack += PADDING - this.shifted += PADDING this.length = length - this._break = -1 - this._s_i = 0 this._b_i = 0 - this._e_i = 0 for i in range(length): - this._buffer[i] = i + this._heads[i] = -1 + this._unshiftable.push_back(0) memset(&this._empty_token, 0, sizeof(TokenC)) this._empty_token.lex = &EMPTY_LEXEME - for i in range(length): - this._sent[i] = sent[i] - this._buffer[i] = i - for i in range(length, length+PADDING): - this._sent[i].lex = &EMPTY_LEXEME __dealloc__(): - cdef int PADDING = 5 - free(this._sent - PADDING) - free(this._ents - PADDING) - free(this._buffer - PADDING) - free(this._stack - PADDING) - free(this.shifted - PADDING) + free(this._heads) void set_context_tokens(int* ids, int n) nogil: + cdef int i, j if n == 1: if this.B(0) >= 0: ids[0] = this.B(0) @@ -145,22 +107,18 @@ cdef cppclass StateC: ids[11] = this.R(this.S(1), 1) ids[12] = this.R(this.S(1), 2) elif n == 6: + for i in range(6): + ids[i] = -1 if this.B(0) >= 0: ids[0] = this.B(0) - ids[1] = this.B(0)-1 - else: - ids[0] = -1 - ids[1] = -1 - ids[2] = this.B(1) - ids[3] = this.E(0) - if ids[3] >= 1: - ids[4] = this.E(0)-1 - else: - ids[4] = -1 - if (ids[3]+1) < this.length: - ids[5] = this.E(0)+1 - else: - ids[5] = -1 + if this.entity_is_open(): + ent = this.get_ent() + j = 1 + for i in range(ent.start, this.B(0)): + ids[j] = i + j += 1 + if j >= 6: + break else: # TODO error =/ pass @@ -171,329 +129,256 @@ cdef cppclass StateC: ids[i] = -1 int S(int i) nogil const: - if i >= this._s_i: + if i >= this._stack.size(): return -1 - return this._stack[this._s_i - (i+1)] + elif i < 0: + return -1 + return this._stack.at(this._stack.size() - (i+1)) int B(int i) nogil const: - if (i + this._b_i) >= this.length: + if i < 0: return -1 - return this._buffer[this._b_i + i] - - const TokenC* S_(int i) nogil const: - return this.safe_get(this.S(i)) + elif i < this._rebuffer.size(): + return this._rebuffer.at(this._rebuffer.size() - (i+1)) + else: + b_i = this._b_i + (i - this._rebuffer.size()) + if b_i >= this.length: + return -1 + else: + return b_i const TokenC* B_(int i) nogil const: return this.safe_get(this.B(i)) - const TokenC* H_(int i) nogil const: - return this.safe_get(this.H(i)) - const TokenC* E_(int i) nogil const: return this.safe_get(this.E(i)) - const TokenC* L_(int i, int idx) nogil const: - return this.safe_get(this.L(i, idx)) - - const TokenC* R_(int i, int idx) nogil const: - return this.safe_get(this.R(i, idx)) - const TokenC* safe_get(int i) nogil const: if i < 0 or i >= this.length: return &this._empty_token else: return &this._sent[i] - int H(int i) nogil const: - if i < 0 or i >= this.length: + void get_arcs(vector[ArcC]* arcs) nogil const: + for i in range(this._left_arcs.size()): + arc = this._left_arcs.at(i) + if arc.head != -1 and arc.child != -1: + arcs.push_back(arc) + for i in range(this._right_arcs.size()): + arc = this._right_arcs.at(i) + if arc.head != -1 and arc.child != -1: + arcs.push_back(arc) + + int H(int child) nogil const: + if child >= this.length or child < 0: return -1 - return this._sent[i].head + i + else: + return this._heads[child] int E(int i) nogil const: - if this._e_i <= 0 or this._e_i >= this.length: + if this._ents.size() == 0: return -1 - if i < 0 or i >= this._e_i: - return -1 - return this._ents[this._e_i - (i+1)].start + else: + return this._ents.back().start - int L(int i, int idx) nogil const: - if idx < 1: + int L(int head, int idx) nogil const: + if idx < 1 or this._left_arcs.size() == 0: return -1 - if i < 0 or i >= this.length: + cdef vector[int] lefts + for i in range(this._left_arcs.size()): + arc = this._left_arcs.at(i) + if arc.head == head and arc.child != -1 and arc.child < head: + lefts.push_back(arc.child) + idx = (lefts.size()) - idx + if idx < 0: return -1 - cdef const TokenC* target = &this._sent[i] - if target.l_kids < idx: - return -1 - cdef const TokenC* ptr = &this._sent[target.l_edge] + else: + return lefts.at(idx) - while ptr < target: - # If this head is still to the right of us, we can skip to it - # No token that's between this token and this head could be our - # child. - if (ptr.head >= 1) and (ptr + ptr.head) < target: - ptr += ptr.head - - elif ptr + ptr.head == target: - idx -= 1 - if idx == 0: - return ptr - this._sent - ptr += 1 - else: - ptr += 1 - return -1 - - int R(int i, int idx) nogil const: - if idx < 1: + int R(int head, int idx) nogil const: + if idx < 1 or this._right_arcs.size() == 0: return -1 - if i < 0 or i >= this.length: + cdef vector[int] rights + for i in range(this._right_arcs.size()): + arc = this._right_arcs.at(i) + if arc.head == head and arc.child != -1 and arc.child > head: + rights.push_back(arc.child) + idx = (rights.size()) - idx + if idx < 0: return -1 - cdef const TokenC* target = &this._sent[i] - if target.r_kids < idx: - return -1 - cdef const TokenC* ptr = &this._sent[target.r_edge] - while ptr > target: - # If this head is still to the right of us, we can skip to it - # No token that's between this token and this head could be our - # child. - if (ptr.head < 0) and ((ptr + ptr.head) > target): - ptr += ptr.head - elif ptr + ptr.head == target: - idx -= 1 - if idx == 0: - return ptr - this._sent - ptr -= 1 - else: - ptr -= 1 - return -1 + else: + return rights.at(idx) bint empty() nogil const: - return this._s_i <= 0 + return this._stack.size() == 0 bint eol() nogil const: return this.buffer_length() == 0 - bint at_break() nogil const: - return this._break != -1 - bint is_final() nogil const: - return this.stack_depth() <= 0 and this._b_i >= this.length + return this.stack_depth() <= 0 and this.eol() - bint has_head(int i) nogil const: - return this.safe_get(i).head != 0 + int cannot_sent_start(int word) nogil const: + if word < 0 or word >= this.length: + return 0 + elif this._sent[word].sent_start == -1: + return 1 + else: + return 0 - int n_L(int i) nogil const: - return this.safe_get(i).l_kids + int is_sent_start(int word) nogil const: + if word < 0 or word >= this.length: + return 0 + elif this._sent[word].sent_start == 1: + return 1 + elif this._sent_starts.count(word) >= 1: + return 1 + else: + return 0 - int n_R(int i) nogil const: - return this.safe_get(i).r_kids + void set_sent_start(int word, int value) nogil: + if value >= 1: + this._sent_starts.insert(word) + + bint has_head(int child) nogil const: + return this._heads[child] >= 0 + + int l_edge(int word) nogil const: + return word + + int r_edge(int word) nogil const: + return word + + int n_L(int head) nogil const: + cdef int n = 0 + for i in range(this._left_arcs.size()): + arc = this._left_arcs.at(i) + if arc.head == head and arc.child != -1 and arc.child < arc.head: + n += 1 + return n + + int n_R(int head) nogil const: + cdef int n = 0 + for i in range(this._right_arcs.size()): + arc = this._right_arcs.at(i) + if arc.head == head and arc.child != -1 and arc.child > arc.head: + n += 1 + return n bint stack_is_connected() nogil const: return False bint entity_is_open() nogil const: - if this._e_i < 1: + if this._ents.size() == 0: return False - return this._ents[this._e_i-1].end == -1 + else: + return this._ents.back().end == -1 int stack_depth() nogil const: - return this._s_i + return this._stack.size() int buffer_length() nogil const: - if this._break != -1: - return this._break - this._b_i - else: - return this.length - this._b_i - - uint64_t hash() nogil const: - cdef TokenC[11] sig - sig[0] = this.S_(2)[0] - sig[1] = this.S_(1)[0] - sig[2] = this.R_(this.S(1), 1)[0] - sig[3] = this.L_(this.S(0), 1)[0] - sig[4] = this.L_(this.S(0), 2)[0] - sig[5] = this.S_(0)[0] - sig[6] = this.R_(this.S(0), 2)[0] - sig[7] = this.R_(this.S(0), 1)[0] - sig[8] = this.B_(0)[0] - sig[9] = this.E_(0)[0] - sig[10] = this.E_(1)[0] - return hash64(sig, sizeof(sig), this._s_i) \ - + hash64(&this._hist, sizeof(RingBufferC), 1) - - void push_hist(int act) nogil: - ring_push(&this._hist, act+1) - - int get_hist(int i) nogil: - return ring_get(&this._hist, i) + return this.length - this._b_i void push() nogil: - if this.B(0) != -1: - this._stack[this._s_i] = this.B(0) - this._s_i += 1 - this._b_i += 1 - if this.safe_get(this.B_(0).l_edge).sent_start == 1: - this.set_break(this.B_(0).l_edge) - if this._b_i > this._break: - this._break = -1 + b0 = this.B(0) + if this._rebuffer.size(): + b0 = this._rebuffer.back() + this._rebuffer.pop_back() + else: + b0 = this._b_i + this._b_i += 1 + this._stack.push_back(b0) void pop() nogil: - if this._s_i >= 1: - this._s_i -= 1 + this._stack.pop_back() void force_final() nogil: # This should only be used in desperate situations, as it may leave # the analysis in an unexpected state. - this._s_i = 0 + this._stack.clear() this._b_i = this.length void unshift() nogil: - this._b_i -= 1 - this._buffer[this._b_i] = this.S(0) - this._s_i -= 1 - this.shifted[this.B(0)] = True + s0 = this._stack.back() + this._unshiftable[s0] = 1 + this._rebuffer.push_back(s0) + this._stack.pop_back() + + int is_unshiftable(int item) nogil const: + if item >= this._unshiftable.size(): + return 0 + else: + return this._unshiftable.at(item) + + void set_reshiftable(int item) nogil: + if item < this._unshiftable.size(): + this._unshiftable[item] = 0 void add_arc(int head, int child, attr_t label) nogil: if this.has_head(child): this.del_arc(this.H(child), child) - - cdef int dist = head - child - this._sent[child].head = dist - this._sent[child].dep = label - cdef int i - if child > head: - this._sent[head].r_kids += 1 - # Some transition systems can have a word in the buffer have a - # rightward child, e.g. from Unshift. - this._sent[head].r_edge = this._sent[child].r_edge - i = 0 - while this.has_head(head) and i < this.length: - head = this.H(head) - this._sent[head].r_edge = this._sent[child].r_edge - i += 1 # Guard against infinite loops + cdef ArcC arc + arc.head = head + arc.child = child + arc.label = label + if head > child: + this._left_arcs.push_back(arc) else: - this._sent[head].l_kids += 1 - this._sent[head].l_edge = this._sent[child].l_edge + this._right_arcs.push_back(arc) + this._heads[child] = head void del_arc(int h_i, int c_i) nogil: - cdef int dist = h_i - c_i - cdef TokenC* h = &this._sent[h_i] - cdef int i = 0 - if c_i > h_i: - # this.R_(h_i, 2) returns the second-rightmost child token of h_i - # If we have more than 2 rightmost children, our 2nd rightmost child's - # rightmost edge is going to be our new rightmost edge. - h.r_edge = this.R_(h_i, 2).r_edge if h.r_kids >= 2 else h_i - h.r_kids -= 1 - new_edge = h.r_edge - # Correct upwards in the tree --- see Issue #251 - while h.head < 0 and i < this.length: # Guard infinite loop - h += h.head - h.r_edge = new_edge - i += 1 + cdef vector[ArcC]* arcs + if h_i > c_i: + arcs = &this._left_arcs else: - # Same logic applies for left edge, but we don't need to walk up - # the tree, as the head is off the stack. - h.l_edge = this.L_(h_i, 2).l_edge if h.l_kids >= 2 else h_i - h.l_kids -= 1 + arcs = &this._right_arcs + if arcs.size() == 0: + return + arc = arcs.back() + if arc.head == h_i and arc.child == c_i: + arcs.pop_back() + else: + for i in range(arcs.size()-1): + arc = arcs.at(i) + if arc.head == h_i and arc.child == c_i: + arc.head = -1 + arc.child = -1 + arc.label = 0 + break + + SpanC get_ent() nogil const: + cdef SpanC ent + if this._ents.size() == 0: + ent.start = 0 + ent.end = 0 + ent.label = 0 + return ent + else: + return this._ents.back() void open_ent(attr_t label) nogil: - this._ents[this._e_i].start = this.B(0) - this._ents[this._e_i].label = label - this._ents[this._e_i].end = -1 - this._e_i += 1 + cdef SpanC ent + ent.start = this.B(0) + ent.label = label + ent.end = -1 + this._ents.push_back(ent) void close_ent() nogil: - # Note that we don't decrement _e_i here! We want to maintain all - # entities, not over-write them... - this._ents[this._e_i-1].end = this.B(0)+1 - this._sent[this.B(0)].ent_iob = 1 - - void set_ent_tag(int i, int ent_iob, attr_t ent_type) nogil: - if 0 <= i < this.length: - this._sent[i].ent_iob = ent_iob - this._sent[i].ent_type = ent_type - - void set_break(int i) nogil: - if 0 <= i < this.length: - this._sent[i].sent_start = 1 - this._break = this._b_i + this._ents.back().end = this.B(0)+1 void clone(const StateC* src) nogil: this.length = src.length - memcpy(this._sent, src._sent, this.length * sizeof(TokenC)) - memcpy(this._stack, src._stack, this.length * sizeof(int)) - memcpy(this._buffer, src._buffer, this.length * sizeof(int)) - memcpy(this._ents, src._ents, this.length * sizeof(SpanC)) - memcpy(this.shifted, src.shifted, this.length * sizeof(this.shifted[0])) + this._sent = src._sent + this._stack = src._stack + this._rebuffer = src._rebuffer + this._sent_starts = src._sent_starts + this._unshiftable = src._unshiftable + memcpy(this._heads, src._heads, this.length * sizeof(this._heads[0])) + this._ents = src._ents + this._left_arcs = src._left_arcs + this._right_arcs = src._right_arcs this._b_i = src._b_i - this._s_i = src._s_i - this._e_i = src._e_i - this._break = src._break this.offset = src.offset this._empty_token = src._empty_token - - void fast_forward() nogil: - # space token attachement policy: - # - attach space tokens always to the last preceding real token - # - except if it's the beginning of a sentence, then attach to the first following - # - boundary case: a document containing multiple space tokens but nothing else, - # then make the last space token the head of all others - - while is_space_token(this.B_(0)) \ - or this.buffer_length() == 0 \ - or this.stack_depth() == 0: - if this.buffer_length() == 0: - # remove the last sentence's root from the stack - if this.stack_depth() == 1: - this.pop() - # parser got stuck: reduce stack or unshift - elif this.stack_depth() > 1: - if this.has_head(this.S(0)): - this.pop() - else: - this.unshift() - # stack is empty but there is another sentence on the buffer - elif (this.length - this._b_i) >= 1: - this.push() - else: # stack empty and nothing else coming - break - - elif is_space_token(this.B_(0)): - # the normal case: we're somewhere inside a sentence - if this.stack_depth() > 0: - # assert not is_space_token(this.S_(0)) - # attach all coming space tokens to their last preceding - # real token (which should be on the top of the stack) - while is_space_token(this.B_(0)): - this.add_arc(this.S(0),this.B(0),0) - this.push() - this.pop() - # the rare case: we're at the beginning of a document: - # space tokens are attached to the first real token on the buffer - elif this.stack_depth() == 0: - # store all space tokens on the stack until a real token shows up - # or the last token on the buffer is reached - while is_space_token(this.B_(0)) and this.buffer_length() > 1: - this.push() - # empty the stack by attaching all space tokens to the - # first token on the buffer - # boundary case: if all tokens are space tokens, the last one - # becomes the head of all others - while this.stack_depth() > 0: - this.add_arc(this.B(0),this.S(0),0) - this.pop() - # move the first token onto the stack - this.push() - - elif this.stack_depth() == 0: - # for one token sentences (?) - if this.buffer_length() == 1: - this.push() - this.pop() - # with an empty stack and a non-empty buffer - # only shift is valid anyway - elif (this.length - this._b_i) >= 1: - this.push() - - else: # can this even happen? - break diff --git a/spacy/pipeline/_parser_internals/arc_eager.pxd b/spacy/pipeline/_parser_internals/arc_eager.pxd index e05a34f56..3732dd1b7 100644 --- a/spacy/pipeline/_parser_internals/arc_eager.pxd +++ b/spacy/pipeline/_parser_internals/arc_eager.pxd @@ -1,11 +1,7 @@ -from .stateclass cimport StateClass +from ._state cimport StateC from ...typedefs cimport weight_t, attr_t from .transition_system cimport Transition, TransitionSystem cdef class ArcEager(TransitionSystem): pass - - -cdef weight_t push_cost(StateClass stcls, const void* _gold, int target) nogil -cdef weight_t arc_cost(StateClass stcls, const void* _gold, int head, int child) nogil diff --git a/spacy/pipeline/_parser_internals/arc_eager.pyx b/spacy/pipeline/_parser_internals/arc_eager.pyx index 69f015bda..cddb6cbd9 100644 --- a/spacy/pipeline/_parser_internals/arc_eager.pyx +++ b/spacy/pipeline/_parser_internals/arc_eager.pyx @@ -14,16 +14,11 @@ from ._state cimport StateC from ...errors import Errors -# Calculate cost as gold/not gold. We don't use scalar value anyway. -cdef int BINARY_COSTS = 1 cdef weight_t MIN_SCORE = -90000 cdef attr_t SUBTOK_LABEL = hash_string(u'subtok') DEF NON_MONOTONIC = True -DEF USE_BREAK = True -# Break transition from here -# http://www.aclweb.org/anthology/P13-1074 cdef enum: SHIFT REDUCE @@ -61,9 +56,11 @@ cdef struct GoldParseStateC: int32_t* n_kids int32_t length int32_t stride + weight_t push_cost + weight_t pop_cost -cdef GoldParseStateC create_gold_state(Pool mem, StateClass stcls, +cdef GoldParseStateC create_gold_state(Pool mem, const StateC* state, heads, labels, sent_starts) except *: cdef GoldParseStateC gs gs.length = len(heads) @@ -142,10 +139,12 @@ cdef GoldParseStateC create_gold_state(Pool mem, StateClass stcls, if head != i: gs.kids[head][js[head]] = i js[head] += 1 + gs.push_cost = push_cost(state, &gs) + gs.pop_cost = pop_cost(state, &gs) return gs -cdef void update_gold_state(GoldParseStateC* gs, StateClass stcls) nogil: +cdef void update_gold_state(GoldParseStateC* gs, const StateC* s) nogil: for i in range(gs.length): gs.state_bits[i] = set_state_flag( gs.state_bits[i], @@ -160,9 +159,9 @@ cdef void update_gold_state(GoldParseStateC* gs, StateClass stcls) nogil: gs.n_kids_in_stack[i] = 0 gs.n_kids_in_buffer[i] = 0 - for i in range(stcls.stack_depth()): - s_i = stcls.S(i) - if not is_head_unknown(gs, s_i): + for i in range(s.stack_depth()): + s_i = s.S(i) + if not is_head_unknown(gs, s_i) and gs.heads[s_i] != s_i: gs.n_kids_in_stack[gs.heads[s_i]] += 1 for kid in gs.kids[s_i][:gs.n_kids[s_i]]: gs.state_bits[kid] = set_state_flag( @@ -170,9 +169,11 @@ cdef void update_gold_state(GoldParseStateC* gs, StateClass stcls) nogil: HEAD_IN_STACK, 1 ) - for i in range(stcls.buffer_length()): - b_i = stcls.B(i) - if not is_head_unknown(gs, b_i): + for i in range(s.buffer_length()): + b_i = s.B(i) + if s.is_sent_start(b_i): + break + if not is_head_unknown(gs, b_i) and gs.heads[b_i] != b_i: gs.n_kids_in_buffer[gs.heads[b_i]] += 1 for kid in gs.kids[b_i][:gs.n_kids[b_i]]: gs.state_bits[kid] = set_state_flag( @@ -180,6 +181,8 @@ cdef void update_gold_state(GoldParseStateC* gs, StateClass stcls) nogil: HEAD_IN_BUFFER, 1 ) + gs.push_cost = push_cost(s, gs) + gs.pop_cost = pop_cost(s, gs) cdef class ArcEagerGold: @@ -191,17 +194,17 @@ cdef class ArcEagerGold: heads, labels = example.get_aligned_parse(projectivize=True) labels = [label if label is not None else "" for label in labels] labels = [example.x.vocab.strings.add(label) for label in labels] - sent_starts = example.get_aligned("SENT_START") - assert len(heads) == len(labels) == len(sent_starts) - self.c = create_gold_state(self.mem, stcls, heads, labels, sent_starts) + sent_starts = example.get_aligned_sent_starts() + assert len(heads) == len(labels) == len(sent_starts), (len(heads), len(labels), len(sent_starts)) + self.c = create_gold_state(self.mem, stcls.c, heads, labels, sent_starts) def update(self, StateClass stcls): - update_gold_state(&self.c, stcls) + update_gold_state(&self.c, stcls.c) cdef int check_state_gold(char state_bits, char flag) nogil: cdef char one = 1 - return state_bits & (one << flag) + return 1 if (state_bits & (one << flag)) else 0 cdef int set_state_flag(char state_bits, char flag, int value) nogil: @@ -232,41 +235,30 @@ cdef int is_sent_start_unknown(const GoldParseStateC* gold, int i) nogil: # Helper functions for the arc-eager oracle -cdef weight_t push_cost(StateClass stcls, const void* _gold, int target) nogil: - gold = _gold +cdef weight_t push_cost(const StateC* state, const GoldParseStateC* gold) nogil: cdef weight_t cost = 0 - if is_head_in_stack(gold, target): + b0 = state.B(0) + if b0 < 0: + return 9000 + if is_head_in_stack(gold, b0): cost += 1 - cost += gold.n_kids_in_stack[target] - if Break.is_valid(stcls.c, 0) and Break.move_cost(stcls, gold) == 0: + cost += gold.n_kids_in_stack[b0] + if Break.is_valid(state, 0) and is_sent_start(gold, state.B(1)): cost += 1 return cost -cdef weight_t pop_cost(StateClass stcls, const void* _gold, int target) nogil: - gold = _gold +cdef weight_t pop_cost(const StateC* state, const GoldParseStateC* gold) nogil: cdef weight_t cost = 0 - if is_head_in_buffer(gold, target): - cost += 1 - cost += gold[0].n_kids_in_buffer[target] - if Break.is_valid(stcls.c, 0) and Break.move_cost(stcls, gold) == 0: + s0 = state.S(0) + if s0 < 0: + return 9000 + if is_head_in_buffer(gold, s0): cost += 1 + cost += gold.n_kids_in_buffer[s0] return cost -cdef weight_t arc_cost(StateClass stcls, const void* _gold, int head, int child) nogil: - gold = _gold - if arc_is_gold(gold, head, child): - return 0 - elif stcls.H(child) == gold.heads[child]: - return 1 - # Head in buffer - elif is_head_in_buffer(gold, child): - return 1 - else: - return 0 - - cdef bint arc_is_gold(const GoldParseStateC* gold, int head, int child) nogil: if is_head_unknown(gold, child): return True @@ -276,7 +268,7 @@ cdef bint arc_is_gold(const GoldParseStateC* gold, int head, int child) nogil: return False -cdef bint label_is_gold(const GoldParseStateC* gold, int head, int child, attr_t label) nogil: +cdef bint label_is_gold(const GoldParseStateC* gold, int child, attr_t label) nogil: if is_head_unknown(gold, child): return True elif label == 0: @@ -292,218 +284,251 @@ cdef bint _is_gold_root(const GoldParseStateC* gold, int word) nogil: cdef class Shift: + """Move the first word of the buffer onto the stack and mark it as "shifted" + + Validity: + * If stack is empty + * At least two words in sentence + * Word has not been shifted before + + Cost: push_cost + + Action: + * Mark B[0] as 'shifted' + * Push stack + * Advance buffer + """ @staticmethod cdef bint is_valid(const StateC* st, attr_t label) nogil: - sent_start = st._sent[st.B_(0).l_edge].sent_start - return st.buffer_length() >= 2 and not st.shifted[st.B(0)] and sent_start != 1 + if st.stack_depth() == 0: + return 1 + elif st.buffer_length() < 2: + return 0 + elif st.is_sent_start(st.B(0)): + return 0 + elif st.is_unshiftable(st.B(0)): + return 0 + else: + return 1 @staticmethod cdef int transition(StateC* st, attr_t label) nogil: st.push() - st.fast_forward() @staticmethod - cdef weight_t cost(StateClass st, const void* _gold, attr_t label) nogil: + cdef weight_t cost(const StateC* state, const void* _gold, attr_t label) nogil: gold = _gold - return Shift.move_cost(st, gold) + Shift.label_cost(st, gold, label) - - @staticmethod - cdef inline weight_t move_cost(StateClass s, const void* _gold) nogil: - gold = _gold - return push_cost(s, gold, s.B(0)) - - @staticmethod - cdef inline weight_t label_cost(StateClass s, const void* _gold, attr_t label) nogil: - return 0 + return gold.push_cost cdef class Reduce: + """ + Pop from the stack. If it has no head and the stack isn't empty, place + it back on the buffer. + + Validity: + * Stack not empty + * Buffer nt empty + * Stack depth 1 and cannot sent start l_edge(st.B(0)) + + Cost: + * If B[0] is the start of a sentence, cost is 0 + * Arcs between stack and buffer + * If arc has no head, we're saving arcs between S[0] and S[1:], so decrement + cost by those arcs. + """ @staticmethod cdef bint is_valid(const StateC* st, attr_t label) nogil: - return st.stack_depth() >= 2 - - @staticmethod - cdef int transition(StateC* st, attr_t label) nogil: - if st.has_head(st.S(0)): - st.pop() - else: - st.unshift() - st.fast_forward() - - @staticmethod - cdef weight_t cost(StateClass s, const void* _gold, attr_t label) nogil: - gold = _gold - return Reduce.move_cost(s, gold) + Reduce.label_cost(s, gold, label) - - @staticmethod - cdef inline weight_t move_cost(StateClass st, const void* _gold) nogil: - gold = _gold - s0 = st.S(0) - cost = pop_cost(st, gold, s0) - return_to_buffer = not st.has_head(s0) - if return_to_buffer: - # Decrement cost for the arcs we save, as we'll be putting this - # back to the buffer - if is_head_in_stack(gold, s0): - cost -= 1 - cost -= gold.n_kids_in_stack[s0] - if Break.is_valid(st.c, 0) and Break.move_cost(st, gold) == 0: - cost -= 1 - return cost - - @staticmethod - cdef inline weight_t label_cost(StateClass s, const void* gold, attr_t label) nogil: - return 0 - - -cdef class LeftArc: - @staticmethod - cdef bint is_valid(const StateC* st, attr_t label) nogil: - if label == SUBTOK_LABEL and st.S(0) != (st.B(0)-1): - return 0 - sent_start = st._sent[st.B_(0).l_edge].sent_start - return sent_start != 1 - - @staticmethod - cdef int transition(StateC* st, attr_t label) nogil: - st.add_arc(st.B(0), st.S(0), label) - st.pop() - st.fast_forward() - - @staticmethod - cdef inline weight_t cost(StateClass s, const void* _gold, attr_t label) nogil: - gold = _gold - return LeftArc.move_cost(s, gold) + LeftArc.label_cost(s, gold, label) - - @staticmethod - cdef inline weight_t move_cost(StateClass s, const GoldParseStateC* gold) nogil: - cdef weight_t cost = 0 - s0 = s.S(0) - b0 = s.B(0) - if arc_is_gold(gold, b0, s0): - # Have a negative cost if we 'recover' from the wrong dependency - return 0 if not s.has_head(s0) else -1 - else: - # Account for deps we might lose between S0 and stack - if not s.has_head(s0): - cost += gold.n_kids_in_stack[s0] - if is_head_in_buffer(gold, s0): - cost += 1 - return cost + pop_cost(s, gold, s.S(0)) + arc_cost(s, gold, s.B(0), s.S(0)) - - @staticmethod - cdef inline weight_t label_cost(StateClass s, const GoldParseStateC* gold, attr_t label) nogil: - return arc_is_gold(gold, s.B(0), s.S(0)) and not label_is_gold(gold, s.B(0), s.S(0), label) - - -cdef class RightArc: - @staticmethod - cdef bint is_valid(const StateC* st, attr_t label) nogil: - # If there's (perhaps partial) parse pre-set, don't allow cycle. - if label == SUBTOK_LABEL and st.S(0) != (st.B(0)-1): - return 0 - sent_start = st._sent[st.B_(0).l_edge].sent_start - return sent_start != 1 and st.H(st.S(0)) != st.B(0) - - @staticmethod - cdef int transition(StateC* st, attr_t label) nogil: - st.add_arc(st.S(0), st.B(0), label) - st.push() - st.fast_forward() - - @staticmethod - cdef inline weight_t cost(StateClass s, const void* _gold, attr_t label) nogil: - gold = _gold - return RightArc.move_cost(s, gold) + RightArc.label_cost(s, gold, label) - - @staticmethod - cdef inline weight_t move_cost(StateClass s, const void* _gold) nogil: - gold = _gold - if arc_is_gold(gold, s.S(0), s.B(0)): - return 0 - elif s.c.shifted[s.B(0)]: - return push_cost(s, gold, s.B(0)) - else: - return push_cost(s, gold, s.B(0)) + arc_cost(s, gold, s.S(0), s.B(0)) - - @staticmethod - cdef weight_t label_cost(StateClass s, const void* _gold, attr_t label) nogil: - gold = _gold - return arc_is_gold(gold, s.S(0), s.B(0)) and not label_is_gold(gold, s.S(0), s.B(0), label) - - -cdef class Break: - @staticmethod - cdef bint is_valid(const StateC* st, attr_t label) nogil: - cdef int i - if not USE_BREAK: + if st.stack_depth() == 0: return False - elif st.at_break(): - return False - elif st.stack_depth() < 1: - return False - elif st.B_(0).l_edge < 0: - return False - elif st._sent[st.B_(0).l_edge].sent_start < 0: + elif st.buffer_length() == 0: + return True + elif st.stack_depth() == 1 and st.cannot_sent_start(st.l_edge(st.B(0))): return False else: return True @staticmethod cdef int transition(StateC* st, attr_t label) nogil: - st.set_break(st.B_(0).l_edge) - st.fast_forward() - - @staticmethod - cdef weight_t cost(StateClass s, const void* _gold, attr_t label) nogil: - gold = _gold - return Break.move_cost(s, gold) + Break.label_cost(s, gold, label) - - @staticmethod - cdef inline weight_t move_cost(StateClass s, const void* _gold) nogil: - gold = _gold - cost = 0 - for i in range(s.stack_depth()): - S_i = s.S(i) - cost += gold.n_kids_in_buffer[S_i] - if is_head_in_buffer(gold, S_i): - cost += 1 - # It's weird not to check the gold sentence boundaries but if we do, - # we can't account for "sunk costs", i.e. situations where we're already - # wrong. - s0_root = _get_root(s.S(0), gold) - b0_root = _get_root(s.B(0), gold) - if s0_root != b0_root or s0_root == -1 or b0_root == -1: - return cost + if st.has_head(st.S(0)) or st.stack_depth() == 1: + st.pop() else: - return cost + 1 + st.unshift() @staticmethod - cdef inline weight_t label_cost(StateClass s, const void* gold, attr_t label) nogil: - return 0 + cdef weight_t cost(const StateC* state, const void* _gold, attr_t label) nogil: + gold = _gold + if state.is_sent_start(state.B(0)): + return 0 + s0 = state.S(0) + cost = gold.pop_cost + if not state.has_head(s0): + # Decrement cost for the arcs we save, as we'll be putting this + # back to the buffer + if is_head_in_stack(gold, s0): + cost -= 1 + cost -= gold.n_kids_in_stack[s0] + return cost -cdef int _get_root(int word, const GoldParseStateC* gold) nogil: - if is_head_unknown(gold, word): - return -1 - while gold.heads[word] != word and word >= 0: - word = gold.heads[word] - if is_head_unknown(gold, word): - return -1 - else: - return word + +cdef class LeftArc: + """Add an arc between B[0] and S[0], replacing the previous head of S[0] if + one is set. Pop S[0] from the stack. + + Validity: + * len(S) >= 1 + * len(B) >= 1 + * not is_sent_start(B[0]) + + Cost: + pop_cost - Arc(B[0], S[0], label) + (Arc(S[1], S[0]) if H(S[0]) else Arcs(S, S[0])) + """ + @staticmethod + cdef bint is_valid(const StateC* st, attr_t label) nogil: + if st.stack_depth() == 0: + return 0 + elif st.buffer_length() == 0: + return 0 + elif st.is_sent_start(st.B(0)): + return 0 + elif label == SUBTOK_LABEL and st.S(0) != (st.B(0)-1): + return 0 + else: + return 1 + + @staticmethod + cdef int transition(StateC* st, attr_t label) nogil: + st.add_arc(st.B(0), st.S(0), label) + # If we change the stack, it's okay to remove the shifted mark, as + # we can't get in an infinite loop this way. + st.set_reshiftable(st.B(0)) + st.pop() + + @staticmethod + cdef inline weight_t cost(const StateC* state, const void* _gold, attr_t label) nogil: + gold = _gold + cdef weight_t cost = gold.pop_cost + s0 = state.S(0) + s1 = state.S(1) + b0 = state.B(0) + if state.has_head(s0): + # Increment cost if we're clobbering a correct arc + cost += gold.heads[s0] == s1 + else: + # If there's no head, we're losing arcs between S0 and S[1:]. + cost += is_head_in_stack(gold, s0) + cost += gold.n_kids_in_stack[s0] + if b0 != -1 and s0 != -1 and gold.heads[s0] == b0: + cost -= 1 + cost += not label_is_gold(gold, s0, label) + return cost + + +cdef class RightArc: + """ + Add an arc from S[0] to B[0]. Push B[0]. + + Validity: + * len(S) >= 1 + * len(B) >= 1 + * not is_sent_start(B[0]) + + Cost: + push_cost + (not shifted[b0] and Arc(B[1:], B[0])) - Arc(S[0], B[0], label) + """ + @staticmethod + cdef bint is_valid(const StateC* st, attr_t label) nogil: + if st.stack_depth() == 0: + return 0 + elif st.buffer_length() == 0: + return 0 + elif st.is_sent_start(st.B(0)): + return 0 + elif label == SUBTOK_LABEL and st.S(0) != (st.B(0)-1): + # If there's (perhaps partial) parse pre-set, don't allow cycle. + return 0 + else: + return 1 + + @staticmethod + cdef int transition(StateC* st, attr_t label) nogil: + st.add_arc(st.S(0), st.B(0), label) + st.push() + + @staticmethod + cdef inline weight_t cost(const StateC* state, const void* _gold, attr_t label) nogil: + gold = _gold + cost = gold.push_cost + s0 = state.S(0) + b0 = state.B(0) + if s0 != -1 and b0 != -1 and gold.heads[b0] == s0: + cost -= 1 + cost += not label_is_gold(gold, b0, label) + elif is_head_in_buffer(gold, b0) and not state.is_unshiftable(b0): + cost += 1 + return cost + + +cdef class Break: + """Mark the second word of the buffer as the start of a + sentence. + + Validity: + * len(buffer) >= 2 + * B[1] == B[0] + 1 + * not is_sent_start(B[1]) + * not cannot_sent_start(B[1]) + + Action: + * mark_sent_start(B[1]) + + Cost: + * not is_sent_start(B[1]) + * Arcs between B[0] and B[1:] + * Arcs between S and B[1] + """ + @staticmethod + cdef bint is_valid(const StateC* st, attr_t label) nogil: + cdef int i + if st.buffer_length() < 2: + return False + elif st.B(1) != st.B(0) + 1: + return False + elif st.is_sent_start(st.B(1)): + return False + elif st.cannot_sent_start(st.B(1)): + return False + else: + return True + + @staticmethod + cdef int transition(StateC* st, attr_t label) nogil: + st.set_sent_start(st.B(1), 1) + + @staticmethod + cdef weight_t cost(const StateC* state, const void* _gold, attr_t label) nogil: + gold = _gold + cdef int b0 = state.B(0) + cdef int cost = 0 + cdef int si + for i in range(state.stack_depth()): + si = state.S(i) + if is_head_in_buffer(gold, si): + cost += 1 + cost += gold.n_kids_in_buffer[si] + # We need to score into B[1:], so subtract deps that are at b0 + if gold.heads[b0] == si: + cost -= 1 + if gold.heads[si] == b0: + cost -= 1 + if not is_sent_start(gold, state.B(1)) \ + and not is_sent_start_unknown(gold, state.B(1)): + cost += 1 + return cost cdef void* _init_state(Pool mem, int length, void* tokens) except NULL: st = new StateC(tokens, length) - for i in range(st.length): - if st._sent[i].dep == 0: - st._sent[i].l_edge = i - st._sent[i].r_edge = i - st._sent[i].head = 0 - st._sent[i].dep = 0 - st._sent[i].l_kids = 0 - st._sent[i].r_kids = 0 - st.fast_forward() return st @@ -515,6 +540,8 @@ cdef int _del_state(Pool mem, void* state, void* x) except -1: cdef class ArcEager(TransitionSystem): def __init__(self, *args, **kwargs): TransitionSystem.__init__(self, *args, **kwargs) + self.init_beam_state = _init_state + self.del_beam_state = _del_state @classmethod def get_actions(cls, **kwargs): @@ -537,7 +564,7 @@ cdef class ArcEager(TransitionSystem): label = 'ROOT' if head == child: actions[BREAK][label] += 1 - elif head < child: + if head < child: actions[RIGHT][label] += 1 actions[REDUCE][''] += 1 elif head > child: @@ -567,8 +594,14 @@ cdef class ArcEager(TransitionSystem): t.do(state.c, t.label) return state - def is_gold_parse(self, StateClass state, gold): - raise NotImplementedError + def is_gold_parse(self, StateClass state, ArcEagerGold gold): + for i in range(state.c.length): + token = state.c.safe_get(i) + if not arc_is_gold(&gold.c, i, i+token.head): + return False + elif not label_is_gold(&gold.c, i, token.dep): + return False + return True def init_gold(self, StateClass state, Example example): gold = ArcEagerGold(self, state, example) @@ -576,6 +609,7 @@ cdef class ArcEager(TransitionSystem): return gold def init_gold_batch(self, examples): + # TODO: Projectivitity? all_states = self.init_batch([eg.predicted for eg in examples]) golds = [] states = [] @@ -662,24 +696,13 @@ cdef class ArcEager(TransitionSystem): raise ValueError(Errors.E019.format(action=move, src='arc_eager')) return t - cdef int initialize_state(self, StateC* st) nogil: - for i in range(st.length): - if st._sent[i].dep == 0: - st._sent[i].l_edge = i - st._sent[i].r_edge = i - st._sent[i].head = 0 - st._sent[i].dep = 0 - st._sent[i].l_kids = 0 - st._sent[i].r_kids = 0 - st.fast_forward() - - cdef int finalize_state(self, StateC* st) nogil: - cdef int i - for i in range(st.length): - if st._sent[i].head == 0: - st._sent[i].dep = self.root_label - - def finalize_doc(self, Doc doc): + def set_annotations(self, StateClass state, Doc doc): + for arc in state.arcs: + doc.c[arc["child"]].head = arc["head"] - arc["child"] + doc.c[arc["child"]].dep = arc["label"] + for i in range(doc.length): + if doc.c[i].head == 0: + doc.c[i].dep = self.root_label set_children_from_heads(doc.c, 0, doc.length) def has_gold(self, Example eg, start=0, end=None): @@ -690,7 +713,7 @@ cdef class ArcEager(TransitionSystem): return False cdef int set_valid(self, int* output, const StateC* st) nogil: - cdef bint[N_MOVES] is_valid + cdef int[N_MOVES] is_valid is_valid[SHIFT] = Shift.is_valid(st, 0) is_valid[REDUCE] = Reduce.is_valid(st, 0) is_valid[LEFT] = LeftArc.is_valid(st, 0) @@ -710,29 +733,31 @@ cdef class ArcEager(TransitionSystem): gold_state = gold_.c n_gold = 0 if self.c[i].is_valid(stcls.c, self.c[i].label): - cost = self.c[i].get_cost(stcls, &gold_state, self.c[i].label) + cost = self.c[i].get_cost(stcls.c, &gold_state, self.c[i].label) else: cost = 9000 return cost cdef int set_costs(self, int* is_valid, weight_t* costs, - StateClass stcls, gold) except -1: + const StateC* state, gold) except -1: if not isinstance(gold, ArcEagerGold): raise TypeError(Errors.E909.format(name="ArcEagerGold")) cdef ArcEagerGold gold_ = gold - gold_.update(stcls) gold_state = gold_.c + update_gold_state(&gold_state, state) + self.set_valid(is_valid, state) cdef int n_gold = 0 for i in range(self.n_moves): - if self.c[i].is_valid(stcls.c, self.c[i].label): - is_valid[i] = True - costs[i] = self.c[i].get_cost(stcls, &gold_state, self.c[i].label) + if is_valid[i]: + costs[i] = self.c[i].get_cost(state, &gold_state, self.c[i].label) if costs[i] <= 0: n_gold += 1 else: - is_valid[i] = False costs[i] = 9000 if n_gold < 1: + for i in range(self.n_moves): + print(self.get_class_name(i), is_valid[i], costs[i]) + print("Gold sent starts?", is_sent_start(&gold_state, state.B(0)), is_sent_start(&gold_state, state.B(1))) raise ValueError def get_oracle_sequence_from_state(self, StateClass state, ArcEagerGold gold, _debug=None): @@ -748,12 +773,13 @@ cdef class ArcEager(TransitionSystem): failed = False while not state.is_final(): try: - self.set_costs(is_valid, costs, state, gold) + self.set_costs(is_valid, costs, state.c, gold) except ValueError: failed = True break + min_cost = min(costs[i] for i in range(self.n_moves)) for i in range(self.n_moves): - if is_valid[i] and costs[i] <= 0: + if is_valid[i] and costs[i] <= min_cost: action = self.c[i] history.append(i) s0 = state.S(0) @@ -762,9 +788,7 @@ cdef class ArcEager(TransitionSystem): example = _debug debug_log.append(" ".join(( self.get_class_name(i), - "S0=", (example.x[s0].text if s0 >= 0 else "__"), - "B0=", (example.x[b0].text if b0 >= 0 else "__"), - "S0 head?", str(state.has_head(state.S(0))), + state.print_state() ))) action.do(state.c, action.label) break @@ -783,6 +807,8 @@ cdef class ArcEager(TransitionSystem): print("Aligned heads") for i, head in enumerate(aligned_heads): print(example.x[i], example.x[head] if head is not None else "__") + print("Aligned sent starts") + print(example.get_aligned_sent_starts()) print("Predicted tokens") print([(w.i, w.text) for w in example.x]) diff --git a/spacy/pipeline/_parser_internals/ner.pyx b/spacy/pipeline/_parser_internals/ner.pyx index 4f142caaf..7f4d332db 100644 --- a/spacy/pipeline/_parser_internals/ner.pyx +++ b/spacy/pipeline/_parser_internals/ner.pyx @@ -3,9 +3,12 @@ from cymem.cymem cimport Pool from collections import Counter +from ...tokens.doc cimport Doc +from ...tokens.span import Span from ...typedefs cimport weight_t, attr_t from ...lexeme cimport Lexeme from ...attrs cimport IS_SPACE +from ...structs cimport TokenC from ...training.example cimport Example from .stateclass cimport StateClass from ._state cimport StateC @@ -46,17 +49,17 @@ cdef class BiluoGold: def __init__(self, BiluoPushDown moves, StateClass stcls, Example example): self.mem = Pool() - self.c = create_gold_state(self.mem, moves, stcls, example) + self.c = create_gold_state(self.mem, moves, stcls.c, example) def update(self, StateClass stcls): - update_gold_state(&self.c, stcls) + update_gold_state(&self.c, stcls.c) cdef GoldNERStateC create_gold_state( Pool mem, BiluoPushDown moves, - StateClass stcls, + const StateC* stcls, Example example ) except *: cdef GoldNERStateC gs @@ -67,7 +70,7 @@ cdef GoldNERStateC create_gold_state( return gs -cdef void update_gold_state(GoldNERStateC* gs, StateClass stcls) except *: +cdef void update_gold_state(GoldNERStateC* gs, const StateC* state) except *: # We don't need to update each time, unlike the parser. pass @@ -75,14 +78,15 @@ cdef void update_gold_state(GoldNERStateC* gs, StateClass stcls) except *: cdef do_func_t[N_MOVES] do_funcs -cdef bint _entity_is_sunk(StateClass st, Transition* golds) nogil: - if not st.entity_is_open(): +cdef bint _entity_is_sunk(const StateC* state, Transition* golds) nogil: + if not state.entity_is_open(): return False - cdef const Transition* gold = &golds[st.E(0)] + cdef const Transition* gold = &golds[state.E(0)] + ent = state.get_ent() if gold.move != BEGIN and gold.move != UNIT: return True - elif gold.label != st.E_(0).ent_type: + elif gold.label != ent.label: return True else: return False @@ -228,15 +232,18 @@ cdef class BiluoPushDown(TransitionSystem): self.labels[action][label_name] = -1 return 1 - cdef int initialize_state(self, StateC* st) nogil: - # This is especially necessary when we use limited training data. - for i in range(st.length): - if st._sent[i].ent_type != 0: - with gil: - self.add_action(BEGIN, st._sent[i].ent_type) - self.add_action(IN, st._sent[i].ent_type) - self.add_action(UNIT, st._sent[i].ent_type) - self.add_action(LAST, st._sent[i].ent_type) + def set_annotations(self, StateClass state, Doc doc): + cdef int i + ents = [] + for i in range(state.c._ents.size()): + ent = state.c._ents.at(i) + if ent.start != -1 and ent.end != -1: + ents.append(Span(doc, ent.start, ent.end, label=ent.label)) + doc.set_ents(ents, default="unmodified") + # Set non-blocked tokens to O + for i in range(doc.length): + if doc.c[i].ent_iob == 0: + doc.c[i].ent_iob = 2 def init_gold(self, StateClass state, Example example): return BiluoGold(self, state, example) @@ -255,26 +262,25 @@ cdef class BiluoPushDown(TransitionSystem): gold_state = gold_.c n_gold = 0 if self.c[i].is_valid(stcls.c, self.c[i].label): - cost = self.c[i].get_cost(stcls, &gold_state, self.c[i].label) + cost = self.c[i].get_cost(stcls.c, &gold_state, self.c[i].label) else: cost = 9000 return cost cdef int set_costs(self, int* is_valid, weight_t* costs, - StateClass stcls, gold) except -1: + const StateC* state, gold) except -1: if not isinstance(gold, BiluoGold): raise TypeError(Errors.E909.format(name="BiluoGold")) cdef BiluoGold gold_ = gold - gold_.update(stcls) gold_state = gold_.c + update_gold_state(&gold_state, state) n_gold = 0 + self.set_valid(is_valid, state) for i in range(self.n_moves): - if self.c[i].is_valid(stcls.c, self.c[i].label): - is_valid[i] = 1 - costs[i] = self.c[i].get_cost(stcls, &gold_state, self.c[i].label) + if is_valid[i]: + costs[i] = self.c[i].get_cost(state, &gold_state, self.c[i].label) n_gold += costs[i] <= 0 else: - is_valid[i] = 0 costs[i] = 9000 if n_gold < 1: raise ValueError @@ -290,7 +296,7 @@ cdef class Missing: pass @staticmethod - cdef weight_t cost(StateClass s, const void* _gold, attr_t label) nogil: + cdef weight_t cost(const StateC* s, const void* _gold, attr_t label) nogil: return 9000 @@ -299,10 +305,10 @@ cdef class Begin: cdef bint is_valid(const StateC* st, attr_t label) nogil: cdef int preset_ent_iob = st.B_(0).ent_iob cdef attr_t preset_ent_label = st.B_(0).ent_type - # If we're the last token of the input, we can't B -- must U or O. - if st.B(1) == -1: + if st.entity_is_open(): return False - elif st.entity_is_open(): + if st.buffer_length() < 2: + # If we're the last token of the input, we can't B -- must U or O. return False elif label == 0: return False @@ -337,12 +343,11 @@ cdef class Begin: @staticmethod cdef int transition(StateC* st, attr_t label) nogil: st.open_ent(label) - st.set_ent_tag(st.B(0), 3, label) st.push() st.pop() @staticmethod - cdef weight_t cost(StateClass s, const void* _gold, attr_t label) nogil: + cdef weight_t cost(const StateC* s, const void* _gold, attr_t label) nogil: gold = _gold cdef int g_act = gold.ner[s.B(0)].move cdef attr_t g_tag = gold.ner[s.B(0)].label @@ -366,16 +371,17 @@ cdef class Begin: cdef class In: @staticmethod cdef bint is_valid(const StateC* st, attr_t label) nogil: + if not st.entity_is_open(): + return False + if st.buffer_length() < 2: + # If we're at the end, we can't I. + return False + ent = st.get_ent() cdef int preset_ent_iob = st.B_(0).ent_iob cdef attr_t preset_ent_label = st.B_(0).ent_type if label == 0: return False - elif st.E_(0).ent_type != label: - return False - elif not st.entity_is_open(): - return False - elif st.B(1) == -1: - # If we're at the end, we can't I. + elif ent.label != label: return False elif preset_ent_iob == 3: return False @@ -401,12 +407,11 @@ cdef class In: @staticmethod cdef int transition(StateC* st, attr_t label) nogil: - st.set_ent_tag(st.B(0), 1, label) st.push() st.pop() @staticmethod - cdef weight_t cost(StateClass s, const void* _gold, attr_t label) nogil: + cdef weight_t cost(const StateC* s, const void* _gold, attr_t label) nogil: gold = _gold move = IN cdef int next_act = gold.ner[s.B(1)].move if s.B(1) >= 0 else OUT @@ -457,7 +462,7 @@ cdef class Last: # Otherwise, force acceptance, even if we're across a sentence # boundary or the token is whitespace. return True - elif st.E_(0).ent_type != label: + elif st.get_ent().label != label: return False elif st.B_(1).ent_iob == 1: # If a preset entity has I next, we can't L here. @@ -468,12 +473,11 @@ cdef class Last: @staticmethod cdef int transition(StateC* st, attr_t label) nogil: st.close_ent() - st.set_ent_tag(st.B(0), 1, label) st.push() st.pop() @staticmethod - cdef weight_t cost(StateClass s, const void* _gold, attr_t label) nogil: + cdef weight_t cost(const StateC* s, const void* _gold, attr_t label) nogil: gold = _gold move = LAST @@ -537,12 +541,11 @@ cdef class Unit: cdef int transition(StateC* st, attr_t label) nogil: st.open_ent(label) st.close_ent() - st.set_ent_tag(st.B(0), 3, label) st.push() st.pop() @staticmethod - cdef weight_t cost(StateClass s, const void* _gold, attr_t label) nogil: + cdef weight_t cost(const StateC* s, const void* _gold, attr_t label) nogil: gold = _gold cdef int g_act = gold.ner[s.B(0)].move cdef attr_t g_tag = gold.ner[s.B(0)].label @@ -578,12 +581,11 @@ cdef class Out: @staticmethod cdef int transition(StateC* st, attr_t label) nogil: - st.set_ent_tag(st.B(0), 2, 0) st.push() st.pop() @staticmethod - cdef weight_t cost(StateClass s, const void* _gold, attr_t label) nogil: + cdef weight_t cost(const StateC* s, const void* _gold, attr_t label) nogil: gold = _gold cdef int g_act = gold.ner[s.B(0)].move cdef attr_t g_tag = gold.ner[s.B(0)].label diff --git a/spacy/pipeline/_parser_internals/stateclass.pxd b/spacy/pipeline/_parser_internals/stateclass.pxd index 1d9f05538..54ff344b9 100644 --- a/spacy/pipeline/_parser_internals/stateclass.pxd +++ b/spacy/pipeline/_parser_internals/stateclass.pxd @@ -2,30 +2,24 @@ from cymem.cymem cimport Pool from ...structs cimport TokenC, SpanC from ...typedefs cimport attr_t +from ...tokens.doc cimport Doc from ._state cimport StateC cdef class StateClass: - cdef Pool mem cdef StateC* c + cdef readonly Doc doc cdef int _borrowed @staticmethod - cdef inline StateClass init(const TokenC* sent, int length): + cdef inline StateClass borrow(StateC* ptr, Doc doc): cdef StateClass self = StateClass() - self.c = new StateC(sent, length) - return self - - @staticmethod - cdef inline StateClass borrow(StateC* ptr): - cdef StateClass self = StateClass() - del self.c self.c = ptr self._borrowed = 1 + self.doc = doc return self - @staticmethod cdef inline StateClass init_offset(const TokenC* sent, int length, int offset): @@ -33,105 +27,3 @@ cdef class StateClass: self.c = new StateC(sent, length) self.c.offset = offset return self - - cdef inline int S(self, int i) nogil: - return self.c.S(i) - - cdef inline int B(self, int i) nogil: - return self.c.B(i) - - cdef inline const TokenC* S_(self, int i) nogil: - return self.c.S_(i) - - cdef inline const TokenC* B_(self, int i) nogil: - return self.c.B_(i) - - cdef inline const TokenC* H_(self, int i) nogil: - return self.c.H_(i) - - cdef inline const TokenC* E_(self, int i) nogil: - return self.c.E_(i) - - cdef inline const TokenC* L_(self, int i, int idx) nogil: - return self.c.L_(i, idx) - - cdef inline const TokenC* R_(self, int i, int idx) nogil: - return self.c.R_(i, idx) - - cdef inline const TokenC* safe_get(self, int i) nogil: - return self.c.safe_get(i) - - cdef inline int H(self, int i) nogil: - return self.c.H(i) - - cdef inline int E(self, int i) nogil: - return self.c.E(i) - - cdef inline int L(self, int i, int idx) nogil: - return self.c.L(i, idx) - - cdef inline int R(self, int i, int idx) nogil: - return self.c.R(i, idx) - - cdef inline bint empty(self) nogil: - return self.c.empty() - - cdef inline bint eol(self) nogil: - return self.c.eol() - - cdef inline bint at_break(self) nogil: - return self.c.at_break() - - cdef inline bint has_head(self, int i) nogil: - return self.c.has_head(i) - - cdef inline int n_L(self, int i) nogil: - return self.c.n_L(i) - - cdef inline int n_R(self, int i) nogil: - return self.c.n_R(i) - - cdef inline bint stack_is_connected(self) nogil: - return False - - cdef inline bint entity_is_open(self) nogil: - return self.c.entity_is_open() - - cdef inline int stack_depth(self) nogil: - return self.c.stack_depth() - - cdef inline int buffer_length(self) nogil: - return self.c.buffer_length() - - cdef inline void push(self) nogil: - self.c.push() - - cdef inline void pop(self) nogil: - self.c.pop() - - cdef inline void unshift(self) nogil: - self.c.unshift() - - cdef inline void add_arc(self, int head, int child, attr_t label) nogil: - self.c.add_arc(head, child, label) - - cdef inline void del_arc(self, int head, int child) nogil: - self.c.del_arc(head, child) - - cdef inline void open_ent(self, attr_t label) nogil: - self.c.open_ent(label) - - cdef inline void close_ent(self) nogil: - self.c.close_ent() - - cdef inline void set_ent_tag(self, int i, int ent_iob, attr_t ent_type) nogil: - self.c.set_ent_tag(i, ent_iob, ent_type) - - cdef inline void set_break(self, int i) nogil: - self.c.set_break(i) - - cdef inline void clone(self, StateClass src) nogil: - self.c.clone(src.c) - - cdef inline void fast_forward(self) nogil: - self.c.fast_forward() diff --git a/spacy/pipeline/_parser_internals/stateclass.pyx b/spacy/pipeline/_parser_internals/stateclass.pyx index 880cf6cc5..4eaddd997 100644 --- a/spacy/pipeline/_parser_internals/stateclass.pyx +++ b/spacy/pipeline/_parser_internals/stateclass.pyx @@ -1,17 +1,20 @@ # cython: infer_types=True import numpy +from libcpp.vector cimport vector +from ._state cimport ArcC from ...tokens.doc cimport Doc cdef class StateClass: def __init__(self, Doc doc=None, int offset=0): - cdef Pool mem = Pool() - self.mem = mem self._borrowed = 0 if doc is not None: self.c = new StateC(doc.c, doc.length) self.c.offset = offset + self.doc = doc + else: + self.doc = None def __dealloc__(self): if self._borrowed != 1: @@ -19,36 +22,157 @@ cdef class StateClass: @property def stack(self): - return {self.S(i) for i in range(self.c._s_i)} + return [self.S(i) for i in range(self.c.stack_depth())] @property def queue(self): - return {self.B(i) for i in range(self.c.buffer_length())} + return [self.B(i) for i in range(self.c.buffer_length())] @property def token_vector_lenth(self): return self.doc.tensor.shape[1] @property - def history(self): - hist = numpy.ndarray((8,), dtype='i') - for i in range(8): - hist[i] = self.c.get_hist(i+1) - return hist + def arcs(self): + cdef vector[ArcC] arcs + self.c.get_arcs(&arcs) + return list(arcs) + #py_arcs = [] + #for arc in arcs: + # if arc.head != -1 and arc.child != -1: + # py_arcs.append((arc.head, arc.child, arc.label)) + #return arcs + + def add_arc(self, int head, int child, int label): + self.c.add_arc(head, child, label) + + def del_arc(self, int head, int child): + self.c.del_arc(head, child) + + def H(self, int child): + return self.c.H(child) + + def L(self, int head, int idx): + return self.c.L(head, idx) + + def R(self, int head, int idx): + return self.c.R(head, idx) + + @property + def _b_i(self): + return self.c._b_i + + @property + def length(self): + return self.c.length def is_final(self): return self.c.is_final() def copy(self): - cdef StateClass new_state = StateClass.init(self.c._sent, self.c.length) + cdef StateClass new_state = StateClass(doc=self.doc, offset=self.c.offset) new_state.c.clone(self.c) return new_state - def print_state(self, words): + def print_state(self): + words = [token.text for token in self.doc] words = list(words) + ['_'] - top = f"{words[self.S(0)]}_{self.S_(0).head}" - second = f"{words[self.S(1)]}_{self.S_(1).head}" - third = f"{words[self.S(2)]}_{self.S_(2).head}" - n0 = words[self.B(0)] - n1 = words[self.B(1)] - return ' '.join((third, second, top, '|', n0, n1)) + bools = ["F", "T"] + sent_starts = [bools[self.c.is_sent_start(i)] for i in range(len(self.doc))] + shifted = [1 if self.c.is_unshiftable(i) else 0 for i in range(self.c.length)] + shifted.append("") + sent_starts.append("") + top = f"{self.S(0)}{words[self.S(0)]}_{words[self.H(self.S(0))]}_{shifted[self.S(0)]}" + second = f"{self.S(1)}{words[self.S(1)]}_{words[self.H(self.S(1))]}_{shifted[self.S(1)]}" + third = f"{self.S(2)}{words[self.S(2)]}_{words[self.H(self.S(2))]}_{shifted[self.S(2)]}" + n0 = f"{self.B(0)}{words[self.B(0)]}_{sent_starts[self.B(0)]}_{shifted[self.B(0)]}" + n1 = f"{self.B(1)}{words[self.B(1)]}_{sent_starts[self.B(1)]}_{shifted[self.B(1)]}" + return ' '.join((str(self.stack_depth()), str(self.buffer_length()), third, second, top, '|', n0, n1)) + + def S(self, int i): + return self.c.S(i) + + def B(self, int i): + return self.c.B(i) + + def H(self, int i): + return self.c.H(i) + + def E(self, int i): + return self.c.E(i) + + def L(self, int i, int idx): + return self.c.L(i, idx) + + def R(self, int i, int idx): + return self.c.R(i, idx) + + def S_(self, int i): + return self.doc[self.c.S(i)] + + def B_(self, int i): + return self.doc[self.c.B(i)] + + def H_(self, int i): + return self.doc[self.c.H(i)] + + def E_(self, int i): + return self.doc[self.c.E(i)] + + def L_(self, int i, int idx): + return self.doc[self.c.L(i, idx)] + + def R_(self, int i, int idx): + return self.doc[self.c.R(i, idx)] + + def empty(self): + return self.c.empty() + + def eol(self): + return self.c.eol() + + def at_break(self): + return False + #return self.c.at_break() + + def has_head(self, int i): + return self.c.has_head(i) + + def n_L(self, int i): + return self.c.n_L(i) + + def n_R(self, int i): + return self.c.n_R(i) + + def entity_is_open(self): + return self.c.entity_is_open() + + def stack_depth(self): + return self.c.stack_depth() + + def buffer_length(self): + return self.c.buffer_length() + + def push(self): + self.c.push() + + def pop(self): + self.c.pop() + + def unshift(self): + self.c.unshift() + + def add_arc(self, int head, int child, attr_t label): + self.c.add_arc(head, child, label) + + def del_arc(self, int head, int child): + self.c.del_arc(head, child) + + def open_ent(self, attr_t label): + self.c.open_ent(label) + + def close_ent(self): + self.c.close_ent() + + def clone(self, StateClass src): + self.c.clone(src.c) diff --git a/spacy/pipeline/_parser_internals/transition_system.pxd b/spacy/pipeline/_parser_internals/transition_system.pxd index 458f1d5f9..eed347b98 100644 --- a/spacy/pipeline/_parser_internals/transition_system.pxd +++ b/spacy/pipeline/_parser_internals/transition_system.pxd @@ -16,14 +16,14 @@ cdef struct Transition: weight_t score bint (*is_valid)(const StateC* state, attr_t label) nogil - weight_t (*get_cost)(StateClass state, const void* gold, attr_t label) nogil + weight_t (*get_cost)(const StateC* state, const void* gold, attr_t label) nogil int (*do)(StateC* state, attr_t label) nogil -ctypedef weight_t (*get_cost_func_t)(StateClass state, const void* gold, +ctypedef weight_t (*get_cost_func_t)(const StateC* state, const void* gold, attr_tlabel) nogil -ctypedef weight_t (*move_cost_func_t)(StateClass state, const void* gold) nogil -ctypedef weight_t (*label_cost_func_t)(StateClass state, const void* +ctypedef weight_t (*move_cost_func_t)(const StateC* state, const void* gold) nogil +ctypedef weight_t (*label_cost_func_t)(const StateC* state, const void* gold, attr_t label) nogil ctypedef int (*do_func_t)(StateC* state, attr_t label) nogil @@ -41,9 +41,8 @@ cdef class TransitionSystem: cdef public attr_t root_label cdef public freqs cdef public object labels - - cdef int initialize_state(self, StateC* state) nogil - cdef int finalize_state(self, StateC* state) nogil + cdef init_state_t init_beam_state + cdef del_state_t del_beam_state cdef Transition lookup_transition(self, object name) except * @@ -52,4 +51,4 @@ cdef class TransitionSystem: cdef int set_valid(self, int* output, const StateC* st) nogil cdef int set_costs(self, int* is_valid, weight_t* costs, - StateClass state, gold) except -1 + const StateC* state, gold) except -1 diff --git a/spacy/pipeline/_parser_internals/transition_system.pyx b/spacy/pipeline/_parser_internals/transition_system.pyx index 7694e7f34..9bb4f7f5f 100644 --- a/spacy/pipeline/_parser_internals/transition_system.pyx +++ b/spacy/pipeline/_parser_internals/transition_system.pyx @@ -5,6 +5,7 @@ from cymem.cymem cimport Pool from collections import Counter import srsly +from . cimport _beam_utils from ...typedefs cimport weight_t, attr_t from ...tokens.doc cimport Doc from ...structs cimport TokenC @@ -44,6 +45,8 @@ cdef class TransitionSystem: if labels_by_action: self.initialize_actions(labels_by_action, min_freq=min_freq) self.root_label = self.strings.add('ROOT') + self.init_beam_state = _init_state + self.del_beam_state = _del_state def __reduce__(self): return (self.__class__, (self.strings, self.labels), None, None) @@ -54,7 +57,6 @@ cdef class TransitionSystem: offset = 0 for doc in docs: state = StateClass(doc, offset=offset) - self.initialize_state(state.c) states.append(state) offset += len(doc) return states @@ -80,7 +82,7 @@ cdef class TransitionSystem: history = [] debug_log = [] while not state.is_final(): - self.set_costs(is_valid, costs, state, gold) + self.set_costs(is_valid, costs, state.c, gold) for i in range(self.n_moves): if is_valid[i] and costs[i] <= 0: action = self.c[i] @@ -124,15 +126,6 @@ cdef class TransitionSystem: action = self.lookup_transition(name) action.do(state.c, action.label) - cdef int initialize_state(self, StateC* state) nogil: - pass - - cdef int finalize_state(self, StateC* state) nogil: - pass - - def finalize_doc(self, doc): - pass - cdef Transition lookup_transition(self, object name) except *: raise NotImplementedError @@ -151,7 +144,7 @@ cdef class TransitionSystem: is_valid[i] = self.c[i].is_valid(st, self.c[i].label) cdef int set_costs(self, int* is_valid, weight_t* costs, - StateClass stcls, gold) except -1: + const StateC* state, gold) except -1: raise NotImplementedError def get_class_name(self, int clas): diff --git a/spacy/pipeline/dep_parser.pyx b/spacy/pipeline/dep_parser.pyx index a9dcd705e..724eb6cd1 100644 --- a/spacy/pipeline/dep_parser.pyx +++ b/spacy/pipeline/dep_parser.pyx @@ -105,6 +105,93 @@ def make_parser( update_with_oracle_cut_size=update_with_oracle_cut_size, multitasks=[], learn_tokens=learn_tokens, + min_action_freq=min_action_freq, + beam_width=1, + beam_density=0.0, + beam_update_prob=0.0, + ) + +@Language.factory( + "beam_parser", + assigns=["token.dep", "token.head", "token.is_sent_start", "doc.sents"], + default_config={ + "beam_width": 8, + "beam_density": 0.01, + "beam_update_prob": 0.5, + "moves": None, + "update_with_oracle_cut_size": 100, + "learn_tokens": False, + "min_action_freq": 30, + "model": DEFAULT_PARSER_MODEL, + }, + default_score_weights={ + "dep_uas": 0.5, + "dep_las": 0.5, + "dep_las_per_type": None, + "sents_p": None, + "sents_r": None, + "sents_f": 0.0, + }, +) +def make_beam_parser( + nlp: Language, + name: str, + model: Model, + moves: Optional[list], + update_with_oracle_cut_size: int, + learn_tokens: bool, + min_action_freq: int, + beam_width: int, + beam_density: float, + beam_update_prob: float, +): + """Create a transition-based DependencyParser component that uses beam-search. + The dependency parser jointly learns sentence segmentation and labelled + dependency parsing, and can optionally learn to merge tokens that had been + over-segmented by the tokenizer. + + The parser uses a variant of the non-monotonic arc-eager transition-system + described by Honnibal and Johnson (2014), with the addition of a "break" + transition to perform the sentence segmentation. Nivre's pseudo-projective + dependency transformation is used to allow the parser to predict + non-projective parses. + + The parser is trained using a global objective. That is, it learns to assign + probabilities to whole parses. + + model (Model): The model for the transition-based parser. The model needs + to have a specific substructure of named components --- see the + spacy.ml.tb_framework.TransitionModel for details. + moves (List[str]): A list of transition names. Inferred from the data if not + provided. + beam_width (int): The number of candidate analyses to maintain. + beam_density (float): The minimum ratio between the scores of the first and + last candidates in the beam. This allows the parser to avoid exploring + candidates that are too far behind. This is mostly intended to improve + efficiency, but it can also improve accuracy as deeper search is not + always better. + beam_update_prob (float): The chance of making a beam update, instead of a + greedy update. Greedy updates are an approximation for the beam updates, + and are faster to compute. + learn_tokens (bool): Whether to learn to merge subtokens that are split + relative to the gold standard. Experimental. + min_action_freq (int): The minimum frequency of labelled actions to retain. + Rarer labelled actions have their label backed-off to "dep". While this + primarily affects the label accuracy, it can also affect the attachment + structure, as the labels are used to represent the pseudo-projectivity + transformation. + """ + return DependencyParser( + nlp.vocab, + model, + name, + moves=moves, + update_with_oracle_cut_size=update_with_oracle_cut_size, + beam_width=beam_width, + beam_density=beam_density, + beam_update_prob=beam_update_prob, + multitasks=[], + learn_tokens=learn_tokens, min_action_freq=min_action_freq ) diff --git a/spacy/pipeline/entity_linker.py b/spacy/pipeline/entity_linker.py index 3bb449b4d..5ccfe9940 100644 --- a/spacy/pipeline/entity_linker.py +++ b/spacy/pipeline/entity_linker.py @@ -30,7 +30,7 @@ default_model_config = """ pretrained_vectors = null width = 96 depth = 2 -embed_size = 300 +embed_size = 2000 window_size = 1 maxout_pieces = 3 subword_features = true diff --git a/spacy/pipeline/entityruler.py b/spacy/pipeline/entityruler.py index 2a3b8dd00..c3d983dec 100644 --- a/spacy/pipeline/entityruler.py +++ b/spacy/pipeline/entityruler.py @@ -261,7 +261,11 @@ class EntityRuler(Pipe): # disable the nlp components after this one in case they hadn't been initialized / deserialised yet try: - current_index = self.nlp.pipe_names.index(self.name) + current_index = -1 + for i, (name, pipe) in enumerate(self.nlp.pipeline): + if self == pipe: + current_index = i + break subsequent_pipes = [ pipe for pipe in self.nlp.pipe_names[current_index + 1 :] ] diff --git a/spacy/pipeline/lemmatizer.py b/spacy/pipeline/lemmatizer.py index 9be596868..70a224c0b 100644 --- a/spacy/pipeline/lemmatizer.py +++ b/spacy/pipeline/lemmatizer.py @@ -4,7 +4,7 @@ from thinc.api import Model from pathlib import Path from .pipe import Pipe -from ..errors import Errors +from ..errors import Errors, Warnings from ..language import Language from ..training import Example from ..lookups import Lookups, load_lookups @@ -197,6 +197,8 @@ class Lemmatizer(Pipe): string = token.text univ_pos = token.pos_.lower() if univ_pos in ("", "eol", "space"): + if univ_pos == "": + logger.warn(Warnings.W108.format(text=string)) return [string.lower()] # See Issue #435 for example of where this logic is requied. if self.is_base_form(token): diff --git a/spacy/pipeline/morphologizer.pyx b/spacy/pipeline/morphologizer.pyx index a03c7daf0..66e0787ef 100644 --- a/spacy/pipeline/morphologizer.pyx +++ b/spacy/pipeline/morphologizer.pyx @@ -67,9 +67,6 @@ class Morphologizer(Tagger): vocab: Vocab, model: Model, name: str = "morphologizer", - *, - labels_morph: Optional[dict] = None, - labels_pos: Optional[dict] = None, ): """Initialize a morphologizer. @@ -77,8 +74,6 @@ class Morphologizer(Tagger): model (thinc.api.Model): The Thinc Model powering the pipeline component. name (str): The component instance name, used to add entries to the losses during training. - labels_morph (dict): Mapping of morph + POS tags to morph labels. - labels_pos (dict): Mapping of morph + POS tags to POS tags. DOCS: https://nightly.spacy.io/api/morphologizer#init """ @@ -90,11 +85,8 @@ class Morphologizer(Tagger): # store mappings from morph+POS labels to token-level annotations: # 1) labels_morph stores a mapping from morph+POS->morph # 2) labels_pos stores a mapping from morph+POS->POS - cfg = {"labels_morph": labels_morph or {}, "labels_pos": labels_pos or {}} + cfg = {"labels_morph": {}, "labels_pos": {}} self.cfg = dict(sorted(cfg.items())) - # add mappings for empty morph - self.cfg["labels_morph"][Morphology.EMPTY_MORPH] = Morphology.EMPTY_MORPH - self.cfg["labels_pos"][Morphology.EMPTY_MORPH] = POS_IDS[""] @property def labels(self): @@ -201,8 +193,8 @@ class Morphologizer(Tagger): doc_tag_ids = doc_tag_ids.get() for j, tag_id in enumerate(doc_tag_ids): morph = self.labels[tag_id] - doc.c[j].morph = self.vocab.morphology.add(self.cfg["labels_morph"][morph]) - doc.c[j].pos = self.cfg["labels_pos"][morph] + doc.c[j].morph = self.vocab.morphology.add(self.cfg["labels_morph"].get(morph, 0)) + doc.c[j].pos = self.cfg["labels_pos"].get(morph, 0) def get_loss(self, examples, scores): """Find the loss and gradient of loss for the batch of documents and @@ -228,12 +220,12 @@ class Morphologizer(Tagger): # doesn't, so if either is None, treat both as None here so that # truths doesn't end up with an unknown morph+POS combination if pos is None or morph is None: - pos = None - morph = None - label_dict = Morphology.feats_to_dict(morph) - if pos: - label_dict[self.POS_FEAT] = pos - label = self.vocab.strings[self.vocab.morphology.add(label_dict)] + label = None + else: + label_dict = Morphology.feats_to_dict(morph) + if pos: + label_dict[self.POS_FEAT] = pos + label = self.vocab.strings[self.vocab.morphology.add(label_dict)] eg_truths.append(label) truths.append(eg_truths) d_scores, loss = loss_func(scores, truths) diff --git a/spacy/pipeline/multitask.pyx b/spacy/pipeline/multitask.pyx index e1ea49849..9c7bb5914 100644 --- a/spacy/pipeline/multitask.pyx +++ b/spacy/pipeline/multitask.pyx @@ -47,7 +47,7 @@ class MultitaskObjective(Tagger): side-objective. """ - def __init__(self, vocab, model, name="nn_labeller", *, labels, target): + def __init__(self, vocab, model, name="nn_labeller", *, target): self.vocab = vocab self.model = model self.name = name @@ -67,7 +67,7 @@ class MultitaskObjective(Tagger): self.make_label = target else: raise ValueError(Errors.E016) - cfg = {"labels": labels or {}, "target": target} + cfg = {"labels": {}, "target": target} self.cfg = dict(cfg) @property @@ -81,15 +81,18 @@ class MultitaskObjective(Tagger): def set_annotations(self, docs, dep_ids): pass - def initialize(self, get_examples, nlp=None): + def initialize(self, get_examples, nlp=None, labels=None): if not hasattr(get_examples, "__call__"): err = Errors.E930.format(name="MultitaskObjective", obj=type(get_examples)) raise ValueError(err) - for example in get_examples(): - for token in example.y: - label = self.make_label(token) - if label is not None and label not in self.labels: - self.labels[label] = len(self.labels) + if labels is not None: + self.labels = labels + else: + for example in get_examples(): + for token in example.y: + label = self.make_label(token) + if label is not None and label not in self.labels: + self.labels[label] = len(self.labels) self.model.initialize() # TODO: fix initialization by defining X and Y def predict(self, docs): diff --git a/spacy/pipeline/ner.pyx b/spacy/pipeline/ner.pyx index 0f93b43ac..e748d95fd 100644 --- a/spacy/pipeline/ner.pyx +++ b/spacy/pipeline/ner.pyx @@ -82,6 +82,79 @@ def make_ner( multitasks=[], min_action_freq=1, learn_tokens=False, + beam_width=1, + beam_density=0.0, + beam_update_prob=0.0, + ) + +@Language.factory( + "beam_ner", + assigns=["doc.ents", "token.ent_iob", "token.ent_type"], + default_config={ + "moves": None, + "update_with_oracle_cut_size": 100, + "model": DEFAULT_NER_MODEL, + "beam_density": 0.01, + "beam_update_prob": 0.5, + "beam_width": 32 + }, + default_score_weights={"ents_f": 1.0, "ents_p": 0.0, "ents_r": 0.0, "ents_per_type": None}, +) +def make_beam_ner( + nlp: Language, + name: str, + model: Model, + moves: Optional[list], + update_with_oracle_cut_size: int, + beam_width: int, + beam_density: float, + beam_update_prob: float, +): + """Create a transition-based EntityRecognizer component that uses beam-search. + The entity recognizer identifies non-overlapping labelled spans of tokens. + + The transition-based algorithm used encodes certain assumptions that are + effective for "traditional" named entity recognition tasks, but may not be + a good fit for every span identification problem. Specifically, the loss + function optimizes for whole entity accuracy, so if your inter-annotator + agreement on boundary tokens is low, the component will likely perform poorly + on your problem. The transition-based algorithm also assumes that the most + decisive information about your entities will be close to their initial tokens. + If your entities are long and characterised by tokens in their middle, the + component will likely do poorly on your task. + + model (Model): The model for the transition-based parser. The model needs + to have a specific substructure of named components --- see the + spacy.ml.tb_framework.TransitionModel for details. + moves (list[str]): A list of transition names. Inferred from the data if not + provided. + update_with_oracle_cut_size (int): + During training, cut long sequences into shorter segments by creating + intermediate states based on the gold-standard history. The model is + not very sensitive to this parameter, so you usually won't need to change + it. 100 is a good default. + beam_width (int): The number of candidate analyses to maintain. + beam_density (float): The minimum ratio between the scores of the first and + last candidates in the beam. This allows the parser to avoid exploring + candidates that are too far behind. This is mostly intended to improve + efficiency, but it can also improve accuracy as deeper search is not + always better. + beam_update_prob (float): The chance of making a beam update, instead of a + greedy update. Greedy updates are an approximation for the beam updates, + and are faster to compute. + """ + return EntityRecognizer( + nlp.vocab, + model, + name, + moves=moves, + update_with_oracle_cut_size=update_with_oracle_cut_size, + multitasks=[], + min_action_freq=1, + learn_tokens=False, + beam_width=beam_width, + beam_density=beam_density, + beam_update_prob=beam_update_prob, ) diff --git a/spacy/pipeline/tagger.pyx b/spacy/pipeline/tagger.pyx index 16633a7b8..08f09b002 100644 --- a/spacy/pipeline/tagger.pyx +++ b/spacy/pipeline/tagger.pyx @@ -61,14 +61,13 @@ class Tagger(TrainablePipe): DOCS: https://nightly.spacy.io/api/tagger """ - def __init__(self, vocab, model, name="tagger", *, labels=None): + def __init__(self, vocab, model, name="tagger"): """Initialize a part-of-speech tagger. vocab (Vocab): The shared vocabulary. model (thinc.api.Model): The Thinc Model powering the pipeline component. name (str): The component instance name, used to add entries to the losses during training. - labels (List): The set of labels. Defaults to None. DOCS: https://nightly.spacy.io/api/tagger#init """ @@ -76,7 +75,7 @@ class Tagger(TrainablePipe): self.model = model self.name = name self._rehearsal_model = None - cfg = {"labels": labels or []} + cfg = {"labels": []} self.cfg = dict(sorted(cfg.items())) @property diff --git a/spacy/pipeline/transition_parser.pyx b/spacy/pipeline/transition_parser.pyx index 63a8595cc..8aeacbafb 100644 --- a/spacy/pipeline/transition_parser.pyx +++ b/spacy/pipeline/transition_parser.pyx @@ -4,13 +4,14 @@ from cymem.cymem cimport Pool cimport numpy as np from itertools import islice from libcpp.vector cimport vector -from libc.string cimport memset +from libc.string cimport memset, memcpy from libc.stdlib cimport calloc, free import random from typing import Optional import srsly -from thinc.api import set_dropout_rate +from thinc.api import set_dropout_rate, CupyOps +from thinc.extra.search cimport Beam import numpy.random import numpy import warnings @@ -22,6 +23,8 @@ from ..ml.parser_model cimport WeightsC, ActivationsC, SizesC, cpu_log_loss from ..ml.parser_model cimport get_c_weights, get_c_sizes from ..tokens.doc cimport Doc from .trainable_pipe import TrainablePipe +from ._parser_internals cimport _beam_utils +from ._parser_internals import _beam_utils from ..training import validate_examples, validate_get_examples from ..errors import Errors, Warnings @@ -41,9 +44,12 @@ cdef class Parser(TrainablePipe): moves=None, *, update_with_oracle_cut_size, - multitasks=tuple(), min_action_freq, learn_tokens, + beam_width=1, + beam_density=0.0, + beam_update_prob=0.0, + multitasks=tuple(), ): """Create a Parser. @@ -61,7 +67,10 @@ cdef class Parser(TrainablePipe): "update_with_oracle_cut_size": update_with_oracle_cut_size, "multitasks": list(multitasks), "min_action_freq": min_action_freq, - "learn_tokens": learn_tokens + "learn_tokens": learn_tokens, + "beam_width": beam_width, + "beam_density": beam_density, + "beam_update_prob": beam_update_prob } if moves is None: # defined by EntityRecognizer as a BiluoPushDown @@ -183,7 +192,15 @@ cdef class Parser(TrainablePipe): result = self.moves.init_batch(docs) self._resize() return result - return self.greedy_parse(docs, drop=0.0) + if self.cfg["beam_width"] == 1: + return self.greedy_parse(docs, drop=0.0) + else: + return self.beam_parse( + docs, + drop=0.0, + beam_width=self.cfg["beam_width"], + beam_density=self.cfg["beam_density"] + ) def greedy_parse(self, docs, drop=0.): cdef vector[StateC*] states @@ -207,6 +224,31 @@ cdef class Parser(TrainablePipe): del model return batch + def beam_parse(self, docs, int beam_width, float drop=0., beam_density=0.): + cdef Beam beam + cdef Doc doc + batch = _beam_utils.BeamBatch( + self.moves, + self.moves.init_batch(docs), + None, + beam_width, + density=beam_density + ) + # This is pretty dirty, but the NER can resize itself in init_batch, + # if labels are missing. We therefore have to check whether we need to + # expand our model output. + self._resize() + model = self.model.predict(docs) + while not batch.is_done: + states = batch.get_unfinished_states() + if not states: + break + scores = model.predict(states) + batch.advance(scores) + model.clear_memory() + del model + return list(batch) + cdef void _parseC(self, StateC** states, WeightsC weights, SizesC sizes) nogil: cdef int i, j @@ -227,14 +269,13 @@ cdef class Parser(TrainablePipe): unfinished.clear() free_activations(&activations) - def set_annotations(self, docs, states): + def set_annotations(self, docs, states_or_beams): cdef StateClass state + cdef Beam beam cdef Doc doc + states = _beam_utils.collect_states(states_or_beams, docs) for i, (state, doc) in enumerate(zip(states, docs)): - self.moves.finalize_state(state.c) - for j in range(doc.length): - doc.c[j] = state.c._sent[j] - self.moves.finalize_doc(doc) + self.moves.set_annotations(state, doc) for hook in self.postprocesses: hook(doc) @@ -265,7 +306,6 @@ cdef class Parser(TrainablePipe): else: action = self.moves.c[guess] action.do(states[i], action.label) - states[i].push_hist(guess) free(is_valid) def update(self, examples, *, drop=0., set_annotations=False, sgd=None, losses=None): @@ -276,13 +316,23 @@ cdef class Parser(TrainablePipe): validate_examples(examples, "Parser.update") for multitask in self._multitasks: multitask.update(examples, drop=drop, sgd=sgd) + n_examples = len([eg for eg in examples if self.moves.has_gold(eg)]) if n_examples == 0: return losses set_dropout_rate(self.model, drop) - # Prepare the stepwise model, and get the callback for finishing the batch - model, backprop_tok2vec = self.model.begin_update( - [eg.predicted for eg in examples]) + # The probability we use beam update, instead of falling back to + # a greedy update + beam_update_prob = self.cfg["beam_update_prob"] + if self.cfg['beam_width'] >= 2 and numpy.random.random() < beam_update_prob: + return self.update_beam( + examples, + beam_width=self.cfg["beam_width"], + set_annotations=set_annotations, + sgd=sgd, + losses=losses, + beam_density=self.cfg["beam_density"] + ) max_moves = self.cfg["update_with_oracle_cut_size"] if max_moves >= 1: # Chop sequences into lengths of this many words, to make the @@ -296,6 +346,8 @@ cdef class Parser(TrainablePipe): states, golds, _ = self.moves.init_gold_batch(examples) if not states: return losses + model, backprop_tok2vec = self.model.begin_update([eg.x for eg in examples]) + all_states = list(states) states_golds = list(zip(states, golds)) n_moves = 0 @@ -379,6 +431,27 @@ cdef class Parser(TrainablePipe): del tutor return losses + def update_beam(self, examples, *, beam_width, + drop=0., sgd=None, losses=None, set_annotations=False, beam_density=0.0): + states, golds, _ = self.moves.init_gold_batch(examples) + if not states: + return losses + # Prepare the stepwise model, and get the callback for finishing the batch + model, backprop_tok2vec = self.model.begin_update( + [eg.predicted for eg in examples]) + loss = _beam_utils.update_beam( + self.moves, + states, + golds, + model, + beam_width, + beam_density=beam_density, + ) + losses[self.name] += loss + backprop_tok2vec(golds) + if sgd is not None: + self.finish_update(sgd) + def get_batch_loss(self, states, golds, float[:, ::1] scores, losses): cdef StateClass state cdef Pool mem = Pool() @@ -396,7 +469,7 @@ cdef class Parser(TrainablePipe): for i, (state, gold) in enumerate(zip(states, golds)): memset(is_valid, 0, self.moves.n_moves * sizeof(int)) memset(costs, 0, self.moves.n_moves * sizeof(float)) - self.moves.set_costs(is_valid, costs, state, gold) + self.moves.set_costs(is_valid, costs, state.c, gold) for j in range(self.moves.n_moves): if costs[j] <= 0.0 and j in unseen_classes: unseen_classes.remove(j) @@ -539,7 +612,6 @@ cdef class Parser(TrainablePipe): for clas in oracle_actions[i:i+max_length]: action = self.moves.c[clas] action.do(state.c, action.label) - state.c.push_hist(action.clas) if state.is_final(): break if self.moves.has_gold(eg, start_state.B(0), state.B(0)): diff --git a/spacy/schemas.py b/spacy/schemas.py index 9480596f0..3ea611287 100644 --- a/spacy/schemas.py +++ b/spacy/schemas.py @@ -273,6 +273,7 @@ class ModelMetaSchema(BaseModel): version: StrictStr = Field(..., title="Model version") spacy_version: StrictStr = Field("", title="Compatible spaCy version identifier") parent_package: StrictStr = Field("spacy", title="Name of parent spaCy package, e.g. spacy or spacy-nightly") + requirements: List[StrictStr] = Field([], title="Additional Python package dependencies, used for the Python package setup") pipeline: List[StrictStr] = Field([], title="Names of pipeline components") description: StrictStr = Field("", title="Model description") license: StrictStr = Field("", title="Model license") @@ -329,6 +330,7 @@ class ConfigSchemaNlp(BaseModel): before_creation: Optional[Callable[[Type["Language"]], Type["Language"]]] = Field(..., title="Optional callback to modify Language class before initialization") after_creation: Optional[Callable[["Language"], "Language"]] = Field(..., title="Optional callback to modify nlp object after creation and before the pipeline is constructed") after_pipeline_creation: Optional[Callable[["Language"], "Language"]] = Field(..., title="Optional callback to modify nlp object after the pipeline is constructed") + batch_size: Optional[int] = Field(..., title="Default batch size") # fmt: on class Config: @@ -351,9 +353,7 @@ class ConfigSchemaPretrain(BaseModel): batcher: Batcher = Field(..., title="Batcher for the training data") component: str = Field(..., title="Component to find the layer to pretrain") layer: str = Field(..., title="Layer to pretrain. Whole model if empty.") - - # TODO: use a more detailed schema for this? - objective: Dict[str, Any] = Field(..., title="Pretraining objective") + objective: Callable[["Vocab", "Model"], "Model"] = Field(..., title="A function that creates the pretraining objective.") # fmt: on class Config: diff --git a/spacy/scorer.py b/spacy/scorer.py index fe64c23ad..371dbd776 100644 --- a/spacy/scorer.py +++ b/spacy/scorer.py @@ -512,7 +512,7 @@ class Scorer: negative_labels (Iterable[str]): The string values that refer to no annotation (e.g. "NIL") RETURNS (Dict[str, Any]): A dictionary containing the scores. - DOCS (TODO): https://nightly.spacy.io/api/scorer#score_links + DOCS: https://nightly.spacy.io/api/scorer#score_links """ f_per_type = {} for example in examples: @@ -720,44 +720,10 @@ def get_ner_prf(examples: Iterable[Example]) -> Dict[str, Any]: } -############################################################################# -# # The following implementation of roc_auc_score() is adapted from -# scikit-learn, which is distributed under the following license: -# -# New BSD License -# +# scikit-learn, which is distributed under the New BSD License. # Copyright (c) 2007–2019 The scikit-learn developers. -# All rights reserved. -# -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# a. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# b. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# c. Neither the name of the Scikit-learn Developers nor the names of -# its contributors may be used to endorse or promote products -# derived from this software without specific prior written -# permission. -# -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -# DAMAGE. - - +# See licenses/3rd_party_licenses.txt def _roc_auc_score(y_true, y_score): """Compute Area Under the Receiver Operating Characteristic Curve (ROC AUC) from prediction scores. diff --git a/spacy/tests/README.md b/spacy/tests/README.md index 833dc9266..82fabcc77 100644 --- a/spacy/tests/README.md +++ b/spacy/tests/README.md @@ -109,12 +109,12 @@ Loading the models is expensive and not necessary if you're not actually testing ```python def test_doc_token_api_strings(en_vocab): - text = "Give it back! He pleaded." + words = ["Give", "it", "back", "!", "He", "pleaded", "."] pos = ['VERB', 'PRON', 'PART', 'PUNCT', 'PRON', 'VERB', 'PUNCT'] heads = [0, 0, 0, 0, 5, 5, 5] deps = ['ROOT', 'dobj', 'prt', 'punct', 'nsubj', 'ROOT', 'punct'] - doc = Doc(en_vocab, [t.text for t in tokens], pos=pos, heads=heads, deps=deps) + doc = Doc(en_vocab, words=words, pos=pos, heads=heads, deps=deps) assert doc[0].text == 'Give' assert doc[0].lower_ == 'give' assert doc[0].pos_ == 'VERB' diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py index 3733d345d..5abcde153 100644 --- a/spacy/tests/conftest.py +++ b/spacy/tests/conftest.py @@ -172,6 +172,11 @@ def lt_tokenizer(): return get_lang_class("lt")().tokenizer +@pytest.fixture(scope="session") +def mk_tokenizer(): + return get_lang_class("mk")().tokenizer + + @pytest.fixture(scope="session") def ml_tokenizer(): return get_lang_class("ml")().tokenizer diff --git a/spacy/tests/doc/test_doc_api.py b/spacy/tests/doc/test_doc_api.py index db8a6d1c4..e5ed359ee 100644 --- a/spacy/tests/doc/test_doc_api.py +++ b/spacy/tests/doc/test_doc_api.py @@ -123,6 +123,7 @@ def test_doc_api_serialize(en_tokenizer, text): tokens[0].norm_ = "norm" tokens.ents = [(tokens.vocab.strings["PRODUCT"], 0, 1)] tokens[0].ent_kb_id_ = "ent_kb_id" + tokens[0].ent_id_ = "ent_id" new_tokens = Doc(tokens.vocab).from_bytes(tokens.to_bytes()) assert tokens.text == new_tokens.text assert [t.text for t in tokens] == [t.text for t in new_tokens] @@ -130,6 +131,7 @@ def test_doc_api_serialize(en_tokenizer, text): assert new_tokens[0].lemma_ == "lemma" assert new_tokens[0].norm_ == "norm" assert new_tokens[0].ent_kb_id_ == "ent_kb_id" + assert new_tokens[0].ent_id_ == "ent_id" new_tokens = Doc(tokens.vocab).from_bytes( tokens.to_bytes(exclude=["tensor"]), exclude=["tensor"] diff --git a/spacy/tests/doc/test_retokenize_merge.py b/spacy/tests/doc/test_retokenize_merge.py index b483255c8..14e4bc44b 100644 --- a/spacy/tests/doc/test_retokenize_merge.py +++ b/spacy/tests/doc/test_retokenize_merge.py @@ -416,6 +416,13 @@ def test_doc_retokenizer_merge_lex_attrs(en_vocab): assert doc[1].is_stop assert not doc[0].is_stop assert not doc[1].like_num + # Test that norm is only set on tokens + doc = Doc(en_vocab, words=["eins", "zwei", "!", "!"]) + assert doc[0].norm_ == "eins" + with doc.retokenize() as retokenizer: + retokenizer.merge(doc[0:1], attrs={"norm": "1"}) + assert doc[0].norm_ == "1" + assert en_vocab["eins"].norm_ == "eins" def test_retokenize_skip_duplicates(en_vocab): diff --git a/spacy/tests/lang/mk/__init__.py b/spacy/tests/lang/mk/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/mk/test_text.py b/spacy/tests/lang/mk/test_text.py new file mode 100644 index 000000000..bf99d5fd6 --- /dev/null +++ b/spacy/tests/lang/mk/test_text.py @@ -0,0 +1,84 @@ +import pytest +from spacy.lang.mk.lex_attrs import like_num + + +def test_tokenizer_handles_long_text(mk_tokenizer): + text = """ + Во организациските работи или на нашите собранија со членството, никој од нас не зборуваше за + организацијата и идеологијата. Работна беше нашата работа, а не идеолошка. Што се однесува до социјализмот на + Делчев, неговата дејност зборува сама за себе - спротивно. Во суштина, водачите си имаа свои основни погледи и + свои разбирања за положбата и работите, коишто стоеја пред нив и ги завршуваа со голема упорност, настојчивост и + насоченост. Значи, идеологија имаше, само што нивната идеологија имаше своја оригиналност. Македонија денеска, + чиста рожба на животот и положбата во Македонија, кои му служеа како база на неговите побуди, беше дејност која + имаше потреба од ум за да си најде своја смисла. Таквата идеологија и заемното дејство на умот и срцето му + помогнаа на Делчев да не се занесе по патот на својата идеологија... Во суштина, Организацијата и нејзините + водачи имаа свои разбирања за работите и положбата во идеен поглед, но тоа беше врската, животот и положбата во + Македонија и го внесуваа во својата идеологија гласот на своето срце, и на крај, прибегнуваа до умот, + за да најдат смисла или да ѝ дадат. Тоа содејство и заемен сооднос на умот и срцето му помогнаа на Делчев да ја + држи својата идеологија во сообразност со положбата на работите... Водачите навистина направија една жртва + бидејќи на населението не му зборуваа за своите мисли и идеи. Тие се одрекоа од секаква субјективност во своите + мисли. Целта беше да не се зголемуваат целите и задачите како и преданоста во работата. Населението не можеше да + ги разбере овие идеи... + """ + tokens = mk_tokenizer(text) + assert len(tokens) == 297 + + +@pytest.mark.parametrize( + "word,match", + [ + ("10", True), + ("1", True), + ("10.000", True), + ("1000", True), + ("бројка", False), + ("999,0", True), + ("еден", True), + ("два", True), + ("цифра", False), + ("десет", True), + ("сто", True), + ("број", False), + ("илјада", True), + ("илјади", True), + ("милион", True), + (",", False), + ("милијарда", True), + ("билион", True), + ] +) +def test_mk_lex_attrs_like_number(mk_tokenizer, word, match): + tokens = mk_tokenizer(word) + assert len(tokens) == 1 + assert tokens[0].like_num == match + + +@pytest.mark.parametrize( + "word", + [ + "двесте", + "два-три", + "пет-шест" + ] +) +def test_mk_lex_attrs_capitals(word): + assert like_num(word) + assert like_num(word.upper()) + + +@pytest.mark.parametrize( + "word", + [ + "првиот", + "втора", + "четврт", + "четвртата", + "петти", + "петто", + "стоти", + "шеесетите", + "седумдесетите" + ] +) +def test_mk_lex_attrs_like_number_for_ordinal(word): + assert like_num(word) diff --git a/spacy/tests/lang/tr/test_text.py b/spacy/tests/lang/tr/test_text.py index ed7dbb805..6e684af30 100644 --- a/spacy/tests/lang/tr/test_text.py +++ b/spacy/tests/lang/tr/test_text.py @@ -2,6 +2,27 @@ import pytest from spacy.lang.tr.lex_attrs import like_num +def test_tr_tokenizer_handles_long_text(tr_tokenizer): + text = """Pamuk nasıl ipliğe dönüştürülür? + +Sıkıştırılmış balyalar halindeki pamuk, iplik fabrikasına getirildiğinde hem +lifleri birbirine dolaşmıştır, hem de tarladan toplanırken araya bitkinin +parçaları karışmıştır. Üstelik balyalardaki pamuğun cinsi aynı olsa bile kalitesi +değişeceğinden, önce bütün balyaların birbirine karıştırılarak harmanlanması gerekir. + +Daha sonra pamuk yığınları, liflerin açılıp temizlenmesi için tek bir birim halinde +birleştirilmiş çeşitli makinelerden geçirilir.Bunlardan biri, dönen tokmaklarıyla +pamuğu dövüp kabartarak dağınık yumaklar haline getiren ve liflerin arasındaki yabancı +maddeleri temizleyen hallaç makinesidir. Daha sonra tarak makinesine giren pamuk demetleri, +herbirinin yüzeyinde yüzbinlerce incecik iğne bulunan döner silindirlerin arasından geçerek lif lif ayrılır +ve tül inceliğinde gevşek bir örtüye dönüşür. Ama bir sonraki makine bu lifleri dağınık +ve gevşek bir biçimde birbirine yaklaştırarak 2 cm eninde bir pamuk şeridi haline getirir.""" + tokens = tr_tokenizer(text) + assert len(tokens) == 146 + + + + @pytest.mark.parametrize( "word", [ diff --git a/spacy/tests/lang/tr/test_tokenizer.py b/spacy/tests/lang/tr/test_tokenizer.py new file mode 100644 index 000000000..ebab5dc3e --- /dev/null +++ b/spacy/tests/lang/tr/test_tokenizer.py @@ -0,0 +1,152 @@ +import pytest + + +ABBREV_TESTS = [ + ("Dr. Murat Bey ile görüştüm.", ["Dr.", "Murat", "Bey", "ile", "görüştüm", "."]), + ("Dr.la görüştüm.", ["Dr.la", "görüştüm", "."]), + ("Dr.'la görüştüm.", ["Dr.'la", "görüştüm", "."]), + ("TBMM'de çalışıyormuş.", ["TBMM'de", "çalışıyormuş", "."]), + ("Hem İst. hem Ank. bu konuda gayet iyi durumda.", ["Hem", "İst.", "hem", "Ank.", "bu", "konuda", "gayet", "iyi", "durumda", "."]), + ("Hem İst. hem Ank.'da yağış var.", ["Hem", "İst.", "hem", "Ank.'da", "yağış", "var", "."]), + ("Dr.", ["Dr."]), + ("Yrd.Doç.", ["Yrd.Doç."]), + ("Prof.'un", ["Prof.'un"]), + ("Böl.'nde", ["Böl.'nde"]), +] + + + +URL_TESTS = [ + ("Bizler de www.duygu.com.tr adında bir websitesi kurduk.", ["Bizler", "de", "www.duygu.com.tr", "adında", "bir", "websitesi", "kurduk", "."]), + ("Bizler de https://www.duygu.com.tr adında bir websitesi kurduk.", ["Bizler", "de", "https://www.duygu.com.tr", "adında", "bir", "websitesi", "kurduk", "."]), + ("Bizler de www.duygu.com.tr'dan satın aldık.", ["Bizler", "de", "www.duygu.com.tr'dan", "satın", "aldık", "."]), + ("Bizler de https://www.duygu.com.tr'dan satın aldık.", ["Bizler", "de", "https://www.duygu.com.tr'dan", "satın", "aldık", "."]), +] + + + +NUMBER_TESTS = [ + ("Rakamla 6 yazılıydı.", ["Rakamla", "6", "yazılıydı", "."]), + ("Hava -4 dereceydi.", ["Hava", "-4", "dereceydi", "."]), + ("Hava sıcaklığı -4ten +6ya yükseldi.", ["Hava", "sıcaklığı", "-4ten", "+6ya", "yükseldi", "."]), + ("Hava sıcaklığı -4'ten +6'ya yükseldi.", ["Hava", "sıcaklığı", "-4'ten", "+6'ya", "yükseldi", "."]), + ("Yarışta 6. oldum.", ["Yarışta", "6.", "oldum", "."]), + ("Yarışta 438547745. oldum.", ["Yarışta", "438547745.", "oldum", "."]), + ("Kitap IV. Murat hakkında.",["Kitap", "IV.", "Murat", "hakkında", "."]), + #("Bana söylediği sayı 6.", ["Bana", "söylediği", "sayı", "6", "."]), + ("Saat 6'da buluşalım.", ["Saat", "6'da", "buluşalım", "."]), + ("Saat 6dan sonra buluşalım.", ["Saat", "6dan", "sonra", "buluşalım", "."]), + ("6.dan sonra saymadım.", ["6.dan", "sonra", "saymadım", "."]), + ("6.'dan sonra saymadım.", ["6.'dan", "sonra", "saymadım", "."]), + ("Saat 6'ydı.", ["Saat", "6'ydı", "."]), + ("5'te", ["5'te"]), + ("6'da", ["6'da"]), + ("9dan", ["9dan"]), + ("19'da", ["19'da"]), + ("VI'da", ["VI'da"]), + ("5.", ["5."]), + ("72.", ["72."]), + ("VI.", ["VI."]), + ("6.'dan", ["6.'dan"]), + ("19.'dan", ["19.'dan"]), + ("6.dan", ["6.dan"]), + ("16.dan", ["16.dan"]), + ("VI.'dan", ["VI.'dan"]), + ("VI.dan", ["VI.dan"]), + ("Hepsi 1994 yılında oldu.", ["Hepsi", "1994", "yılında", "oldu", "."]), + ("Hepsi 1994'te oldu.", ["Hepsi", "1994'te", "oldu", "."]), + ("2/3 tarihli faturayı bulamadım.", ["2/3", "tarihli", "faturayı", "bulamadım", "."]), + ("2.3 tarihli faturayı bulamadım.", ["2.3", "tarihli", "faturayı", "bulamadım", "."]), + ("2.3. tarihli faturayı bulamadım.", ["2.3.", "tarihli", "faturayı", "bulamadım", "."]), + ("2/3/2020 tarihli faturayı bulamadm.", ["2/3/2020", "tarihli", "faturayı", "bulamadm", "."]), + ("2/3/1987 tarihinden beri burda yaşıyorum.", ["2/3/1987", "tarihinden", "beri", "burda", "yaşıyorum", "."]), + ("2-3-1987 tarihinden beri burdayım.", ["2-3-1987", "tarihinden", "beri", "burdayım", "."]), + ("2.3.1987 tarihinden beri burdayım.", ["2.3.1987", "tarihinden", "beri", "burdayım", "."]), + ("Bu olay 2005-2006 tarihleri arasında oldu.", ["Bu", "olay", "2005", "-", "2006", "tarihleri", "arasında", "oldu", "."]), + ("Bu olay 4/12/2005-21/3/2006 tarihleri arasında oldu.", ["Bu", "olay", "4/12/2005", "-", "21/3/2006", "tarihleri", "arasında", "oldu", ".",]), + ("Ek fıkra: 5/11/2003-4999/3 maddesine göre uygundur.", ["Ek", "fıkra", ":", "5/11/2003", "-", "4999/3", "maddesine", "göre", "uygundur", "."]), + ("2/A alanları: 6831 sayılı Kanunun 2nci maddesinin birinci fıkrasının (A) bendine göre", ["2/A", "alanları", ":", "6831", "sayılı", "Kanunun", "2nci", "maddesinin", "birinci", "fıkrasının", "(", "A", ")", "bendine", "göre"]), + ("ŞEHİTTEĞMENKALMAZ Cad. No: 2/311", ["ŞEHİTTEĞMENKALMAZ", "Cad.", "No", ":", "2/311"]), + ("2-3-2025", ["2-3-2025",]), + ("2/3/2025", ["2/3/2025"]), + ("Yıllardır 0.5 uç kullanıyorum.", ["Yıllardır", "0.5", "uç", "kullanıyorum", "."]), + ("Kan değerlerim 0.5-0.7 arasıydı.", ["Kan", "değerlerim", "0.5", "-", "0.7", "arasıydı", "."]), + ("0.5", ["0.5"]), + ("1/2", ["1/2"]), + ("%1", ["%", "1"]), + ("%1lik", ["%", "1lik"]), + ("%1'lik", ["%", "1'lik"]), + ("%1lik dilim", ["%", "1lik", "dilim"]), + ("%1'lik dilim", ["%", "1'lik", "dilim"]), + ("%1.5", ["%", "1.5"]), + #("%1-%2 arası büyüme bekleniyor.", ["%", "1", "-", "%", "2", "arası", "büyüme", "bekleniyor", "."]), + ("%1-2 arası büyüme bekliyoruz.", ["%", "1", "-", "2", "arası", "büyüme", "bekliyoruz", "."]), + ("%11-12 arası büyüme bekliyoruz.", ["%", "11", "-", "12", "arası", "büyüme", "bekliyoruz", "."]), + ("%1.5luk büyüme bekliyoruz.", ["%", "1.5luk", "büyüme", "bekliyoruz", "."]), + ("Saat 1-2 arası gelin lütfen.", ["Saat", "1", "-", "2", "arası", "gelin", "lütfen", "."]), + ("Saat 15:30 gibi buluşalım.", ["Saat", "15:30", "gibi", "buluşalım", "."]), + ("Saat 15:30'da buluşalım.", ["Saat", "15:30'da", "buluşalım", "."]), + ("Saat 15.30'da buluşalım.", ["Saat", "15.30'da", "buluşalım", "."]), + ("Saat 15.30da buluşalım.", ["Saat", "15.30da", "buluşalım", "."]), + ("Saat 15 civarı buluşalım.", ["Saat", "15", "civarı", "buluşalım", "."]), + ("9’daki otobüse binsek mi?", ["9’daki", "otobüse", "binsek", "mi", "?"]), + ("Okulumuz 3-B şubesi", ["Okulumuz", "3-B", "şubesi"]), + ("Okulumuz 3/B şubesi", ["Okulumuz", "3/B", "şubesi"]), + ("Okulumuz 3B şubesi", ["Okulumuz", "3B", "şubesi"]), + ("Okulumuz 3b şubesi", ["Okulumuz", "3b", "şubesi"]), + ("Antonio Gaudí 20. yüzyılda, 1904-1914 yılları arasında on yıl süren bir reform süreci getirmiştir.", ["Antonio", "Gaudí", "20.", "yüzyılda", ",", "1904", "-", "1914", "yılları", "arasında", "on", "yıl", "süren", "bir", "reform", "süreci", "getirmiştir", "."]), + ("Dizel yakıtın avro bölgesi ortalaması olan 1,165 avroya kıyasla litre başına 1,335 avroya mal olduğunu gösteriyor.", ["Dizel", "yakıtın", "avro", "bölgesi", "ortalaması", "olan", "1,165", "avroya", "kıyasla", "litre", "başına", "1,335", "avroya", "mal", "olduğunu", "gösteriyor", "."]), + ("Marcus Antonius M.Ö. 1 Ocak 49'da, Sezar'dan Vali'nin kendisini barış dostu ilan ettiği bir bildiri yayınlamıştır.", ["Marcus", "Antonius", "M.Ö.", "1", "Ocak", "49'da", ",", "Sezar'dan", "Vali'nin", "kendisini", "barış", "dostu", "ilan", "ettiği", "bir", "bildiri", "yayınlamıştır", "."]) +] + + +PUNCT_TESTS = [ + ("Gitmedim dedim ya!", ["Gitmedim", "dedim", "ya", "!"]), + ("Gitmedim dedim ya!!", ["Gitmedim", "dedim", "ya", "!", "!"]), + ("Gitsek mi?", ["Gitsek", "mi", "?"]), + ("Gitsek mi??", ["Gitsek", "mi", "?", "?"]), + ("Gitsek mi?!?", ["Gitsek", "mi", "?", "!", "?"]), + ("Ankara - Antalya arası otobüs işliyor.", ["Ankara", "-", "Antalya", "arası", "otobüs", "işliyor", "."]), + ("Ankara-Antalya arası otobüs işliyor.", ["Ankara", "-", "Antalya", "arası", "otobüs", "işliyor", "."]), + ("Sen--ben, ya da onlar.", ["Sen", "--", "ben", ",", "ya", "da", "onlar", "."]), + ("Senden, benden, bizden şarkısını biliyor musun?", ["Senden", ",", "benden", ",", "bizden", "şarkısını", "biliyor", "musun", "?"]), + ("Akif'le geldik, sonra da o ayrıldı.", ["Akif'le", "geldik", ",", "sonra", "da", "o", "ayrıldı", "."]), + ("Bu adam ne dedi şimdi???", ["Bu", "adam", "ne", "dedi", "şimdi", "?", "?", "?"]), + ("Yok hasta olmuş, yok annesi hastaymış, bahaneler işte...", ["Yok", "hasta", "olmuş", ",", "yok", "annesi", "hastaymış", ",", "bahaneler", "işte", "..."]), + ("Ankara'dan İstanbul'a ... bir aşk hikayesi.", ["Ankara'dan", "İstanbul'a", "...", "bir", "aşk", "hikayesi", "."]), + ("Ahmet'te", ["Ahmet'te"]), + ("İstanbul'da", ["İstanbul'da"]), +] + +GENERAL_TESTS = [ + ("1914'teki Endurance seferinde, Sir Ernest Shackleton'ın kaptanlığını yaptığı İngiliz Endurance gemisi yirmi sekiz kişi ile Antarktika'yı geçmek üzere yelken açtı.", ["1914'teki", "Endurance", "seferinde", ",", "Sir", "Ernest", "Shackleton'ın", "kaptanlığını", "yaptığı", "İngiliz", "Endurance", "gemisi", "yirmi", "sekiz", "kişi", "ile", "Antarktika'yı", "geçmek", "üzere", "yelken", "açtı", "."]), + ("Danışılan \"%100 Cospedal\" olduğunu belirtti.", ["Danışılan", '"', "%", "100", "Cospedal", '"', "olduğunu", "belirtti", "."]), + ("1976'da parkur artık kullanılmıyordu; 1990'da ise bir yangın, daha sonraları ahırlarla birlikte yıkılacak olan tahta tribünlerden geri kalanları da yok etmişti.", ["1976'da", "parkur", "artık", "kullanılmıyordu", ";", "1990'da", "ise", "bir", "yangın", ",", "daha", "sonraları", "ahırlarla", "birlikte", "yıkılacak", "olan", "tahta", "tribünlerden", "geri", "kalanları", "da", "yok", "etmişti", "."]), + ("Dahiyane bir ameliyat ve zorlu bir rehabilitasyon sürecinden sonra, tamamen iyileştim.", ["Dahiyane", "bir", "ameliyat", "ve", "zorlu", "bir", "rehabilitasyon", "sürecinden", "sonra", ",", "tamamen", "iyileştim", "."]), + ("Yaklaşık iki hafta süren bireysel erken oy kullanma döneminin ardından 5,7 milyondan fazla Floridalı sandık başına gitti.", ["Yaklaşık", "iki", "hafta", "süren", "bireysel", "erken", "oy", "kullanma", "döneminin", "ardından", "5,7", "milyondan", "fazla", "Floridalı", "sandık", "başına", "gitti", "."]), + ("Ancak, bu ABD Çevre Koruma Ajansı'nın dünyayı bu konularda uyarmasının ardından ortaya çıktı.", ["Ancak", ",", "bu", "ABD", "Çevre", "Koruma", "Ajansı'nın", "dünyayı", "bu", "konularda", "uyarmasının", "ardından", "ortaya", "çıktı", "."]), + ("Ortalama şansa ve 10.000 Sterlin değerinde tahvillere sahip bir yatırımcı yılda 125 Sterlin ikramiye kazanabilir.", ["Ortalama", "şansa", "ve", "10.000", "Sterlin", "değerinde", "tahvillere", "sahip", "bir", "yatırımcı", "yılda", "125", "Sterlin", "ikramiye", "kazanabilir", "."]), + ("Granit adaları; Seyşeller ve Tioman ile Saint Helena gibi volkanik adaları kapsar." , ["Granit", "adaları", ";", "Seyşeller", "ve", "Tioman", "ile", "Saint", "Helena", "gibi", "volkanik", "adaları", "kapsar", "."]), + ("Barış antlaşmasıyla İspanya, Amerika'ya Porto Riko, Guam ve Filipinler kolonilerini devretti.", ["Barış", "antlaşmasıyla", "İspanya", ",", "Amerika'ya", "Porto", "Riko", ",", "Guam", "ve", "Filipinler", "kolonilerini", "devretti", "."]), + ("Makedonya\'nın sınır bölgelerini güvence altına alan Philip, büyük bir Makedon ordusu kurdu ve uzun bir fetih seferi için Trakya\'ya doğru yürüdü.", ["Makedonya\'nın", "sınır", "bölgelerini", "güvence", "altına", "alan", "Philip", ",", "büyük", "bir", "Makedon", "ordusu", "kurdu", "ve", "uzun", "bir", "fetih", "seferi", "için", "Trakya\'ya", "doğru", "yürüdü", "."]), + ("Fransız gazetesi Le Figaro'ya göre bu hükumet planı sayesinde 42 milyon Euro kazanç sağlanabilir ve elde edilen paranın 15.5 milyonu ulusal güvenlik için kullanılabilir.", ["Fransız", "gazetesi", "Le", "Figaro'ya", "göre", "bu", "hükumet", "planı", "sayesinde", "42", "milyon", "Euro", "kazanç", "sağlanabilir", "ve", "elde", "edilen", "paranın", "15.5", "milyonu", "ulusal", "güvenlik", "için", "kullanılabilir", "."]), + ("Ortalama şansa ve 10.000 Sterlin değerinde tahvillere sahip bir yatırımcı yılda 125 Sterlin ikramiye kazanabilir.", ["Ortalama", "şansa", "ve", "10.000", "Sterlin", "değerinde", "tahvillere", "sahip", "bir", "yatırımcı", "yılda", "125", "Sterlin", "ikramiye", "kazanabilir", "."]), + ("3 Kasım Salı günü, Ankara Belediye Başkanı 2014'te hükümetle birlikte oluşturulan kentsel gelişim anlaşmasını askıya alma kararı verdi.", ["3", "Kasım", "Salı", "günü", ",", "Ankara", "Belediye", "Başkanı", "2014'te", "hükümetle", "birlikte", "oluşturulan", "kentsel", "gelişim", "anlaşmasını", "askıya", "alma", "kararı", "verdi", "."]), + ("Stalin, Abakumov'u Beria'nın enerji bakanlıkları üzerindeki baskınlığına karşı MGB içinde kendi ağını kurmaya teşvik etmeye başlamıştı.", ["Stalin", ",", "Abakumov'u", "Beria'nın", "enerji", "bakanlıkları", "üzerindeki", "baskınlığına", "karşı", "MGB", "içinde", "kendi", "ağını", "kurmaya", "teşvik", "etmeye", "başlamıştı", "."]), + ("Güney Avrupa'daki kazı alanlarının çoğunluğu gibi, bu bulgu M.Ö. 5. yüzyılın başlar", ["Güney", "Avrupa'daki", "kazı", "alanlarının", "çoğunluğu", "gibi", ",", "bu", "bulgu", "M.Ö.", "5.", "yüzyılın", "başlar"]), + ("Sağlığın bozulması Hitchcock hayatının son yirmi yılında üretimini azalttı.", ["Sağlığın", "bozulması", "Hitchcock", "hayatının", "son", "yirmi", "yılında", "üretimini", "azalttı", "."]), +] + + + +TESTS = (ABBREV_TESTS + URL_TESTS + NUMBER_TESTS + PUNCT_TESTS + GENERAL_TESTS) + + + +@pytest.mark.parametrize("text,expected_tokens", TESTS) +def test_tr_tokenizer_handles_allcases(tr_tokenizer, text, expected_tokens): + tokens = tr_tokenizer(text) + token_list = [token.text for token in tokens if not token.is_space] + print(token_list) + assert expected_tokens == token_list + diff --git a/spacy/tests/matcher/test_matcher_api.py b/spacy/tests/matcher/test_matcher_api.py index 77b09f376..91f843a93 100644 --- a/spacy/tests/matcher/test_matcher_api.py +++ b/spacy/tests/matcher/test_matcher_api.py @@ -457,6 +457,7 @@ def test_attr_pipeline_checks(en_vocab): ([{"IS_LEFT_PUNCT": True}], "``"), ([{"IS_RIGHT_PUNCT": True}], "''"), ([{"IS_STOP": True}], "the"), + ([{"SPACY": True}], "the"), ([{"LIKE_NUM": True}], "1"), ([{"LIKE_URL": True}], "http://example.com"), ([{"LIKE_EMAIL": True}], "mail@example.com"), diff --git a/spacy/tests/package/test_requirements.py b/spacy/tests/package/test_requirements.py index 8145beba9..a0e43ccfa 100644 --- a/spacy/tests/package/test_requirements.py +++ b/spacy/tests/package/test_requirements.py @@ -4,7 +4,9 @@ from pathlib import Path def test_build_dependencies(): # Check that library requirements are pinned exactly the same across different setup files. + # TODO: correct checks for numpy rather than ignoring libs_ignore_requirements = [ + "numpy", "pytest", "pytest-timeout", "mock", @@ -12,6 +14,7 @@ def test_build_dependencies(): ] # ignore language-specific packages that shouldn't be installed by all libs_ignore_setup = [ + "numpy", "fugashi", "natto-py", "pythainlp", @@ -67,7 +70,7 @@ def test_build_dependencies(): line = line.strip().strip(",").strip('"') if not line.startswith("#"): lib, v = _parse_req(line) - if lib: + if lib and lib not in libs_ignore_requirements: req_v = req_dict.get(lib, None) assert (lib + v) == (lib + req_v), ( "{} has different version in pyproject.toml and in requirements.txt: " diff --git a/spacy/tests/parser/test_arc_eager_oracle.py b/spacy/tests/parser/test_arc_eager_oracle.py index 84070db73..fa78301af 100644 --- a/spacy/tests/parser/test_arc_eager_oracle.py +++ b/spacy/tests/parser/test_arc_eager_oracle.py @@ -7,6 +7,7 @@ from spacy.tokens import Doc from spacy.pipeline._parser_internals.nonproj import projectivize from spacy.pipeline._parser_internals.arc_eager import ArcEager from spacy.pipeline.dep_parser import DEFAULT_PARSER_MODEL +from spacy.pipeline._parser_internals.stateclass import StateClass def get_sequence_costs(M, words, heads, deps, transitions): @@ -47,15 +48,24 @@ def test_oracle_four_words(arc_eager, vocab): for dep in deps: arc_eager.add_action(2, dep) # Left arc_eager.add_action(3, dep) # Right - actions = ["L-left", "B-ROOT", "L-left"] + actions = ["S", "L-left", "B-ROOT", "S", "D", "S", "L-left", "S", "D"] state, cost_history = get_sequence_costs(arc_eager, words, heads, deps, actions) + expected_gold = [ + ["S"], + ["B-ROOT", "L-left"], + ["B-ROOT"], + ["S"], + ["D"], + ["S"], + ["L-left"], + ["S"], + ["D"] + ] assert state.is_final() for i, state_costs in enumerate(cost_history): # Check gold moves is 0 cost - assert state_costs[actions[i]] == 0.0, actions[i] - for other_action, cost in state_costs.items(): - if other_action != actions[i]: - assert cost >= 1, (i, other_action) + golds = [act for act, cost in state_costs.items() if cost < 1] + assert golds == expected_gold[i], (i, golds, expected_gold[i]) annot_tuples = [ @@ -169,12 +179,15 @@ def test_oracle_dev_sentence(vocab, arc_eager): . punct said """ expected_transitions = [ + "S", # Shift "Rolls-Royce" "S", # Shift 'Motor' "S", # Shift 'Cars' "L-nn", # Attach 'Cars' to 'Inc.' "L-nn", # Attach 'Motor' to 'Inc.' - "L-nn", # Attach 'Rolls-Royce' to 'Inc.', force shift + "L-nn", # Attach 'Rolls-Royce' to 'Inc.' + "S", # Shift "Inc." "L-nsubj", # Attach 'Inc.' to 'said' + "S", # Shift 'said' "S", # Shift 'it' "L-nsubj", # Attach 'it.' to 'expects' "R-ccomp", # Attach 'expects' to 'said' @@ -204,6 +217,8 @@ def test_oracle_dev_sentence(vocab, arc_eager): "D", # Reduce "steady" "D", # Reduce "expects" "R-punct", # Attach "." to "said" + "D", # Reduce "." + "D", # Reduce "said" ] gold_words = [] @@ -221,10 +236,40 @@ def test_oracle_dev_sentence(vocab, arc_eager): for dep in gold_deps: arc_eager.add_action(2, dep) # Left arc_eager.add_action(3, dep) # Right - doc = Doc(Vocab(), words=gold_words) example = Example.from_dict(doc, {"heads": gold_heads, "deps": gold_deps}) - - ae_oracle_actions = arc_eager.get_oracle_sequence(example) + ae_oracle_actions = arc_eager.get_oracle_sequence(example, _debug=False) ae_oracle_actions = [arc_eager.get_class_name(i) for i in ae_oracle_actions] assert ae_oracle_actions == expected_transitions + + +def test_oracle_bad_tokenization(vocab, arc_eager): + words_deps_heads = """ + [catalase] dep is + : punct is + that nsubj is + is root is + bad comp is + """ + + gold_words = [] + gold_deps = [] + gold_heads = [] + for line in words_deps_heads.strip().split("\n"): + line = line.strip() + if not line: + continue + word, dep, head = line.split() + gold_words.append(word) + gold_deps.append(dep) + gold_heads.append(head) + gold_heads = [gold_words.index(head) for head in gold_heads] + for dep in gold_deps: + arc_eager.add_action(2, dep) # Left + arc_eager.add_action(3, dep) # Right + reference = Doc(Vocab(), words=gold_words, deps=gold_deps, heads=gold_heads) + predicted = Doc(reference.vocab, words=["[", "catalase", "]", ":", "that", "is", "bad"]) + example = Example(predicted=predicted, reference=reference) + ae_oracle_actions = arc_eager.get_oracle_sequence(example, _debug=False) + ae_oracle_actions = [arc_eager.get_class_name(i) for i in ae_oracle_actions] + assert ae_oracle_actions diff --git a/spacy/tests/parser/test_ner.py b/spacy/tests/parser/test_ner.py index b4c22b48d..9ed87329c 100644 --- a/spacy/tests/parser/test_ner.py +++ b/spacy/tests/parser/test_ner.py @@ -54,7 +54,7 @@ def tsys(vocab, entity_types): def test_get_oracle_moves(tsys, doc, entity_annots): example = Example.from_dict(doc, {"entities": entity_annots}) - act_classes = tsys.get_oracle_sequence(example) + act_classes = tsys.get_oracle_sequence(example, _debug=False) names = [tsys.get_class_name(act) for act in act_classes] assert names == ["U-PERSON", "O", "O", "B-GPE", "L-GPE", "O"] diff --git a/spacy/tests/parser/test_nn_beam.py b/spacy/tests/parser/test_nn_beam.py index e69de29bb..1f45b67c8 100644 --- a/spacy/tests/parser/test_nn_beam.py +++ b/spacy/tests/parser/test_nn_beam.py @@ -0,0 +1,144 @@ +# coding: utf8 +from __future__ import unicode_literals + +import pytest +import hypothesis +import hypothesis.strategies +import numpy +from spacy.vocab import Vocab +from spacy.language import Language +from spacy.pipeline import DependencyParser +from spacy.pipeline._parser_internals.arc_eager import ArcEager +from spacy.tokens import Doc +from spacy.pipeline._parser_internals._beam_utils import BeamBatch +from spacy.pipeline._parser_internals.stateclass import StateClass +from spacy.training import Example +from thinc.tests.strategies import ndarrays_of_shape + + +@pytest.fixture(scope="module") +def vocab(): + return Vocab() + + +@pytest.fixture(scope="module") +def moves(vocab): + aeager = ArcEager(vocab.strings, {}) + aeager.add_action(0, "") + aeager.add_action(1, "") + aeager.add_action(2, "nsubj") + aeager.add_action(2, "punct") + aeager.add_action(2, "aux") + aeager.add_action(2, "nsubjpass") + aeager.add_action(3, "dobj") + aeager.add_action(2, "aux") + aeager.add_action(4, "ROOT") + return aeager + + +@pytest.fixture(scope="module") +def docs(vocab): + return [ + Doc( + vocab, + words=["Rats", "bite", "things"], + heads=[1, 1, 1], + deps=["nsubj", "ROOT", "dobj"], + sent_starts=[True, False, False] + ) + ] + + +@pytest.fixture(scope="module") +def examples(docs): + return [Example(doc, doc.copy()) for doc in docs] + + +@pytest.fixture +def states(docs): + return [StateClass(doc) for doc in docs] + + +@pytest.fixture +def tokvecs(docs, vector_size): + output = [] + for doc in docs: + vec = numpy.random.uniform(-0.1, 0.1, (len(doc), vector_size)) + output.append(numpy.asarray(vec)) + return output + + +@pytest.fixture(scope="module") +def batch_size(docs): + return len(docs) + + +@pytest.fixture(scope="module") +def beam_width(): + return 4 + +@pytest.fixture(params=[0.0, 0.5, 1.0]) +def beam_density(request): + return request.param + +@pytest.fixture +def vector_size(): + return 6 + + +@pytest.fixture +def beam(moves, examples, beam_width): + states, golds, _ = moves.init_gold_batch(examples) + return BeamBatch(moves, states, golds, width=beam_width, density=0.0) + + +@pytest.fixture +def scores(moves, batch_size, beam_width): + return numpy.asarray( + numpy.concatenate( + [ + numpy.random.uniform(-0.1, 0.1, (beam_width, moves.n_moves)) + for _ in range(batch_size) + ] + ), dtype="float32") + + +def test_create_beam(beam): + pass + + +def test_beam_advance(beam, scores): + beam.advance(scores) + + +def test_beam_advance_too_few_scores(beam, scores): + n_state = sum(len(beam) for beam in beam) + scores = scores[:n_state] + with pytest.raises(IndexError): + beam.advance(scores[:-1]) + + +def test_beam_parse(examples, beam_width): + nlp = Language() + parser = nlp.add_pipe("beam_parser") + parser.cfg["beam_width"] = beam_width + parser.add_label("nsubj") + parser.initialize(lambda: examples) + doc = nlp.make_doc("Australia is a country") + parser(doc) + + + + +@hypothesis.given(hyp=hypothesis.strategies.data()) +def test_beam_density(moves, examples, beam_width, hyp): + beam_density = float(hyp.draw(hypothesis.strategies.floats(0.0, 1.0, width=32))) + states, golds, _ = moves.init_gold_batch(examples) + beam = BeamBatch(moves, states, golds, width=beam_width, density=beam_density) + n_state = sum(len(beam) for beam in beam) + scores = hyp.draw(ndarrays_of_shape((n_state, moves.n_moves))) + beam.advance(scores) + for b in beam: + beam_probs = b.probs + assert b.min_density == beam_density + assert beam_probs[-1] >= beam_probs[0] * beam_density diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py index ab58ac17b..595bfa537 100644 --- a/spacy/tests/parser/test_preset_sbd.py +++ b/spacy/tests/parser/test_preset_sbd.py @@ -22,6 +22,7 @@ def _parser_example(parser): @pytest.fixture def parser(vocab): + vocab.strings.add("ROOT") config = { "learn_tokens": False, "min_action_freq": 30, @@ -76,13 +77,16 @@ def test_sents_1_2(parser): def test_sents_1_3(parser): doc = Doc(parser.vocab, words=["a", "b", "c", "d"]) - doc[1].sent_start = True - doc[3].sent_start = True + doc[0].is_sent_start = True + doc[1].is_sent_start = True + doc[2].is_sent_start = None + doc[3].is_sent_start = True doc = parser(doc) assert len(list(doc.sents)) >= 3 doc = Doc(parser.vocab, words=["a", "b", "c", "d"]) - doc[1].sent_start = True - doc[2].sent_start = False - doc[3].sent_start = True + doc[0].is_sent_start = True + doc[1].is_sent_start = True + doc[2].is_sent_start = False + doc[3].is_sent_start = True doc = parser(doc) assert len(list(doc.sents)) == 3 diff --git a/spacy/tests/parser/test_state.py b/spacy/tests/parser/test_state.py new file mode 100644 index 000000000..7cd4b98e1 --- /dev/null +++ b/spacy/tests/parser/test_state.py @@ -0,0 +1,74 @@ +import pytest + +from spacy.tokens.doc import Doc +from spacy.vocab import Vocab +from spacy.pipeline._parser_internals.stateclass import StateClass + +@pytest.fixture +def vocab(): + return Vocab() + +@pytest.fixture +def doc(vocab): + return Doc(vocab, words=["a", "b", "c", "d"]) + +def test_init_state(doc): + state = StateClass(doc) + assert state.stack == [] + assert state.queue == list(range(len(doc))) + assert not state.is_final() + assert state.buffer_length() == 4 + +def test_push_pop(doc): + state = StateClass(doc) + state.push() + assert state.buffer_length() == 3 + assert state.stack == [0] + assert 0 not in state.queue + state.push() + assert state.stack == [1, 0] + assert 1 not in state.queue + assert state.buffer_length() == 2 + state.pop() + assert state.stack == [0] + assert 1 not in state.queue + +def test_stack_depth(doc): + state = StateClass(doc) + assert state.stack_depth() == 0 + assert state.buffer_length() == len(doc) + state.push() + assert state.buffer_length() == 3 + assert state.stack_depth() == 1 + + +def test_H(doc): + state = StateClass(doc) + assert state.H(0) == -1 + state.add_arc(1, 0, 0) + assert state.arcs == [{"head": 1, "child": 0, "label": 0}] + assert state.H(0) == 1 + state.add_arc(3, 1, 0) + assert state.H(1) == 3 + + +def test_L(doc): + state = StateClass(doc) + assert state.L(2, 1) == -1 + state.add_arc(2, 1, 0) + assert state.arcs == [{"head": 2, "child": 1, "label": 0}] + assert state.L(2, 1) == 1 + state.add_arc(2, 0, 0) + assert state.L(2, 1) == 0 + assert state.n_L(2) == 2 + + +def test_R(doc): + state = StateClass(doc) + assert state.R(0, 1) == -1 + state.add_arc(0, 1, 0) + assert state.arcs == [{"head": 0, "child": 1, "label": 0}] + assert state.R(0, 1) == 1 + state.add_arc(0, 2, 0) + assert state.R(0, 1) == 2 + assert state.n_R(0) == 2 diff --git a/spacy/tests/pipeline/test_entity_ruler.py b/spacy/tests/pipeline/test_entity_ruler.py index 206f44719..8442a2d1b 100644 --- a/spacy/tests/pipeline/test_entity_ruler.py +++ b/spacy/tests/pipeline/test_entity_ruler.py @@ -197,3 +197,21 @@ def test_entity_ruler_overlapping_spans(nlp): doc = ruler(nlp.make_doc("foo bar baz")) assert len(doc.ents) == 1 assert doc.ents[0].label_ == "FOOBAR" + + +@pytest.mark.parametrize("n_process", [1, 2]) +def test_entity_ruler_multiprocessing(nlp, n_process): + texts = [ + "I enjoy eating Pizza Hut pizza." + ] + + patterns = [ + {"label": "FASTFOOD", "pattern": "Pizza Hut", "id": "1234"} + ] + + ruler = nlp.add_pipe("entity_ruler") + ruler.add_patterns(patterns) + + for doc in nlp.pipe(texts, n_process=2): + for ent in doc.ents: + assert ent.ent_id_ == "1234" diff --git a/spacy/tests/pipeline/test_lemmatizer.py b/spacy/tests/pipeline/test_lemmatizer.py index d37c87059..5f6975f88 100644 --- a/spacy/tests/pipeline/test_lemmatizer.py +++ b/spacy/tests/pipeline/test_lemmatizer.py @@ -1,4 +1,6 @@ import pytest +import logging +import mock from spacy import util, registry from spacy.lang.en import English from spacy.lookups import Lookups @@ -54,9 +56,18 @@ def test_lemmatizer_config(nlp): lemmatizer = nlp.add_pipe("lemmatizer", config={"mode": "rule"}) nlp.initialize() + # warning if no POS assigned + doc = nlp.make_doc("coping") + logger = logging.getLogger("spacy") + with mock.patch.object(logger, "warn") as mock_warn: + doc = lemmatizer(doc) + mock_warn.assert_called_once() + + # works with POS doc = nlp.make_doc("coping") - doc[0].pos_ = "VERB" assert doc[0].lemma_ == "" + doc[0].pos_ = "VERB" + doc = lemmatizer(doc) doc = lemmatizer(doc) assert doc[0].text == "coping" assert doc[0].lemma_ == "cope" diff --git a/spacy/tests/pipeline/test_morphologizer.py b/spacy/tests/pipeline/test_morphologizer.py index 85d1d6c8b..add42e00a 100644 --- a/spacy/tests/pipeline/test_morphologizer.py +++ b/spacy/tests/pipeline/test_morphologizer.py @@ -116,3 +116,23 @@ def test_overfitting_IO(): no_batch_deps = [doc.to_array([MORPH]) for doc in [nlp(text) for text in texts]] assert_equal(batch_deps_1, batch_deps_2) assert_equal(batch_deps_1, no_batch_deps) + + # Test without POS + nlp.remove_pipe("morphologizer") + nlp.add_pipe("morphologizer") + for example in train_examples: + for token in example.reference: + token.pos_ = "" + optimizer = nlp.initialize(get_examples=lambda: train_examples) + for i in range(50): + losses = {} + nlp.update(train_examples, sgd=optimizer, losses=losses) + assert losses["morphologizer"] < 0.00001 + + # Test the trained model + test_text = "I like blue ham" + doc = nlp(test_text) + gold_morphs = ["Feat=N", "Feat=V", "", ""] + gold_pos_tags = ["", "", "", ""] + assert [str(t.morph) for t in doc] == gold_morphs + assert [t.pos_ for t in doc] == gold_pos_tags diff --git a/spacy/tests/pipeline/test_textcat.py b/spacy/tests/pipeline/test_textcat.py index 06d512a32..733535b32 100644 --- a/spacy/tests/pipeline/test_textcat.py +++ b/spacy/tests/pipeline/test_textcat.py @@ -135,7 +135,7 @@ def test_initialize_examples(): def test_overfitting_IO(): - # Simple test to try and quickly overfit the textcat component - ensuring the ML models work correctly + # Simple test to try and quickly overfit the single-label textcat component - ensuring the ML models work correctly fix_random_seed(0) nlp = English() nlp.config["initialize"]["components"]["textcat"] = {"positive_label": "POSITIVE"} @@ -177,11 +177,58 @@ def test_overfitting_IO(): # Make sure that running pipe twice, or comparing to call, always amounts to the same predictions texts = ["Just a sentence.", "I like green eggs.", "I am happy.", "I eat ham."] - batch_deps_1 = [doc.cats for doc in nlp.pipe(texts)] - batch_deps_2 = [doc.cats for doc in nlp.pipe(texts)] - no_batch_deps = [doc.cats for doc in [nlp(text) for text in texts]] - assert_equal(batch_deps_1, batch_deps_2) - assert_equal(batch_deps_1, no_batch_deps) + batch_cats_1 = [doc.cats for doc in nlp.pipe(texts)] + batch_cats_2 = [doc.cats for doc in nlp.pipe(texts)] + no_batch_cats = [doc.cats for doc in [nlp(text) for text in texts]] + assert_equal(batch_cats_1, batch_cats_2) + assert_equal(batch_cats_1, no_batch_cats) + + +def test_overfitting_IO_multi(): + # Simple test to try and quickly overfit the multi-label textcat component - ensuring the ML models work correctly + fix_random_seed(0) + nlp = English() + # Set exclusive labels to False + config = {"model": {"linear_model": {"exclusive_classes": False}}} + textcat = nlp.add_pipe("textcat", config=config) + train_examples = [] + for text, annotations in TRAIN_DATA: + train_examples.append(Example.from_dict(nlp.make_doc(text), annotations)) + optimizer = nlp.initialize(get_examples=lambda: train_examples) + assert textcat.model.get_dim("nO") == 2 + + for i in range(50): + losses = {} + nlp.update(train_examples, sgd=optimizer, losses=losses) + assert losses["textcat"] < 0.01 + + # test the trained model + test_text = "I am happy." + doc = nlp(test_text) + cats = doc.cats + assert cats["POSITIVE"] > 0.9 + + # Also test the results are still the same after IO + with make_tempdir() as tmp_dir: + nlp.to_disk(tmp_dir) + nlp2 = util.load_model_from_path(tmp_dir) + doc2 = nlp2(test_text) + cats2 = doc2.cats + assert cats2["POSITIVE"] > 0.9 + + # Test scoring + scores = nlp.evaluate(train_examples) + assert scores["cats_micro_f"] == 1.0 + assert scores["cats_score"] == 1.0 + assert "cats_score_desc" in scores + + # Make sure that running pipe twice, or comparing to call, always amounts to the same predictions + texts = ["Just a sentence.", "I like green eggs.", "I am happy.", "I eat ham."] + batch_cats_1 = [doc.cats for doc in nlp.pipe(texts)] + batch_cats_2 = [doc.cats for doc in nlp.pipe(texts)] + no_batch_cats = [doc.cats for doc in [nlp(text) for text in texts]] + assert_equal(batch_cats_1, batch_cats_2) + assert_equal(batch_cats_1, no_batch_cats) # fmt: off diff --git a/spacy/tests/regression/test_issue4001-4500.py b/spacy/tests/regression/test_issue4001-4500.py index 73aea5b4b..873ef9c1d 100644 --- a/spacy/tests/regression/test_issue4001-4500.py +++ b/spacy/tests/regression/test_issue4001-4500.py @@ -122,7 +122,8 @@ def test_issue4042_bug2(): assert "SOME_LABEL" in ner1.labels apple_ent = Span(doc1, 5, 6, label="MY_ORG") doc1.ents = list(doc1.ents) + [apple_ent] - # reapply the NER - at this point it should resize itself + # Add the label explicitly. Previously we didn't require this. + ner1.add_label("MY_ORG") ner1(doc1) assert len(ner1.labels) == 2 assert "SOME_LABEL" in ner1.labels diff --git a/spacy/tests/regression/test_issue5501-6000.py b/spacy/tests/regression/test_issue5501-6000.py index f0b46cb83..65fc8dda7 100644 --- a/spacy/tests/regression/test_issue5501-6000.py +++ b/spacy/tests/regression/test_issue5501-6000.py @@ -1,35 +1,38 @@ -from thinc.api import fix_random_seed +import pytest +from thinc.api import Config, fix_random_seed + from spacy.lang.en import English +from spacy.pipeline.textcat import default_model_config, bow_model_config +from spacy.pipeline.textcat import cnn_model_config from spacy.tokens import Span from spacy import displacy from spacy.pipeline import merge_entities +from spacy.training import Example -def test_issue5551(): +@pytest.mark.parametrize( + "textcat_config", [default_model_config, bow_model_config, cnn_model_config] +) +def test_issue5551(textcat_config): """Test that after fixing the random seed, the results of the pipeline are truly identical""" component = "textcat" - pipe_cfg = { - "model": { - "@architectures": "spacy.TextCatBOW.v1", - "exclusive_classes": True, - "ngram_size": 2, - "no_output_layer": False, - } - } + + pipe_cfg = Config().from_str(textcat_config) results = [] for i in range(3): fix_random_seed(0) nlp = English() - example = ( - "Once hot, form ping-pong-ball-sized balls of the mixture, each weighing roughly 25 g.", - {"cats": {"Labe1": 1.0, "Label2": 0.0, "Label3": 0.0}}, - ) + text = "Once hot, form ping-pong-ball-sized balls of the mixture, each weighing roughly 25 g." + annots = {"cats": {"Labe1": 1.0, "Label2": 0.0, "Label3": 0.0}} pipe = nlp.add_pipe(component, config=pipe_cfg, last=True) - for label in set(example[1]["cats"]): + for label in set(annots["cats"]): pipe.add_label(label) + # Train nlp.initialize() + doc = nlp.make_doc(text) + nlp.update([Example.from_dict(doc, annots)]) # Store the result of each iteration - result = pipe.model.predict([nlp.make_doc(example[0])]) + result = pipe.model.predict([doc]) results.append(list(result[0])) # All results should be the same because of the fixed seed assert len(results) == 3 diff --git a/spacy/tests/serialize/test_serialize_config.py b/spacy/tests/serialize/test_serialize_config.py index 8b3f5c2b8..9365df956 100644 --- a/spacy/tests/serialize/test_serialize_config.py +++ b/spacy/tests/serialize/test_serialize_config.py @@ -3,15 +3,15 @@ from thinc.api import Config, ConfigValidationError import spacy from spacy.lang.en import English from spacy.lang.de import German -from spacy.language import Language, DEFAULT_CONFIG -from spacy.util import registry, load_model_from_config +from spacy.language import Language, DEFAULT_CONFIG, DEFAULT_CONFIG_PRETRAIN_PATH +from spacy.util import registry, load_model_from_config, load_config from spacy.ml.models import build_Tok2Vec_model, build_tb_parser_model from spacy.ml.models import MultiHashEmbed, MaxoutWindowEncoder -from spacy.schemas import ConfigSchema +from spacy.schemas import ConfigSchema, ConfigSchemaPretrain + from ..util import make_tempdir - nlp_config_string = """ [paths] train = null @@ -63,6 +63,59 @@ factory = "tagger" width = ${components.tok2vec.model.width} """ +pretrain_config_string = """ +[paths] +train = null +dev = null + +[corpora] + +[corpora.train] +@readers = "spacy.Corpus.v1" +path = ${paths.train} + +[corpora.dev] +@readers = "spacy.Corpus.v1" +path = ${paths.dev} + +[training] + +[training.batcher] +@batchers = "spacy.batch_by_words.v1" +size = 666 + +[nlp] +lang = "en" +pipeline = ["tok2vec", "tagger"] + +[components] + +[components.tok2vec] +factory = "tok2vec" + +[components.tok2vec.model] +@architectures = "spacy.HashEmbedCNN.v1" +pretrained_vectors = null +width = 342 +depth = 4 +window_size = 1 +embed_size = 2000 +maxout_pieces = 3 +subword_features = true + +[components.tagger] +factory = "tagger" + +[components.tagger.model] +@architectures = "spacy.Tagger.v1" + +[components.tagger.model.tok2vec] +@architectures = "spacy.Tok2VecListener.v1" +width = ${components.tok2vec.model.width} + +[pretraining] +""" + parser_config_string = """ [model] @@ -126,6 +179,14 @@ def test_create_nlp_from_config(): load_model_from_config(Config(bad_cfg), auto_fill=True) +def test_create_nlp_from_pretraining_config(): + """Test that the default pretraining config validates properly""" + config = Config().from_str(pretrain_config_string) + pretrain_config = load_config(DEFAULT_CONFIG_PRETRAIN_PATH) + filled = config.merge(pretrain_config) + resolved = registry.resolve(filled["pretraining"], schema=ConfigSchemaPretrain) + + def test_create_nlp_from_config_multiple_instances(): """Test that the nlp object is created correctly for a config with multiple instances of the same component.""" diff --git a/spacy/tests/serialize/test_serialize_pipeline.py b/spacy/tests/serialize/test_serialize_pipeline.py index 951dd3035..2deaa180d 100644 --- a/spacy/tests/serialize/test_serialize_pipeline.py +++ b/spacy/tests/serialize/test_serialize_pipeline.py @@ -22,6 +22,9 @@ def parser(en_vocab): "learn_tokens": False, "min_action_freq": 30, "update_with_oracle_cut_size": 100, + "beam_width": 1, + "beam_update_prob": 1.0, + "beam_density": 0.0 } cfg = {"model": DEFAULT_PARSER_MODEL} model = registry.resolve(cfg, validate=True)["model"] @@ -36,6 +39,9 @@ def blank_parser(en_vocab): "learn_tokens": False, "min_action_freq": 30, "update_with_oracle_cut_size": 100, + "beam_width": 1, + "beam_update_prob": 1.0, + "beam_density": 0.0 } cfg = {"model": DEFAULT_PARSER_MODEL} model = registry.resolve(cfg, validate=True)["model"] @@ -58,6 +64,9 @@ def test_serialize_parser_roundtrip_bytes(en_vocab, Parser): "learn_tokens": False, "min_action_freq": 0, "update_with_oracle_cut_size": 100, + "beam_width": 1, + "beam_update_prob": 1.0, + "beam_density": 0.0 } cfg = {"model": DEFAULT_PARSER_MODEL} model = registry.resolve(cfg, validate=True)["model"] @@ -79,6 +88,9 @@ def test_serialize_parser_strings(Parser): "learn_tokens": False, "min_action_freq": 0, "update_with_oracle_cut_size": 100, + "beam_width": 1, + "beam_update_prob": 1.0, + "beam_density": 0.0 } cfg = {"model": DEFAULT_PARSER_MODEL} model = registry.resolve(cfg, validate=True)["model"] @@ -98,6 +110,9 @@ def test_serialize_parser_roundtrip_disk(en_vocab, Parser): "learn_tokens": False, "min_action_freq": 0, "update_with_oracle_cut_size": 100, + "beam_width": 1, + "beam_update_prob": 1.0, + "beam_density": 0.0 } cfg = {"model": DEFAULT_PARSER_MODEL} model = registry.resolve(cfg, validate=True)["model"] diff --git a/spacy/tests/test_cli.py b/spacy/tests/test_cli.py index 62584d0ce..59c2e14ec 100644 --- a/spacy/tests/test_cli.py +++ b/spacy/tests/test_cli.py @@ -8,7 +8,7 @@ from spacy.cli.init_config import init_config, RECOMMENDATIONS from spacy.cli._util import validate_project_commands, parse_config_overrides from spacy.cli._util import load_project_config, substitute_project_variables from spacy.cli._util import string_to_list -from thinc.api import ConfigValidationError +from thinc.api import ConfigValidationError, Config import srsly import os @@ -24,7 +24,7 @@ def test_cli_converters_conllu_to_docs(): "4\tavstår\tavstå\tVERB\t_\tMood=Ind|Tense=Pres|VerbForm=Fin\t0\troot\t_\tO", ] input_data = "\n".join(lines) - converted_docs = conllu_to_docs(input_data, n_sents=1) + converted_docs = list(conllu_to_docs(input_data, n_sents=1)) assert len(converted_docs) == 1 converted = [docs_to_json(converted_docs)] assert converted[0]["id"] == 0 @@ -65,8 +65,8 @@ def test_cli_converters_conllu_to_docs(): ) def test_cli_converters_conllu_to_docs_name_ner_map(lines): input_data = "\n".join(lines) - converted_docs = conllu_to_docs( - input_data, n_sents=1, ner_map={"PER": "PERSON", "BAD": ""} + converted_docs = list( + conllu_to_docs(input_data, n_sents=1, ner_map={"PER": "PERSON", "BAD": ""}) ) assert len(converted_docs) == 1 converted = [docs_to_json(converted_docs)] @@ -99,8 +99,10 @@ def test_cli_converters_conllu_to_docs_subtokens(): "5\t.\t$.\tPUNCT\t_\t_\t4\tpunct\t_\tname=O", ] input_data = "\n".join(lines) - converted_docs = conllu_to_docs( - input_data, n_sents=1, merge_subtokens=True, append_morphology=True + converted_docs = list( + conllu_to_docs( + input_data, n_sents=1, merge_subtokens=True, append_morphology=True + ) ) assert len(converted_docs) == 1 converted = [docs_to_json(converted_docs)] @@ -145,7 +147,7 @@ def test_cli_converters_iob_to_docs(): "I|PRP|O like|VBP|O London|NNP|B-GPE and|CC|O New|NNP|B-GPE York|NNP|I-GPE City|NNP|I-GPE .|.|O", ] input_data = "\n".join(lines) - converted_docs = iob_to_docs(input_data, n_sents=10) + converted_docs = list(iob_to_docs(input_data, n_sents=10)) assert len(converted_docs) == 1 converted = docs_to_json(converted_docs) assert converted["id"] == 0 @@ -212,7 +214,7 @@ def test_cli_converters_conll_ner_to_docs(): ".\t.\t_\tO", ] input_data = "\n".join(lines) - converted_docs = conll_ner_to_docs(input_data, n_sents=10) + converted_docs = list(conll_ner_to_docs(input_data, n_sents=10)) assert len(converted_docs) == 1 converted = docs_to_json(converted_docs) assert converted["id"] == 0 @@ -368,7 +370,8 @@ def test_parse_cli_overrides(): @pytest.mark.parametrize("optimize", ["efficiency", "accuracy"]) def test_init_config(lang, pipeline, optimize): # TODO: add more tests and also check for GPU with transformers - init_config("-", lang=lang, pipeline=pipeline, optimize=optimize, cpu=True) + config = init_config(lang=lang, pipeline=pipeline, optimize=optimize, gpu=False) + assert isinstance(config, Config) def test_model_recommendations(): diff --git a/spacy/tests/test_misc.py b/spacy/tests/test_misc.py index b9a0a9d05..b6c1319ae 100644 --- a/spacy/tests/test_misc.py +++ b/spacy/tests/test_misc.py @@ -4,7 +4,7 @@ import ctypes from pathlib import Path from spacy.about import __version__ as spacy_version from spacy import util -from spacy import prefer_gpu, require_gpu +from spacy import prefer_gpu, require_gpu, require_cpu from spacy.ml._precomputable_affine import PrecomputableAffine from spacy.ml._precomputable_affine import _backprop_precomputable_affine_padding from spacy.util import dot_to_object, SimpleFrozenList @@ -15,6 +15,8 @@ from spacy.lang.nl import Dutch from spacy.language import DEFAULT_CONFIG_PATH from spacy.schemas import ConfigSchemaTraining +from thinc.api import get_current_ops, NumpyOps, CupyOps + from .util import get_random_doc @@ -81,6 +83,8 @@ def test_PrecomputableAffine(nO=4, nI=5, nF=3, nP=2): def test_prefer_gpu(): try: import cupy # noqa: F401 + prefer_gpu() + assert isinstance(get_current_ops(), CupyOps) except ImportError: assert not prefer_gpu() @@ -88,10 +92,24 @@ def test_prefer_gpu(): def test_require_gpu(): try: import cupy # noqa: F401 + require_gpu() + assert isinstance(get_current_ops(), CupyOps) except ImportError: with pytest.raises(ValueError): require_gpu() +def test_require_cpu(): + require_cpu() + assert isinstance(get_current_ops(), NumpyOps) + try: + import cupy # noqa: F401 + require_gpu() + assert isinstance(get_current_ops(), CupyOps) + except ImportError: + pass + require_cpu() + assert isinstance(get_current_ops(), NumpyOps) + def test_ascii_filenames(): """Test that all filenames in the project are ASCII. diff --git a/spacy/tests/tokenizer/test_tokenizer.py b/spacy/tests/tokenizer/test_tokenizer.py index 23c2d5c47..82032b2da 100644 --- a/spacy/tests/tokenizer/test_tokenizer.py +++ b/spacy/tests/tokenizer/test_tokenizer.py @@ -2,6 +2,7 @@ import pytest from spacy.vocab import Vocab from spacy.tokenizer import Tokenizer from spacy.util import ensure_path +from spacy.lang.en import English def test_tokenizer_handles_no_word(tokenizer): @@ -150,6 +151,22 @@ def test_tokenizer_special_cases_with_affixes(tokenizer): ] +def test_tokenizer_special_cases_with_affixes_preserve_spacy(): + tokenizer = English().tokenizer + # reset all special cases + tokenizer.rules = {} + + # in-place modification (only merges) + text = "''a'' " + tokenizer.add_special_case("''", [{"ORTH": "''"}]) + assert tokenizer(text).text == text + + # not in-place (splits and merges) + tokenizer.add_special_case("ab", [{"ORTH": "a"}, {"ORTH": "b"}]) + text = "ab ab ab ''ab ab'' ab'' ''ab" + assert tokenizer(text).text == text + + def test_tokenizer_special_cases_with_period(tokenizer): text = "_SPECIAL_." tokenizer.add_special_case("_SPECIAL_", [{"orth": "_SPECIAL_"}]) diff --git a/spacy/tests/training/test_readers.py b/spacy/tests/training/test_readers.py index ff2559d2a..5669bdd11 100644 --- a/spacy/tests/training/test_readers.py +++ b/spacy/tests/training/test_readers.py @@ -72,6 +72,10 @@ def test_readers(): def test_cat_readers(reader, additional_config): nlp_config_string = """ [training] + seed = 0 + + [training.score_weights] + cats_macro_auc = 1.0 [corpora] @readers = "PLACEHOLDER" @@ -92,9 +96,7 @@ def test_cat_readers(reader, additional_config): config["corpora"]["@readers"] = reader config["corpora"].update(additional_config) nlp = load_model_from_config(config, auto_fill=True) - T = registry.resolve( - nlp.config["training"].interpolate(), schema=ConfigSchemaTraining - ) + T = registry.resolve(nlp.config["training"], schema=ConfigSchemaTraining) dot_names = [T["train_corpus"], T["dev_corpus"]] train_corpus, dev_corpus = resolve_dot_names(nlp.config, dot_names) optimizer = T["optimizer"] diff --git a/spacy/tests/training/test_training.py b/spacy/tests/training/test_training.py index ba485ab45..2e83580b5 100644 --- a/spacy/tests/training/test_training.py +++ b/spacy/tests/training/test_training.py @@ -195,7 +195,7 @@ def test_json_to_docs_no_ner(en_vocab): ], } ] - docs = json_to_docs(data) + docs = list(json_to_docs(data)) assert len(docs) == 1 for doc in docs: assert not doc.has_annotation("ENT_IOB") @@ -514,6 +514,11 @@ def test_roundtrip_docs_to_docbin(doc): ([[0], [1], [2, 3]], [[0], [1], [2], [2]]), ), ([" ", "a"], ["a"], ([[], [0]], [[1]])), + ( + ["a", "''", "'", ","], + ["a'", "''", ","], + ([[0], [0, 1], [1], [2]], [[0, 1], [1, 2], [3]]), + ), ], ) def test_align(tokens_a, tokens_b, expected): # noqa @@ -698,7 +703,7 @@ def test_alignment_spaces(en_vocab): align = Alignment.from_strings(other_tokens, spacy_tokens) assert list(align.x2y.lengths) == [0, 3, 1, 1, 1, 1, 1] assert list(align.x2y.dataXd) == [0, 1, 2, 3, 4, 4, 5, 5] - assert list(align.y2x.lengths) == [1, 1, 1, 1, 2, 2,] + assert list(align.y2x.lengths) == [1, 1, 1, 1, 2, 2] assert list(align.y2x.dataXd) == [1, 1, 1, 2, 3, 4, 5, 6] # multiple leading whitespace tokens @@ -707,7 +712,7 @@ def test_alignment_spaces(en_vocab): align = Alignment.from_strings(other_tokens, spacy_tokens) assert list(align.x2y.lengths) == [0, 0, 3, 1, 1, 1, 1, 1] assert list(align.x2y.dataXd) == [0, 1, 2, 3, 4, 4, 5, 5] - assert list(align.y2x.lengths) == [1, 1, 1, 1, 2, 2,] + assert list(align.y2x.lengths) == [1, 1, 1, 1, 2, 2] assert list(align.y2x.dataXd) == [2, 2, 2, 3, 4, 5, 6, 7] # both with leading whitespace, not identical diff --git a/spacy/tokenizer.pyx b/spacy/tokenizer.pyx index 17714940d..8f380fd48 100644 --- a/spacy/tokenizer.pyx +++ b/spacy/tokenizer.pyx @@ -338,7 +338,7 @@ cdef class Tokenizer: # Copy special case tokens into doc and adjust token and # character offsets idx_offset = 0 - orig_final_spacy = doc.c[span_end + offset - 1].spacy + orig_final_spacy = doc.c[span_end - 1].spacy orig_idx = doc.c[i].idx for j in range(cached.length): tokens[i + offset + j] = cached.data.tokens[j] @@ -404,9 +404,7 @@ cdef class Tokenizer: cdef unicode minus_suf cdef size_t last_size = 0 while string and len(string) != last_size: - if self.token_match and self.token_match(string) \ - and not self.find_prefix(string) \ - and not self.find_suffix(string): + if self.token_match and self.token_match(string): break if with_special_cases and self._specials.get(hash_string(string)) != NULL: break @@ -679,6 +677,8 @@ cdef class Tokenizer: break suffixes.append(("SUFFIX", substring[split:])) substring = substring[:split] + if len(substring) == 0: + continue if token_match(substring): tokens.append(("TOKEN_MATCH", substring)) substring = '' diff --git a/spacy/tokens/_retokenize.pyx b/spacy/tokens/_retokenize.pyx index 398dfca26..0069e36bf 100644 --- a/spacy/tokens/_retokenize.pyx +++ b/spacy/tokens/_retokenize.pyx @@ -11,7 +11,7 @@ from .span cimport Span from .token cimport Token from ..lexeme cimport Lexeme, EMPTY_LEXEME from ..structs cimport LexemeC, TokenC -from ..attrs cimport MORPH +from ..attrs cimport MORPH, NORM from ..vocab cimport Vocab from .underscore import is_writable_attr @@ -372,9 +372,10 @@ def _split(Doc doc, int token_index, orths, heads, attrs): # Set attributes on both token and lexeme to take care of token # attribute vs. lexical attribute without having to enumerate # them. If an attribute name is not valid, set_struct_attr will - # ignore it. + # ignore it. Exception: set NORM only on tokens. Token.set_struct_attr(token, attr_name, get_string_id(attr_value)) - Lexeme.set_struct_attr(token.lex, attr_name, get_string_id(attr_value)) + if attr_name != NORM: + Lexeme.set_struct_attr(token.lex, attr_name, get_string_id(attr_value)) # Assign correct dependencies to the inner token for i, head in enumerate(heads): doc.c[token_index + i].head = head @@ -435,6 +436,7 @@ def set_token_attrs(Token py_token, attrs): # Set attributes on both token and lexeme to take care of token # attribute vs. lexical attribute without having to enumerate # them. If an attribute name is not valid, set_struct_attr will - # ignore it. + # ignore it. Exception: set NORM only on tokens. Token.set_struct_attr(token, attr_name, attr_value) - Lexeme.set_struct_attr(lex, attr_name, attr_value) + if attr_name != NORM: + Lexeme.set_struct_attr(lex, attr_name, attr_value) diff --git a/spacy/tokens/_serialize.py b/spacy/tokens/_serialize.py index 11eb75821..821f55eb6 100644 --- a/spacy/tokens/_serialize.py +++ b/spacy/tokens/_serialize.py @@ -198,7 +198,10 @@ class DocBin: DOCS: https://nightly.spacy.io/api/docbin#from_bytes """ - msg = srsly.msgpack_loads(zlib.decompress(bytes_data)) + try: + msg = srsly.msgpack_loads(zlib.decompress(bytes_data)) + except zlib.error: + raise ValueError(Errors.E1014) self.attrs = msg["attrs"] self.strings = set(msg["strings"]) lengths = numpy.frombuffer(msg["lengths"], dtype="int32") diff --git a/spacy/training/align.pyx b/spacy/training/align.pyx index b9d89f789..0ef1fd35d 100644 --- a/spacy/training/align.pyx +++ b/spacy/training/align.pyx @@ -7,8 +7,8 @@ from ..errors import Errors def get_alignments(A: List[str], B: List[str]) -> Tuple[List[List[int]], List[List[int]]]: # Create character-to-token mappings - char_to_token_a = tuple(chain(*((i,) * len(x) for i, x in enumerate(A)))) - char_to_token_b = tuple(chain(*((i,) * len(x) for i, x in enumerate(B)))) + char_to_token_a = tuple(chain(*((i,) * len(x.lower()) for i, x in enumerate(A)))) + char_to_token_b = tuple(chain(*((i,) * len(x.lower()) for i, x in enumerate(B)))) str_a = "".join(A).lower() str_b = "".join(B).lower() cdef int len_str_a = len(str_a) @@ -36,8 +36,14 @@ def get_alignments(A: List[str], B: List[str]) -> Tuple[List[List[int]], List[Li if prev_token_idx_b != token_idx_b: b2a.append(set()) # Process the alignment at the current position - if A[token_idx_a] == B[token_idx_b]: - # Current tokens are identical + if A[token_idx_a] == B[token_idx_b] and \ + (char_idx_a == 0 or \ + char_to_token_a[char_idx_a - 1] < token_idx_a) and \ + (char_idx_b == 0 or \ + char_to_token_b[char_idx_b - 1] < token_idx_b): + # Current tokens are identical and both character offsets are the + # start of a token (either at the beginning of the document or the + # previous character belongs to a different token) a2b[-1].add(token_idx_b) b2a[-1].add(token_idx_a) char_idx_a += len(A[token_idx_a]) diff --git a/spacy/training/converters/conll_ner_to_docs.py b/spacy/training/converters/conll_ner_to_docs.py index c01686aee..8c1bad9ea 100644 --- a/spacy/training/converters/conll_ner_to_docs.py +++ b/spacy/training/converters/conll_ner_to_docs.py @@ -87,7 +87,6 @@ def conll_ner_to_docs( nlp = load_model(model) else: nlp = get_lang_class("xx")() - output_docs = [] for conll_doc in input_data.strip().split(doc_delimiter): conll_doc = conll_doc.strip() if not conll_doc: @@ -116,8 +115,7 @@ def conll_ner_to_docs( token.is_sent_start = sent_starts[i] entities = tags_to_entities(biluo_tags) doc.ents = [Span(doc, start=s, end=e + 1, label=L) for L, s, e in entities] - output_docs.append(doc) - return output_docs + yield doc def segment_sents_and_docs(doc, n_sents, doc_delimiter, model=None, msg=None): diff --git a/spacy/training/converters/conllu_to_docs.py b/spacy/training/converters/conllu_to_docs.py index 2e6084ae5..356021a1d 100644 --- a/spacy/training/converters/conllu_to_docs.py +++ b/spacy/training/converters/conllu_to_docs.py @@ -34,16 +34,14 @@ def conllu_to_docs( ner_map=ner_map, merge_subtokens=merge_subtokens, ) - docs = [] sent_docs_to_merge = [] for sent_doc in sent_docs: sent_docs_to_merge.append(sent_doc) if len(sent_docs_to_merge) % n_sents == 0: - docs.append(Doc.from_docs(sent_docs_to_merge)) + yield Doc.from_docs(sent_docs_to_merge) sent_docs_to_merge = [] if sent_docs_to_merge: - docs.append(Doc.from_docs(sent_docs_to_merge)) - return docs + yield Doc.from_docs(sent_docs_to_merge) def has_ner(input_data, ner_tag_pattern): diff --git a/spacy/training/converters/iob_to_docs.py b/spacy/training/converters/iob_to_docs.py index a2185fef7..60fb7df61 100644 --- a/spacy/training/converters/iob_to_docs.py +++ b/spacy/training/converters/iob_to_docs.py @@ -24,12 +24,10 @@ def iob_to_docs(input_data, n_sents=10, no_print=False, *args, **kwargs): msg = Printer(no_print=no_print) if n_sents > 0: n_sents_info(msg, n_sents) - docs = read_iob(input_data.split("\n"), vocab, n_sents) - return docs + yield from read_iob(input_data.split("\n"), vocab, n_sents) def read_iob(raw_sents, vocab, n_sents): - docs = [] for group in minibatch(raw_sents, size=n_sents): tokens = [] words = [] @@ -61,5 +59,4 @@ def read_iob(raw_sents, vocab, n_sents): biluo = iob_to_biluo(iob) entities = tags_to_entities(biluo) doc.ents = [Span(doc, start=s, end=e + 1, label=L) for (L, s, e) in entities] - docs.append(doc) - return docs + yield doc diff --git a/spacy/training/converters/json_to_docs.py b/spacy/training/converters/json_to_docs.py index d7df1d6f9..4123839f2 100644 --- a/spacy/training/converters/json_to_docs.py +++ b/spacy/training/converters/json_to_docs.py @@ -12,11 +12,9 @@ def json_to_docs(input_data, model=None, **kwargs): if not isinstance(input_data, str): input_data = srsly.json_dumps(input_data) input_data = input_data.encode("utf8") - docs = [] for json_doc in json_iterate(input_data): for json_para in json_to_annotations(json_doc): example_dict = _fix_legacy_dict_data(json_para) tok_dict, doc_dict = _parse_example_dict_data(example_dict) doc = annotations_to_doc(nlp.vocab, tok_dict, doc_dict) - docs.append(doc) - return docs + yield doc diff --git a/spacy/training/example.pyx b/spacy/training/example.pyx index 6a556b5e7..21907e7dd 100644 --- a/spacy/training/example.pyx +++ b/spacy/training/example.pyx @@ -191,6 +191,24 @@ cdef class Example: aligned_deps[cand_i] = deps[gold_i] return aligned_heads, aligned_deps + def get_aligned_sent_starts(self): + """Get list of SENT_START attributes aligned to the predicted tokenization. + If the reference has not sentence starts, return a list of None values. + + The aligned sentence starts use the get_aligned_spans method, rather + than aligning the list of tags, so that it handles cases where a mistaken + tokenization starts the sentence. + """ + if self.y.has_annotation("SENT_START"): + align = self.alignment.y2x + sent_starts = [False] * len(self.x) + for y_sent in self.y.sents: + x_start = int(align[y_sent.start].dataXd[0]) + sent_starts[x_start] = True + return sent_starts + else: + return [None] * len(self.x) + def get_aligned_spans_x2y(self, x_spans): return self._get_aligned_spans(self.y, x_spans, self.alignment.x2y) diff --git a/spacy/training/initialize.py b/spacy/training/initialize.py index 3d79eb78f..6f9896492 100644 --- a/spacy/training/initialize.py +++ b/spacy/training/initialize.py @@ -103,7 +103,7 @@ def load_vectors_into_model( "with the packaged vectors. Make sure that the vectors package you're " "loading is compatible with the current version of spaCy." ) - err = ConfigValidationError.from_error(e, config=None, title=title, desc=desc) + err = ConfigValidationError.from_error(e, title=title, desc=desc) raise err from None nlp.vocab.vectors = vectors_nlp.vocab.vectors if add_strings: diff --git a/spacy/training/loop.py b/spacy/training/loop.py index eecb3e273..c8df57a3c 100644 --- a/spacy/training/loop.py +++ b/spacy/training/loop.py @@ -28,7 +28,7 @@ def train( use_gpu: int = -1, stdout: IO = sys.stdout, stderr: IO = sys.stderr, -) -> None: +) -> Tuple["Language", Optional[Path]]: """Train a pipeline. nlp (Language): The initialized nlp object with the full config. @@ -40,7 +40,7 @@ def train( stderr (file): A second file-like object to write output messages. To disable printing, set to io.StringIO. - RETURNS (Path / None): The path to the final exported model. + RETURNS (tuple): The final nlp object and the path to the exported model. """ # We use no_print here so we can respect the stdout/stderr options. msg = Printer(no_print=True) @@ -105,17 +105,18 @@ def train( raise e finally: finalize_logger() + if optimizer.averages: + nlp.use_params(optimizer.averages) if output_path is not None: final_model_path = output_path / DIR_MODEL_LAST - if optimizer.averages: - with nlp.use_params(optimizer.averages): - nlp.to_disk(final_model_path) - else: - nlp.to_disk(final_model_path) + nlp.to_disk(final_model_path) # This will only run if we don't hit an error stdout.write( msg.good("Saved pipeline to output directory", final_model_path) + "\n" ) + return (nlp, final_model_path) + else: + return (nlp, None) def train_while_improving( diff --git a/spacy/training/pretrain.py b/spacy/training/pretrain.py index e5c41c70b..f516c0fd7 100644 --- a/spacy/training/pretrain.py +++ b/spacy/training/pretrain.py @@ -1,23 +1,17 @@ from typing import Optional, Callable, Iterable, Union, List from thinc.api import Config, fix_random_seed, set_gpu_allocator, Model, Optimizer -from thinc.api import set_dropout_rate, to_categorical, CosineDistance, L2Distance +from thinc.api import set_dropout_rate from pathlib import Path -from functools import partial from collections import Counter import srsly -import numpy import time import re from wasabi import Printer from .example import Example from ..tokens import Doc -from ..attrs import ID -from ..ml.models.multi_task import build_cloze_multi_task_model -from ..ml.models.multi_task import build_cloze_characters_multi_task_model from ..schemas import ConfigSchemaTraining, ConfigSchemaPretrain -from ..errors import Errors -from ..util import registry, load_model_from_config, resolve_dot_names +from ..util import registry, load_model_from_config, dot_to_object def pretrain( @@ -38,7 +32,8 @@ def pretrain( _config = nlp.config.interpolate() T = registry.resolve(_config["training"], schema=ConfigSchemaTraining) P = registry.resolve(_config["pretraining"], schema=ConfigSchemaPretrain) - corpus = resolve_dot_names(_config, [P["corpus"]])[0] + corpus = dot_to_object(_config, P["corpus"]) + corpus = registry.resolve({"corpus": corpus})["corpus"] batcher = P["batcher"] model = create_pretraining_model(nlp, P) optimizer = P["optimizer"] @@ -48,6 +43,7 @@ def pretrain( else: # Without '--resume-path' the '--epoch-resume' argument is ignored epoch_resume = 0 + objective = model.attrs["loss"] # TODO: move this to logger function? tracker = ProgressTracker(frequency=10000) msg.divider(f"Pre-training tok2vec layer - starting at epoch {epoch_resume}") @@ -68,7 +64,6 @@ def pretrain( with (output_dir / "log.jsonl").open("a") as file_: file_.write(srsly.json_dumps(log) + "\n") - objective = create_objective(P["objective"]) # TODO: I think we probably want this to look more like the # 'create_train_batches' function? for epoch in range(epoch_resume, P["max_epochs"]): @@ -131,58 +126,6 @@ def make_update( return float(loss) -def create_objective(config: Config): - """Create the objective for pretraining. - - We'd like to replace this with a registry function but it's tricky because - we're also making a model choice based on this. For now we hard-code support - for two types (characters, vectors). For characters you can specify - n_characters, for vectors you can specify the loss. - - Bleh. - """ - objective_type = config["type"] - if objective_type == "characters": - return partial(get_characters_loss, nr_char=config["n_characters"]) - elif objective_type == "vectors": - if config["loss"] == "cosine": - distance = CosineDistance(normalize=True, ignore_zeros=True) - return partial(get_vectors_loss, distance=distance) - elif config["loss"] == "L2": - distance = L2Distance(normalize=True, ignore_zeros=True) - return partial(get_vectors_loss, distance=distance) - else: - raise ValueError(Errors.E906.format(loss_type=config["loss"])) - else: - raise ValueError(Errors.E907.format(objective_type=objective_type)) - - -def get_vectors_loss(ops, docs, prediction, distance): - """Compute a loss based on a distance between the documents' vectors and - the prediction. - """ - # The simplest way to implement this would be to vstack the - # token.vector values, but that's a bit inefficient, especially on GPU. - # Instead we fetch the index into the vectors table for each of our tokens, - # and look them up all at once. This prevents data copying. - ids = ops.flatten([doc.to_array(ID).ravel() for doc in docs]) - target = docs[0].vocab.vectors.data[ids] - d_target, loss = distance(prediction, target) - return loss, d_target - - -def get_characters_loss(ops, docs, prediction, nr_char): - """Compute a loss based on a number of characters predicted from the docs.""" - target_ids = numpy.vstack([doc.to_utf8_array(nr_char=nr_char) for doc in docs]) - target_ids = target_ids.reshape((-1,)) - target = ops.asarray(to_categorical(target_ids, n_classes=256), dtype="f") - target = target.reshape((-1, 256 * nr_char)) - diff = prediction - target - loss = (diff ** 2).sum() - d_target = diff / float(prediction.shape[0]) - return loss, d_target - - def create_pretraining_model(nlp, pretrain_config): """Define a network for the pretraining. We simply add an output layer onto the tok2vec input model. The tok2vec input model needs to be a model that @@ -191,27 +134,15 @@ def create_pretraining_model(nlp, pretrain_config): The actual tok2vec layer is stored as a reference, and only this bit will be serialized to file and read back in when calling the 'train' command. """ + nlp.initialize() component = nlp.get_pipe(pretrain_config["component"]) if pretrain_config.get("layer"): tok2vec = component.model.get_ref(pretrain_config["layer"]) else: tok2vec = component.model - # TODO - maxout_pieces = 3 - hidden_size = 300 - if pretrain_config["objective"]["type"] == "vectors": - model = build_cloze_multi_task_model( - nlp.vocab, tok2vec, hidden_size=hidden_size, maxout_pieces=maxout_pieces - ) - elif pretrain_config["objective"]["type"] == "characters": - model = build_cloze_characters_multi_task_model( - nlp.vocab, - tok2vec, - hidden_size=hidden_size, - maxout_pieces=maxout_pieces, - nr_char=pretrain_config["objective"]["n_characters"], - ) + create_function = pretrain_config["objective"] + model = create_function(nlp.vocab, tok2vec) model.initialize(X=[nlp.make_doc("Give it a doc to infer shapes")]) set_dropout_rate(model, pretrain_config["dropout"]) return model diff --git a/spacy/typedefs.pxd b/spacy/typedefs.pxd index b43814268..8cdc70e42 100644 --- a/spacy/typedefs.pxd +++ b/spacy/typedefs.pxd @@ -5,7 +5,6 @@ from libc.stdint cimport uint8_t ctypedef float weight_t ctypedef uint64_t hash_t ctypedef uint64_t class_t -ctypedef char* utf8_t ctypedef uint64_t attr_t ctypedef uint64_t flags_t ctypedef uint16_t len_t diff --git a/spacy/util.py b/spacy/util.py index 8335a4fcc..964ec1c36 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -67,8 +67,10 @@ CONFIG_SECTION_ORDER = ["paths", "variables", "system", "nlp", "components", "co # fmt: on -logging.basicConfig(format="%(message)s") logger = logging.getLogger("spacy") +logger_stream_handler = logging.StreamHandler() +logger_stream_handler.setFormatter(logging.Formatter('%(message)s')) +logger.addHandler(logger_stream_handler) class ENV_VARS: @@ -465,18 +467,24 @@ def load_config( ) -> Config: """Load a config file. Takes care of path validation and section order. - path (Union[str, Path]): Path to the config file. + path (Union[str, Path]): Path to the config file or "-" to read from stdin. overrides: (Dict[str, Any]): Config overrides as nested dict or dict keyed by section values in dot notation. interpolate (bool): Whether to interpolate and resolve variables. RETURNS (Config): The loaded config. """ config_path = ensure_path(path) - if not config_path.exists() or not config_path.is_file(): - raise IOError(Errors.E053.format(path=config_path, name="config.cfg")) - return Config(section_order=CONFIG_SECTION_ORDER).from_disk( - config_path, overrides=overrides, interpolate=interpolate - ) + config = Config(section_order=CONFIG_SECTION_ORDER) + if str(config_path) == "-": # read from standard input + return config.from_str( + sys.stdin.read(), overrides=overrides, interpolate=interpolate + ) + else: + if not config_path or not config_path.exists() or not config_path.is_file(): + raise IOError(Errors.E053.format(path=config_path, name="config.cfg")) + return config.from_disk( + config_path, overrides=overrides, interpolate=interpolate + ) def load_config_from_str( @@ -1289,6 +1297,13 @@ def combine_score_weights( class DummyTokenizer: + def __call__(self, text): + raise NotImplementedError + + def pipe(self, texts, **kwargs): + for text in texts: + yield self(text) + # add dummy methods for to_bytes, from_bytes, to_disk and from_disk to # allow serialization (see #1557) def to_bytes(self, **kwargs): diff --git a/spacy/vocab.pxd b/spacy/vocab.pxd index 7d8dfd5d6..b5bcf7658 100644 --- a/spacy/vocab.pxd +++ b/spacy/vocab.pxd @@ -4,7 +4,7 @@ from cymem.cymem cimport Pool from murmurhash.mrmr cimport hash64 from .structs cimport LexemeC, TokenC -from .typedefs cimport utf8_t, attr_t, hash_t +from .typedefs cimport attr_t, hash_t from .strings cimport StringStore from .morphology cimport Morphology diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 93918250b..568c2cc4c 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -305,6 +305,9 @@ cdef class Vocab: DOCS: https://nightly.spacy.io/api/vocab#prune_vectors """ xp = get_array_module(self.vectors.data) + # Make sure all vectors are in the vocab + for orth in self.vectors: + self[orth] # Make prob negative so it sorts by rank ascending # (key2row contains the rank) priority = [(-lex.prob, self.vectors.key2row[lex.orth], lex.orth) diff --git a/website/UNIVERSE.md b/website/UNIVERSE.md index 2a83b2983..d37c4561a 100644 --- a/website/UNIVERSE.md +++ b/website/UNIVERSE.md @@ -11,8 +11,8 @@ suggest it by submitting a pull request to this repository. The Universe database is open-source and collected in a simple JSON file. Looking for inspiration for your own spaCy plugin or extension? Check out the -[`project idea`](https://github.com/explosion/spaCy/labels/project%20idea) label -on the issue tracker. +[`project ideas`](https://github.com/explosion/spaCy/discussions?discussions_q=category%3A%22New+Features+%26+Project+Ideas%22) +discussion forum. ## Checklist diff --git a/website/docs/api/architectures.md b/website/docs/api/architectures.md index fe2223017..479e56f88 100644 --- a/website/docs/api/architectures.md +++ b/website/docs/api/architectures.md @@ -143,10 +143,10 @@ argument that connects to the shared `tok2vec` component in the pipeline. Construct an embedding layer that separately embeds a number of lexical attributes using hash embedding, concatenates the results, and passes it through -a feed-forward subnetwork to build a mixed representation. The features used -can be configured with the `attrs` argument. The suggested attributes are -`NORM`, `PREFIX`, `SUFFIX` and `SHAPE`. This lets the model take into account -some subword information, without construction a fully character-based +a feed-forward subnetwork to build a mixed representation. The features used can +be configured with the `attrs` argument. The suggested attributes are `NORM`, +`PREFIX`, `SUFFIX` and `SHAPE`. This lets the model take into account some +subword information, without construction a fully character-based representation. If pretrained vectors are available, they can be included in the representation as well, with the vectors table will be kept static (i.e. it's not updated). @@ -393,11 +393,12 @@ operate over wordpieces, which usually don't align one-to-one against spaCy tokens. The layer therefore requires a reduction operation in order to calculate a single token vector given zero or more wordpiece vectors. -| Name | Description | -| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `pooling` | A reduction layer used to calculate the token vectors based on zero or more wordpiece vectors. If in doubt, mean pooling (see [`reduce_mean`](https://thinc.ai/docs/api-layers#reduce_mean)) is usually a good choice. ~~Model[Ragged, Floats2d]~~ | -| `grad_factor` | Reweight gradients from the component before passing them upstream. You can set this to `0` to "freeze" the transformer weights with respect to the component, or use it to make some components more significant than others. Leaving it at `1.0` is usually fine. ~~float~~ | -| **CREATES** | The model using the architecture. ~~Model[List[Doc], List[Floats2d]]~~ | +| Name | Description | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `pooling` | A reduction layer used to calculate the token vectors based on zero or more wordpiece vectors. If in doubt, mean pooling (see [`reduce_mean`](https://thinc.ai/docs/api-layers#reduce_mean)) is usually a good choice. ~~Model[Ragged, Floats2d]~~ | +| `grad_factor` | Reweight gradients from the component before passing them upstream. You can set this to `0` to "freeze" the transformer weights with respect to the component, or use it to make some components more significant than others. Leaving it at `1.0` is usually fine. ~~float~~ | +| `upstream` | A string to identify the "upstream" `Transformer` component to communicate with. By default, the upstream name is the wildcard string `"*"`, but you could also specify the name of the `Transformer` component. You'll almost never have multiple upstream `Transformer` components, so the wildcard string will almost always be fine. ~~str~~ | +| **CREATES** | The model using the architecture. ~~Model[List[Doc], List[Floats2d]]~~ | ### spacy-transformers.Tok2VecTransformer.v1 {#Tok2VecTransformer} @@ -563,7 +564,8 @@ from the linear model, where it is stored in `model.attrs["multi_label"]`. -The v1 was functionally similar, but used an internal `tok2vec` instead of taking it as argument. +The v1 was functionally similar, but used an internal `tok2vec` instead of +taking it as argument. | Name | Description | | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -663,7 +665,7 @@ into the "real world". This requires 3 main components: > pretrained_vectors = null > width = 96 > depth = 2 -> embed_size = 300 +> embed_size = 2000 > window_size = 1 > maxout_pieces = 3 > subword_features = true diff --git a/website/docs/api/cli.md b/website/docs/api/cli.md index 168465fab..5a6143a38 100644 --- a/website/docs/api/cli.md +++ b/website/docs/api/cli.md @@ -121,16 +121,16 @@ customize those settings in your config file later. > ``` ```cli -$ python -m spacy init config [output_file] [--lang] [--pipeline] [--optimize] [--cpu] [--pretraining] +$ python -m spacy init config [output_file] [--lang] [--pipeline] [--optimize] [--gpu] [--pretraining] ``` | Name | Description | | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `output_file` | Path to output `.cfg` file or `-` to write the config to stdout (so you can pipe it forward to a file). Note that if you're writing to stdout, no additional logging info is printed. ~~Path (positional)~~ | +| `output_file` | Path to output `.cfg` file or `-` to write the config to stdout (so you can pipe it forward to a file or to the `train` command). Note that if you're writing to stdout, no additional logging info is printed. ~~Path (positional)~~ | | `--lang`, `-l` | Optional code of the [language](/usage/models#languages) to use. Defaults to `"en"`. ~~str (option)~~ | | `--pipeline`, `-p` | Comma-separated list of trainable [pipeline components](/usage/processing-pipelines#built-in) to include. Defaults to `"tagger,parser,ner"`. ~~str (option)~~ | | `--optimize`, `-o` | `"efficiency"` or `"accuracy"`. Whether to optimize for efficiency (faster inference, smaller model, lower memory consumption) or higher accuracy (potentially larger and slower model). This will impact the choice of architecture, pretrained weights and related hyperparameters. Defaults to `"efficiency"`. ~~str (option)~~ | -| `--cpu`, `-C` | Whether the model needs to run on CPU. This will impact the choice of architecture, pretrained weights and related hyperparameters. ~~bool (flag)~~ | +| `--gpu`, `-G` | Whether the model can run on GPU. This will impact the choice of architecture, pretrained weights and related hyperparameters. ~~bool (flag)~~ | | `--pretraining`, `-pt` | Include config for pretraining (with [`spacy pretrain`](/api/cli#pretrain)). Defaults to `False`. ~~bool (flag)~~ | | `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | | **CREATES** | The config file for training. | @@ -223,16 +223,16 @@ After generating the labels, you can provide them to components that accept a $ python -m spacy init labels [config_path] [output_path] [--code] [--verbose] [--gpu-id] [overrides] ``` -| Name | Description | -| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. ~~Path (positional)~~ | -| `output_path` | Output directory for the label files. Will create one JSON file per component. ~~Path (positional)~~ | -| `--code`, `-c` | Path to Python file with additional code to be imported. Allows [registering custom functions](/usage/training#custom-functions) for new architectures. ~~Optional[Path] \(option)~~ | -| `--verbose`, `-V` | Show more detailed messages during training. ~~bool (flag)~~ | -| `--gpu-id`, `-g` | GPU ID or `-1` for CPU. Defaults to `-1`. ~~int (option)~~ | -| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | -| overrides | Config parameters to override. Should be options starting with `--` that correspond to the config section and value to override, e.g. `--paths.train ./train.spacy`. ~~Any (option/flag)~~ | -| **CREATES** | The best trained pipeline and the final checkpoint (if training is terminated). | +| Name | Description | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. If `-`, the data will be [read from stdin](/usage/training#config-stdin). ~~Union[Path, str] \(positional)~~ | +| `output_path` | Output directory for the label files. Will create one JSON file per component. ~~Path (positional)~~ | +| `--code`, `-c` | Path to Python file with additional code to be imported. Allows [registering custom functions](/usage/training#custom-functions) for new architectures. ~~Optional[Path] \(option)~~ | +| `--verbose`, `-V` | Show more detailed messages during training. ~~bool (flag)~~ | +| `--gpu-id`, `-g` | GPU ID or `-1` for CPU. Defaults to `-1`. ~~int (option)~~ | +| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | +| overrides | Config parameters to override. Should be options starting with `--` that correspond to the config section and value to override, e.g. `--paths.train ./train.spacy`. ~~Any (option/flag)~~ | +| **CREATES** | The best trained pipeline and the final checkpoint (if training is terminated). | ## convert {#convert tag="command"} @@ -428,7 +428,7 @@ File /path/to/thinc/thinc/schedules.py (line 91) | Name | Description | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. ~~Path (positional)~~ | +| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. If `-`, the data will be [read from stdin](/usage/training#config-stdin). ~~Union[Path, str] \(positional)~~ | | `--code`, `-c` | Path to Python file with additional code to be imported. Allows [registering custom functions](/usage/training#custom-functions) for new architectures. ~~Optional[Path] \(option)~~ | | `--show-functions`, `-F` | Show an overview of all registered function blocks used in the config and where those functions come from, including the module name, Python file and line number. ~~bool (flag)~~ | | `--show-variables`, `-V` | Show an overview of all variables referenced in the config, e.g. `${paths.train}` and their values that will be used. This also reflects any config overrides provided on the CLI, e.g. `--paths.train /path`. ~~bool (flag)~~ | @@ -600,16 +600,16 @@ will not be available. -| Name | Description | -| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. ~~Path (positional)~~ | -| `--code`, `-c` | Path to Python file with additional code to be imported. Allows [registering custom functions](/usage/training#custom-functions) for new architectures. ~~Optional[Path] \(option)~~ | -| `--ignore-warnings`, `-IW` | Ignore warnings, only show stats and errors. ~~bool (flag)~~ | -| `--verbose`, `-V` | Print additional information and explanations. ~~bool (flag)~~ | -| `--no-format`, `-NF` | Don't pretty-print the results. Use this if you want to write to a file. ~~bool (flag)~~ | -| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | -| overrides | Config parameters to override. Should be options starting with `--` that correspond to the config section and value to override, e.g. `--paths.train ./train.spacy`. ~~Any (option/flag)~~ | -| **PRINTS** | Debugging information. | +| Name | Description | +| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. If `-`, the data will be [read from stdin](/usage/training#config-stdin). ~~Union[Path, str] \(positional)~~ | +| `--code`, `-c` | Path to Python file with additional code to be imported. Allows [registering custom functions](/usage/training#custom-functions) for new architectures. ~~Optional[Path] \(option)~~ | +| `--ignore-warnings`, `-IW` | Ignore warnings, only show stats and errors. ~~bool (flag)~~ | +| `--verbose`, `-V` | Print additional information and explanations. ~~bool (flag)~~ | +| `--no-format`, `-NF` | Don't pretty-print the results. Use this if you want to write to a file. ~~bool (flag)~~ | +| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | +| overrides | Config parameters to override. Should be options starting with `--` that correspond to the config section and value to override, e.g. `--paths.train ./train.spacy`. ~~Any (option/flag)~~ | +| **PRINTS** | Debugging information. | ### debug profile {#debug-profile tag="command"} @@ -742,22 +742,22 @@ $ python -m spacy debug model ./config.cfg tagger -l "5,15" -DIM -PAR -P0 -P1 -P -| Name | Description | -| ----------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. ~~Path (positional)~~ | -| `component` | Name of the pipeline component of which the model should be analyzed. ~~str (positional)~~ | -| `--layers`, `-l` | Comma-separated names of layer IDs to print. ~~str (option)~~ | -| `--dimensions`, `-DIM` | Show dimensions of each layer. ~~bool (flag)~~ | -| `--parameters`, `-PAR` | Show parameters of each layer. ~~bool (flag)~~ | -| `--gradients`, `-GRAD` | Show gradients of each layer. ~~bool (flag)~~ | -| `--attributes`, `-ATTR` | Show attributes of each layer. ~~bool (flag)~~ | -| `--print-step0`, `-P0` | Print model before training. ~~bool (flag)~~ | -| `--print-step1`, `-P1` | Print model after initialization. ~~bool (flag)~~ | -| `--print-step2`, `-P2` | Print model after training. ~~bool (flag)~~ | -| `--print-step3`, `-P3` | Print final predictions. ~~bool (flag)~~ | -| `--gpu-id`, `-g` | GPU ID or `-1` for CPU. Defaults to `-1`. ~~int (option)~~ | -| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | -| **PRINTS** | Debugging information. | +| Name | Description | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. If `-`, the data will be [read from stdin](/usage/training#config-stdin). ~~Union[Path, str] \(positional)~~ | +| `component` | Name of the pipeline component of which the model should be analyzed. ~~str (positional)~~ | +| `--layers`, `-l` | Comma-separated names of layer IDs to print. ~~str (option)~~ | +| `--dimensions`, `-DIM` | Show dimensions of each layer. ~~bool (flag)~~ | +| `--parameters`, `-PAR` | Show parameters of each layer. ~~bool (flag)~~ | +| `--gradients`, `-GRAD` | Show gradients of each layer. ~~bool (flag)~~ | +| `--attributes`, `-ATTR` | Show attributes of each layer. ~~bool (flag)~~ | +| `--print-step0`, `-P0` | Print model before training. ~~bool (flag)~~ | +| `--print-step1`, `-P1` | Print model after initialization. ~~bool (flag)~~ | +| `--print-step2`, `-P2` | Print model after training. ~~bool (flag)~~ | +| `--print-step3`, `-P3` | Print final predictions. ~~bool (flag)~~ | +| `--gpu-id`, `-g` | GPU ID or `-1` for CPU. Defaults to `-1`. ~~int (option)~~ | +| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | +| **PRINTS** | Debugging information. | ## train {#train tag="command"} @@ -787,16 +787,16 @@ in the section `[paths]`. $ python -m spacy train [config_path] [--output] [--code] [--verbose] [--gpu-id] [overrides] ``` -| Name | Description | -| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. ~~Path (positional)~~ | -| `--output`, `-o` | Directory to store trained pipeline in. Will be created if it doesn't exist. ~~Optional[Path] \(positional)~~ | -| `--code`, `-c` | Path to Python file with additional code to be imported. Allows [registering custom functions](/usage/training#custom-functions) for new architectures. ~~Optional[Path] \(option)~~ | -| `--verbose`, `-V` | Show more detailed messages during training. ~~bool (flag)~~ | -| `--gpu-id`, `-g` | GPU ID or `-1` for CPU. Defaults to `-1`. ~~int (option)~~ | -| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | -| overrides | Config parameters to override. Should be options starting with `--` that correspond to the config section and value to override, e.g. `--paths.train ./train.spacy`. ~~Any (option/flag)~~ | -| **CREATES** | The final trained pipeline and the best trained pipeline. | +| Name | Description | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. If `-`, the data will be [read from stdin](/usage/training#config-stdin). ~~Union[Path, str] \(positional)~~ | +| `--output`, `-o` | Directory to store trained pipeline in. Will be created if it doesn't exist. ~~Optional[Path] \(positional)~~ | +| `--code`, `-c` | Path to Python file with additional code to be imported. Allows [registering custom functions](/usage/training#custom-functions) for new architectures. ~~Optional[Path] \(option)~~ | +| `--verbose`, `-V` | Show more detailed messages during training. ~~bool (flag)~~ | +| `--gpu-id`, `-g` | GPU ID or `-1` for CPU. Defaults to `-1`. ~~int (option)~~ | +| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | +| overrides | Config parameters to override. Should be options starting with `--` that correspond to the config section and value to override, e.g. `--paths.train ./train.spacy`. ~~Any (option/flag)~~ | +| **CREATES** | The final trained pipeline and the best trained pipeline. | ## pretrain {#pretrain new="2.1" tag="command,experimental"} @@ -827,17 +827,17 @@ auto-generated by setting `--pretraining` on $ python -m spacy pretrain [config_path] [output_dir] [--code] [--resume-path] [--epoch-resume] [--gpu-id] [overrides] ``` -| Name | Description | -| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. ~~Path (positional)~~ | -| `output_dir` | Directory to save binary weights to on each epoch. ~~Path (positional)~~ | -| `--code`, `-c` | Path to Python file with additional code to be imported. Allows [registering custom functions](/usage/training#custom-functions) for new architectures. ~~Optional[Path] \(option)~~ | -| `--resume-path`, `-r` | Path to pretrained weights from which to resume pretraining. ~~Optional[Path] \(option)~~ | -| `--epoch-resume`, `-er` | The epoch to resume counting from when using `--resume-path`. Prevents unintended overwriting of existing weight files. ~~Optional[int] \(option)~~ | -| `--gpu-id`, `-g` | GPU ID or `-1` for CPU. Defaults to `-1`. ~~int (option)~~ | -| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | -| overrides | Config parameters to override. Should be options starting with `--` that correspond to the config section and value to override, e.g. `--training.dropout 0.2`. ~~Any (option/flag)~~ | -| **CREATES** | The pretrained weights that can be used to initialize `spacy train`. | +| Name | Description | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `config_path` | Path to [training config](/api/data-formats#config) file containing all settings and hyperparameters. If `-`, the data will be [read from stdin](/usage/training#config-stdin). ~~Union[Path, str] \(positional)~~ | +| `output_dir` | Directory to save binary weights to on each epoch. ~~Path (positional)~~ | +| `--code`, `-c` | Path to Python file with additional code to be imported. Allows [registering custom functions](/usage/training#custom-functions) for new architectures. ~~Optional[Path] \(option)~~ | +| `--resume-path`, `-r` | Path to pretrained weights from which to resume pretraining. ~~Optional[Path] \(option)~~ | +| `--epoch-resume`, `-er` | The epoch to resume counting from when using `--resume-path`. Prevents unintended overwriting of existing weight files. ~~Optional[int] \(option)~~ | +| `--gpu-id`, `-g` | GPU ID or `-1` for CPU. Defaults to `-1`. ~~int (option)~~ | +| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | +| overrides | Config parameters to override. Should be options starting with `--` that correspond to the config section and value to override, e.g. `--training.dropout 0.2`. ~~Any (option/flag)~~ | +| **CREATES** | The pretrained weights that can be used to initialize `spacy train`. | ## evaluate {#evaluate new="2" tag="command"} @@ -872,11 +872,15 @@ $ python -m spacy evaluate [model] [data_path] [--output] [--gold-preproc] [--gp ## package {#package tag="command"} Generate an installable [Python package](/usage/training#models-generating) from -an existing pipeline data directory. All data files are copied over. If the path -to a [`meta.json`](/api/data-formats#meta) is supplied, or a `meta.json` is -found in the input directory, this file is used. Otherwise, the data can be -entered directly from the command line. spaCy will then create a `.tar.gz` -archive file that you can distribute and install with `pip install`. +an existing pipeline data directory. All data files are copied over. If +additional code files are provided (e.g. Python files containing custom +registered functions like +[pipeline components](/usage/processing-pipelines#custom-components)), they are +copied into the package and imported in the `__init__.py`. If the path to a +[`meta.json`](/api/data-formats#meta) is supplied, or a `meta.json` is found in +the input directory, this file is used. Otherwise, the data can be entered +directly from the command line. spaCy will then create a `.tar.gz` archive file +that you can distribute and install with `pip install`. @@ -887,7 +891,7 @@ this, you can set the `--no-sdist` flag. ```cli -$ python -m spacy package [input_dir] [output_dir] [--meta-path] [--create-meta] [--no-sdist] [--name] [--version] [--force] +$ python -m spacy package [input_dir] [output_dir] [--code] [--meta-path] [--create-meta] [--no-sdist] [--name] [--version] [--force] ``` > #### Example @@ -898,18 +902,19 @@ $ python -m spacy package [input_dir] [output_dir] [--meta-path] [--create-meta] > $ pip install dist/en_pipeline-0.0.0.tar.gz > ``` -| Name | Description | -| ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `input_dir` | Path to directory containing pipeline data. ~~Path (positional)~~ | -| `output_dir` | Directory to create package folder in. ~~Path (positional)~~ | -| `--meta-path`, `-m` 2 | Path to [`meta.json`](/api/data-formats#meta) file (optional). ~~Optional[Path] \(option)~~ | -| `--create-meta`, `-C` 2 | Create a `meta.json` file on the command line, even if one already exists in the directory. If an existing file is found, its entries will be shown as the defaults in the command line prompt. ~~bool (flag)~~ | -| `--no-sdist`, `-NS`, | Don't build the `.tar.gz` sdist automatically. Can be set if you want to run this step manually. ~~bool (flag)~~ | -| `--name`, `-n` 3 | Package name to override in meta. ~~Optional[str] \(option)~~ | -| `--version`, `-v` 3 | Package version to override in meta. Useful when training new versions, as it doesn't require editing the meta template. ~~Optional[str] \(option)~~ | -| `--force`, `-f` | Force overwriting of existing folder in output directory. ~~bool (flag)~~ | -| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | -| **CREATES** | A Python package containing the spaCy pipeline. | +| Name | Description | +| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `input_dir` | Path to directory containing pipeline data. ~~Path (positional)~~ | +| `output_dir` | Directory to create package folder in. ~~Path (positional)~~ | +| `--code`, `-c` 3 | Comma-separated paths to Python files to be included in the package and imported in its `__init__.py`. This allows including [registering functions](/usage/training#custom-functions) and [custom components](/usage/processing-pipelines#custom-components). ~~Optional[str] \(option)~~ | +| `--meta-path`, `-m` 2 | Path to [`meta.json`](/api/data-formats#meta) file (optional). ~~Optional[Path] \(option)~~ | +| `--create-meta`, `-C` 2 | Create a `meta.json` file on the command line, even if one already exists in the directory. If an existing file is found, its entries will be shown as the defaults in the command line prompt. ~~bool (flag)~~ | +| `--no-sdist`, `-NS`, | Don't build the `.tar.gz` sdist automatically. Can be set if you want to run this step manually. ~~bool (flag)~~ | +| `--name`, `-n` 3 | Package name to override in meta. ~~Optional[str] \(option)~~ | +| `--version`, `-v` 3 | Package version to override in meta. Useful when training new versions, as it doesn't require editing the meta template. ~~Optional[str] \(option)~~ | +| `--force`, `-f` | Force overwriting of existing folder in output directory. ~~bool (flag)~~ | +| `--help`, `-h` | Show help message and available arguments. ~~bool (flag)~~ | +| **CREATES** | A Python package containing the spaCy pipeline. | ## project {#project new="3"} diff --git a/website/docs/api/data-formats.md b/website/docs/api/data-formats.md index c4cc5b1e4..3df9a7ba4 100644 --- a/website/docs/api/data-formats.md +++ b/website/docs/api/data-formats.md @@ -63,6 +63,7 @@ your config and check that it's valid, you can run the > before_creation = null > after_creation = null > after_pipeline_creation = null +> batch_size = 1000 > > [nlp.tokenizer] > @tokenizers = "spacy.Tokenizer.v1" @@ -80,6 +81,7 @@ Defines the `nlp` object, its tokenizer and | `after_creation` | Optional [callback](/usage/training#custom-code-nlp-callbacks) to modify `nlp` object right after it's initialized. Defaults to `null`. ~~Optional[Callable[[Language], Language]]~~ | | `after_pipeline_creation` | Optional [callback](/usage/training#custom-code-nlp-callbacks) to modify `nlp` object after the pipeline components have been added. Defaults to `null`. ~~Optional[Callable[[Language], Language]]~~ | | `tokenizer` | The tokenizer to use. Defaults to [`Tokenizer`](/api/tokenizer). ~~Callable[[str], Doc]~~ | +| `batch_size` | Default batch size for [`Language.pipe`](/api/language#pipe) and [`Language.evaluate`](/api/language#evaluate). ~~int~~ | ### components {#config-components tag="section"} @@ -541,6 +543,7 @@ source of truth** used for loading a pipeline. > "version": "1.0.0", > "spacy_version": ">=3.0.0,<3.1.0", > "parent_package": "spacy", +> "requirements": ["spacy-transformers>=1.0.0,<1.1.0"], > "description": "Example pipeline for spaCy", > "author": "You", > "email": "you@example.com", @@ -571,6 +574,7 @@ source of truth** used for loading a pipeline. | `version` | Pipeline version. Will be used to version a Python package created with [`spacy package`](/api/cli#package). Defaults to `"0.0.0"`. ~~str~~ | | `spacy_version` | spaCy version range the package is compatible with. Defaults to the spaCy version used to create the pipeline, up to next minor version, which is the default compatibility for the available [trained pipelines](/models). For instance, a pipeline trained with v3.0.0 will have the version range `">=3.0.0,<3.1.0"`. ~~str~~ | | `parent_package` | Name of the spaCy package. Typically `"spacy"` or `"spacy_nightly"`. Defaults to `"spacy"`. ~~str~~ | +| `requirements` | Python package requirements that the pipeline depends on. Will be used for the Python package setup in [`spacy package`](/api/cli#package). Should be a list of package names with optional version specifiers, just like you'd define them in a `setup.cfg` or `requirements.txt`. Defaults to `[]`. ~~List[str]~~ | | `description` | Pipeline description. Also used for Python package. Defaults to `""`. ~~str~~ | | `author` | Pipeline author name. Also used for Python package. Defaults to `""`. ~~str~~ | | `email` | Pipeline author email. Also used for Python package. Defaults to `""`. ~~str~~ | diff --git a/website/docs/api/language.md b/website/docs/api/language.md index 51e9a5e10..382415416 100644 --- a/website/docs/api/language.md +++ b/website/docs/api/language.md @@ -42,6 +42,7 @@ information in [`Language.meta`](/api/language#meta) and not to configure the | `max_length` | Maximum number of characters allowed in a single text. Defaults to `10 ** 6`. ~~int~~ | | `meta` | [Meta data](/api/data-formats#meta) overrides. ~~Dict[str, Any]~~ | | `create_tokenizer` | Optional function that receives the `nlp` object and returns a tokenizer. ~~Callable[[Language], Callable[[str], Doc]]~~ | +| `batch_size` | Default batch size for [`pipe`](#pipe) and [`evaluate`](#evaluate). Defaults to `1000`. ~~int~~ | ## Language.from_config {#from_config tag="classmethod" new="3"} @@ -195,7 +196,7 @@ more efficient than processing texts one-by-one. | `texts` | A sequence of strings. ~~Iterable[str]~~ | | _keyword-only_ | | | `as_tuples` | If set to `True`, inputs should be a sequence of `(text, context)` tuples. Output will then be a sequence of `(doc, context)` tuples. Defaults to `False`. ~~bool~~ | -| `batch_size` | The number of texts to buffer. ~~int~~ | +| `batch_size` | The number of texts to buffer. ~~Optional[int]~~ | | `disable` | Names of pipeline components to [disable](/usage/processing-pipelines#disabling). ~~List[str]~~ | | `cleanup` | If `True`, unneeded strings are freed to control memory use. Experimental. ~~bool~~ | | `component_cfg` | Optional dictionary of keyword arguments for components, keyed by component names. Defaults to `None`. ~~Optional[Dict[str, Dict[str, Any]]]~~ | @@ -357,7 +358,7 @@ objects instead of tuples of `Doc` and `GoldParse` objects. | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | `examples` | A batch of [`Example`](/api/example) objects to learn from. ~~Iterable[Example]~~ | | _keyword-only_ | | -| `batch_size` | The batch size to use. ~~int~~ | +| `batch_size` | The batch size to use. ~~Optional[int]~~ | | `scorer` | Optional [`Scorer`](/api/scorer) to use. If not passed in, a new one will be created. ~~Optional[Scorer]~~ | | `component_cfg` | Optional dictionary of keyword arguments for components, keyed by component names. Defaults to `None`. ~~Optional[Dict[str, Dict[str, Any]]]~~ | | `scorer_cfg` | Optional dictionary of keyword arguments for the `Scorer`. Defaults to `None`. ~~Optional[Dict[str, Any]]~~ | @@ -786,15 +787,13 @@ doesn't, the pipeline analysis won't catch that. ### Pretty ============================= Pipeline Overview ============================= -# Component Assigns Requires Scores Retokenizes -- ------------- --------------- -------------- --------- ----------- -0 tagger token.tag tag_acc False - pos_acc - lemma_acc +# Component Assigns Requires Scores Retokenizes +- ------------- --------------- -------------- ----------- ----------- +0 tagger token.tag tag_acc False -1 entity_linker token.ent_kb_id doc.ents False - doc.sents - token.ent_iob +1 entity_linker token.ent_kb_id doc.ents nel_micro_f False + doc.sents nel_micro_r + token.ent_iob nel_micro_p token.ent_type diff --git a/website/docs/api/matcher.md b/website/docs/api/matcher.md index 81c2a8515..7c39d9caf 100644 --- a/website/docs/api/matcher.md +++ b/website/docs/api/matcher.md @@ -39,7 +39,9 @@ rule-based matching are: |  `IS_ALPHA`, `IS_ASCII`, `IS_DIGIT` | Token text consists of alphabetic characters, ASCII characters, digits. ~~bool~~ | |  `IS_LOWER`, `IS_UPPER`, `IS_TITLE` | Token text is in lowercase, uppercase, titlecase. ~~bool~~ | |  `IS_PUNCT`, `IS_SPACE`, `IS_STOP` | Token is punctuation, whitespace, stop word. ~~bool~~ | +|  `IS_SENT_START` | Token is start of sentence. ~~bool~~ | |  `LIKE_NUM`, `LIKE_URL`, `LIKE_EMAIL` | Token text resembles a number, URL, email. ~~bool~~ | +| `SPACY` | Token has a trailing space. ~~bool~~ | |  `POS`, `TAG`, `MORPH`, `DEP`, `LEMMA`, `SHAPE` | The token's simple and extended part-of-speech tag, morphological analysis, dependency label, lemma, shape. ~~str~~ | | `ENT_TYPE` | The token's entity label. ~~str~~ | | `_` 2.1 | Properties in [custom extension attributes](/usage/processing-pipelines#custom-components-attributes). ~~Dict[str, Any]~~ | @@ -61,7 +63,7 @@ matched: | `!` | Negate the pattern, by requiring it to match exactly 0 times. | | `?` | Make the pattern optional, by allowing it to match 0 or 1 times. | | `+` | Require the pattern to match 1 or more times. | -| `*` | Allow the pattern to match 0 or more times. | +| `*` | Allow the pattern to match 0 or more times. | Token patterns can also map to a **dictionary of properties** instead of a single value to indicate whether the expected value is a member of a list or how diff --git a/website/docs/api/morphologizer.md b/website/docs/api/morphologizer.md index d32514fb0..fed86ff5d 100644 --- a/website/docs/api/morphologizer.md +++ b/website/docs/api/morphologizer.md @@ -66,9 +66,6 @@ shortcut for this and instantiate the component using its string name and | `vocab` | The shared vocabulary. ~~Vocab~~ | | `model` | The [`Model`](https://thinc.ai/docs/api-model) powering the pipeline component. ~~Model[List[Doc], List[Floats2d]]~~ | | `name` | String name of the component instance. Used to add entries to the `losses` during training. ~~str~~ | -| _keyword-only_ | | -| `labels_morph` | Mapping of morph + POS tags to morph labels. ~~Dict[str, str]~~ | -| `labels_pos` | Mapping of morph + POS tags to POS tags. ~~Dict[str, str]~~ | ## Morphologizer.\_\_call\_\_ {#call tag="method"} diff --git a/website/docs/api/tagger.md b/website/docs/api/tagger.md index 2123004b6..f337b51fd 100644 --- a/website/docs/api/tagger.md +++ b/website/docs/api/tagger.md @@ -21,16 +21,12 @@ architectures and their arguments and hyperparameters. > > ```python > from spacy.pipeline.tagger import DEFAULT_TAGGER_MODEL -> config = { -> "set_morphology": False, -> "model": DEFAULT_TAGGER_MODEL, -> } +> config = {"model": DEFAULT_TAGGER_MODEL} > nlp.add_pipe("tagger", config=config) > ``` | Setting | Description | | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `set_morphology` | Whether to set morphological features. Defaults to `False`. ~~bool~~ | | `model` | A model instance that predicts the tag probabilities. The output vectors should match the number of tags in size, and be normalized as probabilities (all scores between 0 and 1, with the rows summing to `1`). Defaults to [Tagger](/api/architectures#Tagger). ~~Model[List[Doc], List[Floats2d]]~~ | ```python @@ -63,8 +59,6 @@ shortcut for this and instantiate the component using its string name and | `vocab` | The shared vocabulary. ~~Vocab~~ | | `model` | A model instance that predicts the tag probabilities. The output vectors should match the number of tags in size, and be normalized as probabilities (all scores between 0 and 1, with the rows summing to `1`). ~~Model[List[Doc], List[Floats2d]]~~ | | `name` | String name of the component instance. Used to add entries to the `losses` during training. ~~str~~ | -| _keyword-only_ | | -| `set_morphology` | Whether to set morphological features. ~~bool~~ | ## Tagger.\_\_call\_\_ {#call tag="method"} diff --git a/website/docs/api/top-level.md b/website/docs/api/top-level.md index eb2eb5d71..09a64f9e3 100644 --- a/website/docs/api/top-level.md +++ b/website/docs/api/top-level.md @@ -171,6 +171,25 @@ and _before_ loading any pipelines. | `gpu_id` | Device index to select. Defaults to `0`. ~~int~~ | | **RETURNS** | `True` ~~bool~~ | +### spacy.require_cpu {#spacy.require_cpu tag="function" new="3.0.0"} + +Allocate data and perform operations on CPU. +If data has already been allocated on GPU, it will not +be moved. Ideally, this function should be called right after importing spaCy +and _before_ loading any pipelines. + +> #### Example +> +> ```python +> import spacy +> spacy.require_cpu() +> nlp = spacy.load("en_core_web_sm") +> ``` + +| Name | Description | +| ----------- | ------------------------------------------------ | +| **RETURNS** | `True` ~~bool~~ | + ## displaCy {#displacy source="spacy/displacy"} As of v2.0, spaCy comes with a built-in visualization suite. For more info and diff --git a/website/docs/api/transformer.md b/website/docs/api/transformer.md index 5754d2238..e31c8ad2c 100644 --- a/website/docs/api/transformer.md +++ b/website/docs/api/transformer.md @@ -61,11 +61,11 @@ on the transformer architectures and their arguments and hyperparameters. > nlp.add_pipe("transformer", config=DEFAULT_CONFIG) > ``` -| Setting | Description | -| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `max_batch_items` | Maximum size of a padded batch. Defaults to `4096`. ~~int~~ | -| `set_extra_annotations` | Function that takes a batch of `Doc` objects and transformer outputs to set additional annotations on the `Doc`. The `Doc._.transformer_data` attribute is set prior to calling the callback. Defaults to `null_annotation_setter` (no additional annotations). ~~Callable[[List[Doc], FullTransformerBatch], None]~~ | -| `model` | The Thinc [`Model`](https://thinc.ai/docs/api-model) wrapping the transformer. Defaults to [TransformerModel](/api/architectures#TransformerModel). ~~Model[List[Doc], FullTransformerBatch]~~ | +| Setting | Description | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `max_batch_items` | Maximum size of a padded batch. Defaults to `4096`. ~~int~~ | +| `set_extra_annotations` | Function that takes a batch of `Doc` objects and transformer outputs to set additional annotations on the `Doc`. The `Doc._.trf_data` attribute is set prior to calling the callback. Defaults to `null_annotation_setter` (no additional annotations). ~~Callable[[List[Doc], FullTransformerBatch], None]~~ | +| `model` | The Thinc [`Model`](https://thinc.ai/docs/api-model) wrapping the transformer. Defaults to [TransformerModel](/api/architectures#TransformerModel). ~~Model[List[Doc], FullTransformerBatch]~~ | ```python https://github.com/explosion/spacy-transformers/blob/master/spacy_transformers/pipeline_component.py diff --git a/website/docs/usage/index.md b/website/docs/usage/index.md index ccb59e937..2df8cdaa0 100644 --- a/website/docs/usage/index.md +++ b/website/docs/usage/index.md @@ -129,10 +129,11 @@ grateful to use the work of Chainer's [CuPy](https://cupy.chainer.org) module, which provides a numpy-compatible interface for GPU arrays. spaCy can be installed on GPU by specifying `spacy[cuda]`, `spacy[cuda90]`, -`spacy[cuda91]`, `spacy[cuda92]`, `spacy[cuda100]`, `spacy[cuda101]` or -`spacy[cuda102]`. If you know your cuda version, using the more explicit -specifier allows cupy to be installed via wheel, saving some compilation time. -The specifiers should install [`cupy`](https://cupy.chainer.org). +`spacy[cuda91]`, `spacy[cuda92]`, `spacy[cuda100]`, `spacy[cuda101]`, +`spacy[cuda102]`, `spacy[cuda110]` or `spacy[cuda111]`. If you know your cuda +version, using the more explicit specifier allows cupy to be installed via +wheel, saving some compilation time. The specifiers should install +[`cupy`](https://cupy.chainer.org). ```bash $ pip install -U %%SPACY_PKG_NAME[cuda92]%%SPACY_PKG_FLAGS @@ -158,28 +159,37 @@ The other way to install spaCy is to clone its source. That is the common way if you want to make changes to the code base. You'll need to make sure that you have a development environment consisting of a Python distribution including header files, a compiler, -[pip](https://pip.pypa.io/en/latest/installing/), -[virtualenv](https://virtualenv.pypa.io/) and [git](https://git-scm.com) -installed. The compiler part is the trickiest. How to do that depends on your -system. See notes on [Ubuntu](#source-ubuntu), [macOS / OS X](#source-osx) and +[pip](https://pip.pypa.io/en/stable/) and [git](https://git-scm.com) installed. +The compiler part is the trickiest. How to do that depends on your system. See +notes on [Ubuntu](#source-ubuntu), [macOS / OS X](#source-osx) and [Windows](#source-windows) for details. ```bash -$ python -m pip install -U pip # update pip +$ python -m pip install -U pip setuptools wheel # install/update build tools $ git clone https://github.com/explosion/spaCy # clone spaCy $ cd spaCy # navigate into dir - $ python -m venv .env # create environment in .env $ source .env/bin/activate # activate virtual env -$ export PYTHONPATH=`pwd` # set Python path to spaCy dir -$ pip install -r requirements.txt # install all requirements -$ python setup.py build_ext --inplace # compile spaCy +$ pip install . # compile and install spaCy ``` -Compared to regular install via pip, the -[`requirements.txt`](%%GITHUB_SPACY/requirements.txt) additionally installs -developer dependencies such as Cython. See the [quickstart widget](#quickstart) -to get the right commands for your platform and Python version. +To install with extras: + +```bash +$ pip install .[lookups,cuda102] # install spaCy with extras +``` + +To install all dependencies required for development: + +```bash +$ pip install -r requirements.txt +``` + +Compared to a regular install via pip, the +[`requirements.txt`](%%GITHUB_SPACY/requirements.txt) additionally includes +developer dependencies such as Cython and the libraries required to run the test +suite. See the [quickstart widget](#quickstart) to get the right commands for +your platform and Python version. @@ -194,6 +204,32 @@ to get the right commands for your platform and Python version. [Visual Studio Express](https://www.visualstudio.com/vs/visual-studio-express/) that matches the version that was used to compile your Python interpreter. +#### Additional options for developers {#source-developers} + +Some additional options may be useful for spaCy developers who are editing the +source code and recompiling frequently. + +- Install in editable mode. Changes to `.py` files will be reflected as soon as + the files are saved, but edits to Cython files (`.pxd`, `.pyx`) will require + the `pip install` or `python setup.py build_ext` command below to be run + again. Before installing in editable mode, be sure you have removed any + previous installs with `pip uninstall spacy`, which you may need to run + multiple times to remove all traces of earlier installs. + + ```bash + $ pip install -r requirements.txt + $ pip install --no-build-isolation --editable . + ``` + +- Build in parallel using `N` CPUs to speed up compilation and then install in + editable mode: + + ```bash + $ pip install -r requirements.txt + $ python setup.py build_ext --inplace -j N + $ pip install --no-build-isolation --editable . + ``` + ### Building an executable {#executable} The spaCy repository includes a [`Makefile`](%%GITHUB_SPACY/Makefile) that @@ -228,6 +264,36 @@ You can configure the build process with the following environment variables: | `PYVER` | The Python version to build against. This version needs to be available on your build and runtime machines. Defaults to `3.6`. | | `WHEELHOUSE` | Directory to store the wheel files during compilation. Defaults to `./wheelhouse`. | +#### Additional options for developers {#source-developers} + +Some additional options may be useful for spaCy developers who are editing the +source code and recompiling frequently. + +- Install in editable mode. Changes to `.py` files will be reflected as soon as + the files are saved, but edits to Cython files (`.pxd`, `.pyx`) will require + the `pip install` or `python setup.py build_ext` command below to be run + again. Before installing in editable mode, be sure you have removed any + previous installs with `pip uninstall spacy`, which you may need to run + multiple times to remove all traces of earlier installs. + + ```diff + pip install -U pip setuptools wheel + - pip install . + + pip install -r requirements.txt + + pip install --no-build-isolation --editable . + ``` + +- Build in parallel using `N` CPUs to speed up compilation and then install in + editable mode: + + ```diff + pip install -U pip setuptools wheel + - pip install . + + pip install -r requirements.txt + + python setup.py build_ext --inplace -j N + + python setup.py develop + ``` + ### Run tests {#run-tests} spaCy comes with an [extensive test suite](%%GITHUB_SPACY/spacy/tests). In order @@ -242,7 +308,7 @@ that directory. Don't forget to also install the test utilities via spaCy's ```bash $ python -c "import os; import spacy; print(os.path.dirname(spacy.__file__))" $ pip install -r path/to/requirements.txt -$ python -m pytest [spacy directory] +$ python -m pytest --pyargs %%SPACY_PKG_NAME ``` Calling `pytest` on the spaCy directory will run only the basic tests. The flag @@ -250,8 +316,8 @@ Calling `pytest` on the spaCy directory will run only the basic tests. The flag ```bash $ python -m pip install -U pytest # update pytest -$ python -m pytest [spacy directory] # basic tests -$ python -m pytest [spacy directory] --slow # basic and slow tests +$ python -m pytest --pyargs %%SPACY_PKG_NAME # basic tests +$ python -m pytest --pyargs %%SPACY_PKG_NAME --slow # basic and slow tests ``` ## Troubleshooting guide {#troubleshooting} diff --git a/website/docs/usage/layers-architectures.md b/website/docs/usage/layers-architectures.md index aa62a77d4..eb6f8b288 100644 --- a/website/docs/usage/layers-architectures.md +++ b/website/docs/usage/layers-architectures.md @@ -502,7 +502,7 @@ with Model.define_operators({">>": chain}): ## Create new trainable components {#components} -In addition to [swapping out](#swap-architectures) default models in built-in +In addition to [swapping out](#swap-architectures) layers in existing components, you can also implement an entirely new, [trainable](/usage/processing-pipelines#trainable-components) pipeline component from scratch. This can be done by creating a new class inheriting from @@ -523,20 +523,28 @@ overview of the `TrainablePipe` methods used by This section outlines an example use-case of implementing a **novel relation extraction component** from scratch. We'll implement a binary relation extraction method that determines whether or not **two entities** in a document -are related, and if so, what type of relation. We'll allow multiple types of -relations between two such entities (multi-label setting). There are two major -steps required: +are related, and if so, what type of relation connects them. We allow multiple +types of relations between two such entities (a multi-label setting). There are +two major steps required: 1. Implement a [machine learning model](#component-rel-model) specific to this - task. It will have to extract candidates from a [`Doc`](/api/doc) and predict - a relation for the available candidate pairs. -2. Implement a custom [pipeline component](#component-rel-pipe) powered by the - machine learning model that sets annotations on the [`Doc`](/api/doc) passing - through the pipeline. + task. It will have to extract candidate relation instances from a + [`Doc`](/api/doc) and predict the corresponding scores for each relation + label. +2. Implement a custom [pipeline component](#component-rel-pipe) - powered by the + machine learning model from step 1 - that translates the predicted scores + into annotations that are stored on the [`Doc`](/api/doc) objects as they + pass through the `nlp` pipeline. - + +Run this example use-case by using our project template. It includes all the +code to create the ML model and the pipeline component from scratch. +It also contains two config files to train the model: +one to run on CPU with a Tok2Vec layer, and one for the GPU using a transformer. +The project applies the relation extraction component to identify biomolecular +interactions in a sample dataset, but you can easily swap in your own dataset +for your experiments in any other domain. + #### Step 1: Implementing the Model {#component-rel-model} @@ -552,41 +560,17 @@ matrix** (~~Floats2d~~) of predictions: > for details. ```python -### Register the model architecture -@registry.architectures.register("rel_model.v1") +### The model architecture +@spacy.registry.architectures.register("rel_model.v1") def create_relation_model(...) -> Model[List[Doc], Floats2d]: model = ... # 👈 model will go here return model ``` -The first layer in this model will typically be an -[embedding layer](/usage/embeddings-transformers) such as a -[`Tok2Vec`](/api/tok2vec) component or a [`Transformer`](/api/transformer). This -layer is assumed to be of type ~~Model[List[Doc], List[Floats2d]]~~ as it -transforms each **document into a list of tokens**, with each token being -represented by its embedding in the vector space. - -Next, we need a method that **generates pairs of entities** that we want to -classify as being related or not. As these candidate pairs are typically formed -within one document, this function takes a [`Doc`](/api/doc) as input and -outputs a `List` of `Span` tuples. For instance, a very straightforward -implementation would be to just take any two entities from the same document: - -```python -### Simple candiate generation -def get_candidates(doc: Doc) -> List[Tuple[Span, Span]]: - candidates = [] - for ent1 in doc.ents: - for ent2 in doc.ents: - candidates.append((ent1, ent2)) - return candidates -``` - -But we could also refine this further by **excluding relations** of an entity -with itself, and posing a **maximum distance** (in number of tokens) between two -entities. We register this function in the -[`@misc` registry](/api/top-level#registry) so we can refer to it from the -config, and easily swap it out for any other candidate generation function. +We adapt a **modular approach** to the definition of this relation model, and +define it as chaining two layers together: the first layer that generates an +instance tensor from a given set of documents, and the second layer that +transforms the instance tensor into a final tensor holding the predictions: > #### config.cfg (excerpt) > @@ -594,18 +578,159 @@ config, and easily swap it out for any other candidate generation function. > [model] > @architectures = "rel_model.v1" > -> [model.tok2vec] +> [model.create_instance_tensor] > # ... > -> [model.get_candidates] -> @misc = "rel_cand_generator.v1" -> max_length = 20 +> [model.classification_layer] +> # ... > ``` ```python -### Extended candidate generation {highlight="1,2,7,8"} -@registry.misc.register("rel_cand_generator.v1") -def create_candidate_indices(max_length: int) -> Callable[[Doc], List[Tuple[Span, Span]]]: +### The model architecture {highlight="6"} +@spacy.registry.architectures.register("rel_model.v1") +def create_relation_model( + create_instance_tensor: Model[List[Doc], Floats2d], + classification_layer: Model[Floats2d, Floats2d], +) -> Model[List[Doc], Floats2d]: + model = chain(create_instance_tensor, classification_layer) + return model +``` + +The `classification_layer` could be something like a +[Linear](https://thinc.ai/docs/api-layers#linear) layer followed by a +[logistic](https://thinc.ai/docs/api-layers#logistic) activation function: + +> #### config.cfg (excerpt) +> +> ```ini +> [model.classification_layer] +> @architectures = "rel_classification_layer.v1" +> nI = null +> nO = null +> ``` + +```python +### The classification layer +@spacy.registry.architectures.register("rel_classification_layer.v1") +def create_classification_layer( + nO: int = None, nI: int = None +) -> Model[Floats2d, Floats2d]: + return chain(Linear(nO=nO, nI=nI), Logistic()) +``` + +The first layer that **creates the instance tensor** can be defined by +implementing a +[custom forward function](https://thinc.ai/docs/usage-models#weights-layers-forward) +with an appropriate backpropagation callback. We also define an +[initialization method](https://thinc.ai/docs/usage-models#weights-layers-init) +that ensures that the layer is properly set up for training. + +We omit some of the implementation details here, and refer to the +[spaCy project](https://github.com/explosion/projects/tree/v3/tutorials/rel_component) +that has the full implementation. + +> #### config.cfg (excerpt) +> +> ```ini +> [model.create_instance_tensor] +> @architectures = "rel_instance_tensor.v1" +> +> [model.create_instance_tensor.tok2vec] +> @architectures = "spacy.HashEmbedCNN.v1" +> # ... +> +> [model.create_instance_tensor.pooling] +> @layers = "reduce_mean.v1" +> +> [model.create_instance_tensor.get_instances] +> # ... +> ``` + +```python +### The layer that creates the instance tensor +@spacy.registry.architectures.register("rel_instance_tensor.v1") +def create_tensors( + tok2vec: Model[List[Doc], List[Floats2d]], + pooling: Model[Ragged, Floats2d], + get_instances: Callable[[Doc], List[Tuple[Span, Span]]], +) -> Model[List[Doc], Floats2d]: + + return Model( + "instance_tensors", + instance_forward, + init=instance_init, + layers=[tok2vec, pooling], + refs={"tok2vec": tok2vec, "pooling": pooling}, + attrs={"get_instances": get_instances}, + ) + + +# The custom forward function +def instance_forward( + model: Model[List[Doc], Floats2d], + docs: List[Doc], + is_train: bool, +) -> Tuple[Floats2d, Callable]: + tok2vec = model.get_ref("tok2vec") + tokvecs, bp_tokvecs = tok2vec(docs, is_train) + get_instances = model.attrs["get_instances"] + all_instances = [get_instances(doc) for doc in docs] + pooling = model.get_ref("pooling") + relations = ... + + def backprop(d_relations: Floats2d) -> List[Doc]: + d_tokvecs = ... + return bp_tokvecs(d_tokvecs) + + return relations, backprop + + +# The custom initialization method +def instance_init( + model: Model, + X: List[Doc] = None, + Y: Floats2d = None, +) -> Model: + tok2vec = model.get_ref("tok2vec") + tok2vec.initialize(X) + return model + +``` + +This custom layer uses an [embedding layer](/usage/embeddings-transformers) such +as a [`Tok2Vec`](/api/tok2vec) component or a [`Transformer`](/api/transformer). +This layer is assumed to be of type ~~Model[List[Doc], List[Floats2d]]~~ as it +transforms each **document into a list of tokens**, with each token being +represented by its embedding in the vector space. + +The `pooling` layer will be applied to summarize the token vectors into **entity +vectors**, as named entities (represented by ~~Span~~ objects) can consist of +one or multiple tokens. For instance, the pooling layer could resort to +calculating the average of all token vectors in an entity. Thinc provides +several +[built-in pooling operators](https://thinc.ai/docs/api-layers#reduction-ops) for +this purpose. + +Finally, we need a `get_instances` method that **generates pairs of entities** +that we want to classify as being related or not. As these candidate pairs are +typically formed within one document, this function takes a [`Doc`](/api/doc) as +input and outputs a `List` of `Span` tuples. For instance, the following +implementation takes any two entities from the same document, as long as they +are within a **maximum distance** (in number of tokens) of eachother: + +> #### config.cfg (excerpt) +> +> ```ini +> +> [model.create_instance_tensor.get_instances] +> @misc = "rel_instance_generator.v1" +> max_length = 100 +> ``` + +```python +### Candidate generation +@spacy.registry.misc.register("rel_instance_generator.v1") +def create_instances(max_length: int) -> Callable[[Doc], List[Tuple[Span, Span]]]: def get_candidates(doc: "Doc") -> List[Tuple[Span, Span]]: candidates = [] for ent1 in doc.ents: @@ -617,45 +742,39 @@ def create_candidate_indices(max_length: int) -> Callable[[Doc], List[Tuple[Span return get_candidates ``` -Finally, we require a method that transforms the candidate entity pairs into a -2D tensor using the specified [`Tok2Vec`](/api/tok2vec) or -[`Transformer`](/api/transformer). The resulting ~~Floats2~~ object will then be -processed by a final `output_layer` of the network. Putting all this together, -we can define our relation model in a config file as such: +This function in added to the [`@misc` registry](/api/top-level#registry) so we +can refer to it from the config, and easily swap it out for any other candidate +generation function. -```ini -### config.cfg -[model] -@architectures = "rel_model.v1" -# ... +#### Intermezzo: define how to store the relations data {#component-rel-attribute} -[model.tok2vec] -# ... +> #### Example output +> +> ```python +> doc = nlp("Amsterdam is the capital of the Netherlands.") +> print("spans", [(e.start, e.text, e.label_) for e in doc.ents]) +> for value, rel_dict in doc._.rel.items(): +> print(f"{value}: {rel_dict}") +> +> # spans [(0, 'Amsterdam', 'LOC'), (6, 'Netherlands', 'LOC')] +> # (0, 6): {'CAPITAL_OF': 0.89, 'LOCATED_IN': 0.75, 'UNRELATED': 0.002} +> # (6, 0): {'CAPITAL_OF': 0.01, 'LOCATED_IN': 0.13, 'UNRELATED': 0.017} +> ``` -[model.get_candidates] -@misc = "rel_cand_generator.v1" -max_length = 20 - -[model.create_candidate_tensor] -@misc = "rel_cand_tensor.v1" - -[model.output_layer] -@architectures = "rel_output_layer.v1" -# ... -``` - - - - -When creating this model, we store the custom functions as -[attributes](https://thinc.ai/docs/api-model#properties) and the sublayers as -references, so we can access them easily: +For our new relation extraction component, we will use a custom +[extension attribute](/usage/processing-pipelines#custom-components-attributes) +`doc._.rel` in which we store relation data. The attribute refers to a +dictionary, keyed by the **start offsets of each entity** involved in the +candidate relation. The values in the dictionary refer to another dictionary +where relation labels are mapped to values between 0 and 1. We assume anything +above 0.5 to be a `True` relation. The ~~Example~~ instances that we'll use as +training data, will include their gold-standard relation annotations in +`example.reference._.rel`. ```python -tok2vec_layer = model.get_ref("tok2vec") -output_layer = model.get_ref("output_layer") -create_candidate_tensor = model.attrs["create_candidate_tensor"] -get_candidates = model.attrs["get_candidates"] +### Registering the extension attribute +from spacy.tokens import Doc +Doc.set_extension("rel", default={}) ``` #### Step 2: Implementing the pipeline component {#component-rel-pipe} @@ -698,19 +817,44 @@ class RelationExtractor(TrainablePipe): ... ``` -Before the model can be used, it needs to be -[initialized](/usage/training#initialization). This function receives a callback -to access the full **training data set**, or a representative sample. This data -set can be used to deduce all **relevant labels**. Alternatively, a list of -labels can be provided to `initialize`, or you can call -`RelationExtractor.add_label` directly. The number of labels defines the output -dimensionality of the network, and will be used to do +Typically, the **constructor** defines the vocab, the Machine Learning model, +and the name of this component. Additionally, this component, just like the +`textcat` and the `tagger`, stores an **internal list of labels**. The ML model +will predict scores for each label. We add convenience methods to easily +retrieve and add to them. + +```python +### The constructor (continued) + def __init__(self, vocab, model, name="rel"): + """Create a component instance.""" + # ... + self.cfg = {"labels": []} + + @property + def labels(self) -> Tuple[str]: + """Returns the labels currently added to the component.""" + return tuple(self.cfg["labels"]) + + def add_label(self, label: str): + """Add a new label to the pipe.""" + self.cfg["labels"] = list(self.labels) + [label] +``` + +After creation, the component needs to be +[initialized](/usage/training#initialization). This method can define the +relevant labels in two ways: explicitely by setting the `labels` argument in the +[`initialize` block](/api/data-formats#config-initialize) of the config, or +implicately by deducing them from the `get_examples` callback that generates the +full **training data set**, or a representative sample. + +The final number of labels defines the output dimensionality of the network, and +will be used to do [shape inference](https://thinc.ai/docs/usage-models#validation) throughout the layers of the neural network. This is triggered by calling [`Model.initialize`](https://thinc.ai/api/model#initialize). ```python -### The initialize method {highlight="12,18,22"} +### The initialize method {highlight="12,15,18,22"} from itertools import islice def initialize( @@ -741,7 +885,7 @@ Typically, this happens when the pipeline is set up before training in [`spacy train`](/api/cli#training). After initialization, the pipeline component and its internal model can be trained and used to make predictions. -During training, the function [`update`](/api/pipe#update) is invoked which +During training, the method [`update`](/api/pipe#update) is invoked which delegates to [`Model.begin_update`](https://thinc.ai/docs/api-model#begin_update) and a [`get_loss`](/api/pipe#get_loss) function that **calculates the loss** for a @@ -761,18 +905,18 @@ def update( sgd: Optional[Optimizer] = None, losses: Optional[Dict[str, float]] = None, ) -> Dict[str, float]: - ... - docs = [ex.predicted for ex in examples] + # ... + docs = [eg.predicted for eg in examples] predictions, backprop = self.model.begin_update(docs) loss, gradient = self.get_loss(examples, predictions) backprop(gradient) losses[self.name] += loss - ... + # ... return losses ``` -When the internal model is trained, the component can be used to make novel -**predictions**. The [`predict`](/api/pipe#predict) function needs to be +After training the model, the component can be used to make novel +**predictions**. The [`predict`](/api/pipe#predict) method needs to be implemented for each subclass of `TrainablePipe`. In our case, we can simply delegate to the internal model's [predict](https://thinc.ai/docs/api-model#predict) function that takes a batch @@ -788,42 +932,21 @@ def predict(self, docs: Iterable[Doc]) -> Floats2d: The final method that needs to be implemented, is [`set_annotations`](/api/pipe#set_annotations). This function takes the predictions, and modifies the given `Doc` object in place to store them. For our -relation extraction component, we store the data as a dictionary in a custom -[extension attribute](/usage/processing-pipelines#custom-components-attributes) -`doc._.rel`. As keys, we represent the candidate pair by the **start offsets of -each entity**, as this defines an entity pair uniquely within one document. +relation extraction component, we store the data in the +[custom attribute](#component-rel-attribute)`doc._.rel`. To interpret the scores predicted by the relation extraction model correctly, we -need to refer to the model's `get_candidates` function that defined which pairs +need to refer to the model's `get_instances` function that defined which pairs of entities were relevant candidates, so that the predictions can be linked to those exact entities: -> #### Example output -> -> ```python -> doc = nlp("Amsterdam is the capital of the Netherlands.") -> print("spans", [(e.start, e.text, e.label_) for e in doc.ents]) -> for value, rel_dict in doc._.rel.items(): -> print(f"{value}: {rel_dict}") -> -> # spans [(0, 'Amsterdam', 'LOC'), (6, 'Netherlands', 'LOC')] -> # (0, 6): {'CAPITAL_OF': 0.89, 'LOCATED_IN': 0.75, 'UNRELATED': 0.002} -> # (6, 0): {'CAPITAL_OF': 0.01, 'LOCATED_IN': 0.13, 'UNRELATED': 0.017} -> ``` - -```python -### Registering the extension attribute -from spacy.tokens import Doc -Doc.set_extension("rel", default={}) -``` - ```python ### The set_annotations method {highlight="5-6,10"} def set_annotations(self, docs: Iterable[Doc], predictions: Floats2d): c = 0 - get_candidates = self.model.attrs["get_candidates"] + get_instances = self.model.attrs["get_instances"] for doc in docs: - for (e1, e2) in get_candidates(doc): + for (e1, e2) in get_instances(doc): offset = (e1.start, e2.start) if offset not in doc._.rel: doc._.rel[offset] = {} @@ -837,12 +960,33 @@ Under the hood, when the pipe is applied to a document, it delegates to the ```python ### The __call__ method -def __call__(self, Doc doc): +def __call__(self, doc: Doc): predictions = self.predict([doc]) self.set_annotations([doc], predictions) return doc ``` +There is one more optional method to implement: [`score`](/api/pipe#score) +calculates the performance of your component on a set of examples, and returns +the results as a dictionary: + +```python +### The score method +def score(self, examples: Iterable[Example]) -> Dict[str, Any]: + prf = PRFScore() + for example in examples: + ... + + return { + "rel_micro_p": prf.precision, + "rel_micro_r": prf.recall, + "rel_micro_f": prf.fscore, + } +``` + +This is particularly useful for calculating relevant scores on the development +corpus when training the component with [`spacy train`](/api/cli#training). + Once our `TrainablePipe` subclass is fully implemented, we can [register](/usage/processing-pipelines#custom-components-factories) the component with the [`@Language.factory`](/api/language#factory) decorator. This @@ -858,13 +1002,12 @@ assigns it a name and lets you create the component with > > [components.relation_extractor.model] > @architectures = "rel_model.v1" -> -> [components.relation_extractor.model.tok2vec] > # ... > -> [components.relation_extractor.model.get_candidates] -> @misc = "rel_cand_generator.v1" -> max_length = 20 +> [training.score_weights] +> rel_micro_p = 0.0 +> rel_micro_r = 0.0 +> rel_micro_f = 1.0 > ``` ```python @@ -876,6 +1019,34 @@ def make_relation_extractor(nlp, name, model): return RelationExtractor(nlp.vocab, model, name) ``` - +```python +### Factory annotations {highlight="5-11"} +from spacy.language import Language + +@Language.factory( + "relation_extractor", + requires=["doc.ents", "token.ent_iob", "token.ent_type"], + assigns=["doc._.rel"], + default_score_weights={ + "rel_micro_p": None, + "rel_micro_r": None, + "rel_micro_f": None, + }, +) +def make_relation_extractor(nlp, name, model): + return RelationExtractor(nlp.vocab, model, name) +``` + + +Run this example use-case by using our project template. It includes all the +code to create the ML model and the pipeline component from scratch. +It contains two config files to train the model: +one to run on CPU with a Tok2Vec layer, and one for the GPU using a transformer. +The project applies the relation extraction component to identify biomolecular +interactions, but you can easily swap in your own dataset for your experiments +in any other domain. + diff --git a/website/docs/usage/linguistic-features.md b/website/docs/usage/linguistic-features.md index af07a438f..9a2b538d1 100644 --- a/website/docs/usage/linguistic-features.md +++ b/website/docs/usage/linguistic-features.md @@ -54,9 +54,9 @@ create a surface form. Here are some examples: | I don't watch the news, I read the paper | read | read | `VERB` | `VerbForm=Fin`, `Mood=Ind`, `Tense=Pres` | | I read the paper yesterday | read | read | `VERB` | `VerbForm=Fin`, `Mood=Ind`, `Tense=Past` | -Morphological features are stored in the [`MorphAnalysis`](/api/morphanalysis) -under `Token.morph`, which allows you to access individual morphological -features. +Morphological features are stored in the +[`MorphAnalysis`](/api/morphology#morphanalysis) under `Token.morph`, which +allows you to access individual morphological features. > #### 📝 Things to try > diff --git a/website/docs/usage/processing-pipelines.md b/website/docs/usage/processing-pipelines.md index ef44009ae..e55fc9ebd 100644 --- a/website/docs/usage/processing-pipelines.md +++ b/website/docs/usage/processing-pipelines.md @@ -487,15 +487,13 @@ analysis = nlp.analyze_pipes(pretty=True) ### Pretty ============================= Pipeline Overview ============================= -# Component Assigns Requires Scores Retokenizes -- ------------- --------------- -------------- --------- ----------- -0 tagger token.tag tag_acc False - pos_acc - lemma_acc +# Component Assigns Requires Scores Retokenizes +- ------------- --------------- -------------- ----------- ----------- +0 tagger token.tag tag_acc False -1 entity_linker token.ent_kb_id doc.ents False - doc.sents - token.ent_iob +1 entity_linker token.ent_kb_id doc.ents nel_micro_f False + doc.sents nel_micro_r + token.ent_iob nel_micro_p token.ent_type diff --git a/website/docs/usage/rule-based-matching.md b/website/docs/usage/rule-based-matching.md index 44d0fd388..22bf4f470 100644 --- a/website/docs/usage/rule-based-matching.md +++ b/website/docs/usage/rule-based-matching.md @@ -158,21 +158,22 @@ The available token pattern keys correspond to a number of [`Token` attributes](/api/token#attributes). The supported attributes for rule-based matching are: -| Attribute |  Description | -| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | -| `ORTH` | The exact verbatim text of a token. ~~str~~ | -| `TEXT` 2.1 | The exact verbatim text of a token. ~~str~~ | -| `LOWER` | The lowercase form of the token text. ~~str~~ | -|  `LENGTH` | The length of the token text. ~~int~~ | -|  `IS_ALPHA`, `IS_ASCII`, `IS_DIGIT` | Token text consists of alphabetic characters, ASCII characters, digits. ~~bool~~ | -|  `IS_LOWER`, `IS_UPPER`, `IS_TITLE` | Token text is in lowercase, uppercase, titlecase. ~~bool~~ | -|  `IS_PUNCT`, `IS_SPACE`, `IS_STOP` | Token is punctuation, whitespace, stop word. ~~bool~~ | -|  `IS_SENT_START` | Token is start of sentence. ~~bool~~ | -|  `LIKE_NUM`, `LIKE_URL`, `LIKE_EMAIL` | Token text resembles a number, URL, email. ~~bool~~ | -|  `POS`, `TAG`, `MORPH`, `DEP`, `LEMMA`, `SHAPE` | The token's simple and extended part-of-speech tag, morphological analysis, dependency label, lemma, shape. ~~str~~ | -| `ENT_TYPE` | The token's entity label. ~~str~~ | -| `_` 2.1 | Properties in [custom extension attributes](/usage/processing-pipelines#custom-components-attributes). ~~Dict[str, Any]~~ | -| `OP` | [Operator or quantifier](#quantifiers) to determine how often to match a token pattern. ~~str~~ | +| Attribute |  Description | +| ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ORTH` | The exact verbatim text of a token. ~~str~~ | +| `TEXT` 2.1 | The exact verbatim text of a token. ~~str~~ | +| `LOWER` | The lowercase form of the token text. ~~str~~ | +|  `LENGTH` | The length of the token text. ~~int~~ | +|  `IS_ALPHA`, `IS_ASCII`, `IS_DIGIT` | Token text consists of alphabetic characters, ASCII characters, digits. ~~bool~~ | +|  `IS_LOWER`, `IS_UPPER`, `IS_TITLE` | Token text is in lowercase, uppercase, titlecase. ~~bool~~ | +|  `IS_PUNCT`, `IS_SPACE`, `IS_STOP` | Token is punctuation, whitespace, stop word. ~~bool~~ | +|  `IS_SENT_START` | Token is start of sentence. ~~bool~~ | +|  `LIKE_NUM`, `LIKE_URL`, `LIKE_EMAIL` | Token text resembles a number, URL, email. ~~bool~~ | +| `SPACY` | Token has a trailing space. ~~bool~~ | +|  `POS`, `TAG`, `MORPH`, `DEP`, `LEMMA`, `SHAPE` | The token's simple and extended part-of-speech tag, morphological analysis, dependency label, lemma, shape. Note that the values of these attributes are case-sensitive. For a list of available part-of-speech tags and dependency labels, see the [Annotation Specifications](/api/annotation). ~~str~~ | +| `ENT_TYPE` | The token's entity label. ~~str~~ | +| `_` 2.1 | Properties in [custom extension attributes](/usage/processing-pipelines#custom-components-attributes). ~~Dict[str, Any]~~ | +| `OP` | [Operator or quantifier](#quantifiers) to determine how often to match a token pattern. ~~str~~ | diff --git a/website/docs/usage/saving-loading.md b/website/docs/usage/saving-loading.md index c4957763e..38e80db40 100644 --- a/website/docs/usage/saving-loading.md +++ b/website/docs/usage/saving-loading.md @@ -463,12 +463,12 @@ entry_points={ } ``` -The factory can also implement other pipeline component methods like `to_disk` and -`from_disk` for serialization, or even `update` to make the component trainable. -If a component exposes a `from_disk` method and is included in a pipeline, spaCy -will call it on load. This lets you ship custom data with your pipeline package. -When you save out a pipeline using `nlp.to_disk` and the component exposes a -`to_disk` method, it will be called with the disk path. +The factory can also implement other pipeline component methods like `to_disk` +and `from_disk` for serialization, or even `update` to make the component +trainable. If a component exposes a `from_disk` method and is included in a +pipeline, spaCy will call it on load. This lets you ship custom data with your +pipeline package. When you save out a pipeline using `nlp.to_disk` and the +component exposes a `to_disk` method, it will be called with the disk path. ```python def to_disk(self, path, exclude=tuple()): @@ -633,10 +633,10 @@ can be a convenient way to share them with your team. spaCy comes with a handy CLI command that will create all required files, and -walk you through generating the meta data. You can also create the `meta.json` -manually and place it in the data directory, or supply a path to it using the -`--meta` flag. For more info on this, see the [`package`](/api/cli#package) -docs. +walk you through generating the meta data. You can also create the +[`meta.json`](/api/data-formats#meta) manually and place it in the data +directory, or supply a path to it using the `--meta` flag. For more info on +this, see the [`package`](/api/cli#package) docs. > #### meta.json (example) > @@ -654,7 +654,7 @@ docs. > ``` ```cli -$ python -m spacy package ./en_example_pipeline ./my_pipelines +$ python -m spacy package ./en_example_pipeline ./packages ``` This command will create a pipeline package directory and will run @@ -683,15 +683,44 @@ If you're creating the package manually, keep in mind that the directories need to be named according to the naming conventions of `lang_name` and `lang_name-version`. -### Customizing the package setup {#models-custom} +### Including custom functions and components {#models-custom} -The `load()` method that comes with our pipeline package templates will take -care of putting all this together and returning a `Language` object with the -loaded pipeline and data. If your pipeline requires -[custom components](/usage/processing-pipelines#custom-components) or a custom -language class, you can also **ship the code with your package** and include it -in the `__init__.py` – for example, to register a component before the `nlp` -object is created. +If your pipeline includes +[custom components](/usage/processing-pipelines#custom-components), model +architectures or other [code](/usage/training#custom-code), those functions need +to be registered **before** your pipeline is loaded. Otherwise, spaCy won't know +how to create the objects referenced in the config. The +[`spacy package`](/api/cli#package) command lets you provide one or more paths +to Python files containing custom registered functions using the `--code` +argument. + +> #### \_\_init\_\_.py (excerpt) +> +> ```python +> from . import functions +> +> def load(**overrides): +> ... +> ``` + +```cli +$ python -m spacy package ./en_example_pipeline ./packages --code functions.py +``` + +The Python files will be copied over into the root of the package, and the +package's `__init__.py` will import them as modules. This ensures that functions +are registered when the pipeline is imported, e.g. when you call `spacy.load`. A +simple import is all that's needed to make registered functions available. + +Make sure to include **all Python files** that are referenced in your custom +code, including modules imported by others. If your custom code depends on +**external packages**, make sure they're listed in the list of `"requirements"` +in your [`meta.json`](/api/data-formats#meta). For the majority of use cases, +registered functions should provide you with all customizations you need, from +custom components to custom model architectures and lifecycle hooks. However, if +you do want to customize the setup in more detail, you can edit the package's +`__init__.py` and the package's `load` function that's called by +[`spacy.load`](/api/top-level#spacy.load). diff --git a/website/docs/usage/spacy-101.md b/website/docs/usage/spacy-101.md index c315c5f76..52daf33b8 100644 --- a/website/docs/usage/spacy-101.md +++ b/website/docs/usage/spacy-101.md @@ -513,9 +513,10 @@ via the following platforms: questions** and everything related to problems with your specific code. The Stack Overflow community is much larger than ours, so if your problem can be solved by others, you'll receive help much quicker. -- [Gitter chat](https://gitter.im/explosion/spaCy): **General discussion** about - spaCy, meeting other community members and exchanging **tips, tricks and best - practices**. +- [GitHub discussions](https://github.com/explosion/spaCy/discussions): **General + discussion**, **project ideas** and **usage questions**. Meet other community + members to get help with a specific code implementation, discuss ideas for new + projects/plugins, support more languages, and share best practices. - [GitHub issue tracker](https://github.com/explosion/spaCy/issues): **Bug reports** and **improvement suggestions**, i.e. everything that's likely spaCy's fault. This also includes problems with the trained pipelines beyond diff --git a/website/docs/usage/training.md b/website/docs/usage/training.md index 274ea5989..f8e502966 100644 --- a/website/docs/usage/training.md +++ b/website/docs/usage/training.md @@ -264,6 +264,26 @@ defined in the config file. $ SPACY_CONFIG_OVERRIDES="--system.gpu_allocator pytorch --training.batch_size 128" ./your_script.sh ``` +### Reading from standard input {#config-stdin} + +Setting the config path to `-` on the command line lets you read the config from +standard input and pipe it forward from a different process, like +[`init config`](/api/cli#init-config) or your own custom script. This is +especially useful for quick experiments, as it lets you generate a config on the +fly without having to save to and load from disk. + +> #### 💡 Tip: Writing to stdout +> +> When you run `init config`, you can set the output path to `-` to write to +> stdout. In a custom script, you can print the string config, e.g. +> `print(nlp.config.to_str())`. + +```cli +$ python -m spacy init config - --lang en --pipeline ner,textcat --optimize accuracy | python -m spacy train - --paths.train ./corpus/train.spacy --paths.dev ./corpus/dev.spacy +``` + + + ### Using variable interpolation {#config-interpolation} Another very useful feature of the config system is that it supports variable @@ -378,7 +398,8 @@ weights and [resume training](/api/language#resume_training). If you don't want a component to be updated, you can **freeze** it by adding it to the `frozen_components` list in the `[training]` block. Frozen components are **not updated** during training and are included in the final trained pipeline -as-is. They are also excluded when calling [`nlp.initialize`](/api/language#initialize). +as-is. They are also excluded when calling +[`nlp.initialize`](/api/language#initialize). > #### Note on frozen components > @@ -551,8 +572,8 @@ or TensorFlow, make **custom modifications** to the `nlp` object, create custom optimizers or schedules, or **stream in data** and preprocesses it on the fly while training. -Each custom function can have any number of arguments that are passed in via -the [config](#config), just the built-in functions. If your function defines +Each custom function can have any number of arguments that are passed in via the +[config](#config), just the built-in functions. If your function defines **default argument values**, spaCy is able to auto-fill your config when you run [`init fill-config`](/api/cli#init-fill-config). If you want to make sure that a given parameter is always explicitly set in the config, avoid setting a default @@ -560,10 +581,14 @@ value for it. ### Training with custom code {#custom-code} -> #### Example +> ```cli +> ### Training +> $ python -m spacy train config.cfg --code functions.py +> ``` > > ```cli -> $ python -m spacy train config.cfg --code functions.py +> ### Packaging +> $ python -m spacy package ./model-best ./packages --code functions.py > ``` The [`spacy train`](/api/cli#train) recipe lets you specify an optional argument @@ -571,7 +596,13 @@ The [`spacy train`](/api/cli#train) recipe lets you specify an optional argument allows you to add custom functions and architectures to the function registry that can then be referenced from your `config.cfg`. This lets you train spaCy pipelines with custom components, without having to re-implement the whole -training workflow. +training workflow. When you package your trained pipeline later using +[`spacy package`](/api/cli#package), you can provide one or more Python files to +be included in the package and imported in its `__init__.py`. This means that +any custom architectures, functions or +[components](/usage/processing-pipelines#custom-components) will be shipped with +your pipeline and registered when it's loaded. See the documentation on +[saving and loading pipelines](/usage/saving-loading#models-custom) for details. #### Example: Modifying the nlp object {#custom-code-nlp-callbacks} @@ -958,10 +989,10 @@ data assets, track changes and share your end-to-end processes with your team. The binary `.spacy` format is a serialized [`DocBin`](/api/docbin) containing -one or more [`Doc`](/api/doc) objects. It's extremely **efficient in -storage**, especially when packing multiple documents together. You can also -create `Doc` objects manually, so you can write your own custom logic to convert -and store existing annotations for use in spaCy. +one or more [`Doc`](/api/doc) objects. It's extremely **efficient in storage**, +especially when packing multiple documents together. You can also create `Doc` +objects manually, so you can write your own custom logic to convert and store +existing annotations for use in spaCy. ```python ### Training data from Doc objects {highlight="6-9"} @@ -969,7 +1000,7 @@ import spacy from spacy.tokens import Doc, DocBin nlp = spacy.blank("en") -docbin = DocBin(nlp.vocab) +docbin = DocBin() words = ["Apple", "is", "looking", "at", "buying", "U.K.", "startup", "."] spaces = [True, True, True, True, True, True, True, False] ents = ["B-ORG", "O", "O", "O", "O", "B-GPE", "O", "O"] @@ -1300,10 +1331,10 @@ mapping so they know which worker owns which parameter. As training proceeds, every worker will be computing gradients for **all** of the model parameters. When they compute gradients for parameters they don't own, they'll **send them to the worker** that does own that parameter, along with a -version identifier so that the owner can decide whether to discard the -gradient. Workers use the gradients they receive and the ones they compute -locally to update the parameters they own, and then broadcast the updated array -and a new version ID to the other workers. +version identifier so that the owner can decide whether to discard the gradient. +Workers use the gradients they receive and the ones they compute locally to +update the parameters they own, and then broadcast the updated array and a new +version ID to the other workers. This training procedure is **asynchronous** and **non-blocking**. Workers always push their gradient increments and parameter updates, they do not have to pull diff --git a/website/docs/usage/v3.md b/website/docs/usage/v3.md index fe4765285..47ddcf53a 100644 --- a/website/docs/usage/v3.md +++ b/website/docs/usage/v3.md @@ -433,14 +433,14 @@ The following methods, attributes and commands are new in spaCy v3.0. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | [`Token.lex`](/api/token#attributes) | Access a token's [`Lexeme`](/api/lexeme). | -| [`Token.morph`](/api/token#attributes), [`Token.morph_`](/api/token#attributes) | Access a token's morphological analysis. | +| [`Token.morph`](/api/token#attributes) | Access a token's morphological analysis. | | [`Doc.has_annotation`](/api/doc#has_annotation) | Check whether a doc has annotation on a token attribute. | | [`Language.select_pipes`](/api/language#select_pipes) | Context manager for enabling or disabling specific pipeline components for a block. | | [`Language.disable_pipe`](/api/language#disable_pipe), [`Language.enable_pipe`](/api/language#enable_pipe) | Disable or enable a loaded pipeline component (but don't remove it). | | [`Language.analyze_pipes`](/api/language#analyze_pipes) | [Analyze](/usage/processing-pipelines#analysis) components and their interdependencies. | | [`Language.resume_training`](/api/language#resume_training) | Experimental: continue training a trained pipeline and initialize "rehearsal" for components that implement a `rehearse` method to prevent catastrophic forgetting. | | [`@Language.factory`](/api/language#factory), [`@Language.component`](/api/language#component) | Decorators for [registering](/usage/processing-pipelines#custom-components) pipeline component factories and simple stateless component functions. | -| [`Language.has_factory`](/api/language#has_factory) | Check whether a component factory is registered on a language class. | +| [`Language.has_factory`](/api/language#has_factory) | Check whether a component factory is registered on a language class. | | [`Language.get_factory_meta`](/api/language#get_factory_meta), [`Language.get_pipe_meta`](/api/language#get_factory_meta) | Get the [`FactoryMeta`](/api/language#factorymeta) with component metadata for a factory or instance name. | | [`Language.config`](/api/language#config) | The [config](/usage/training#config) used to create the current `nlp` object. An instance of [`Config`](https://thinc.ai/docs/api-config#config) and can be saved to disk and used for training. | | [`Language.components`](/api/language#attributes), [`Language.component_names`](/api/language#attributes) | All available components and component names, including disabled components that are not run as part of the pipeline. | @@ -969,18 +969,18 @@ The [`Language.update`](/api/language#update), raw text and a dictionary of annotations. ```python -### Training loop {highlight="11"} +### Training loop {highlight="5-8,12"} TRAIN_DATA = [ ("Who is Shaka Khan?", {"entities": [(7, 17, "PERSON")]}), ("I like London.", {"entities": [(7, 13, "LOC")]}), ] -nlp.initialize() +examples = [] +for text, annots in TRAIN_DATA: + examples.append(Example.from_dict(nlp.make_doc(text), annots)) +nlp.initialize(lambda: examples) for i in range(20): - random.shuffle(TRAIN_DATA) - for batch in minibatch(TRAIN_DATA): - examples = [] - for text, annots in batch: - examples.append(Example.from_dict(nlp.make_doc(text), annots)) + random.shuffle(examples) + for batch in minibatch(examples, size=8): nlp.update(examples) ``` @@ -995,7 +995,7 @@ network, setting up the label scheme. ```diff -- nlp.initialize(examples) +- nlp.begin_training() + nlp.initialize(lambda: examples) ``` @@ -1032,9 +1032,9 @@ change your names and imports: Thanks to everyone who's been contributing to the spaCy ecosystem by developing and maintaining one of the many awesome [plugins and extensions](/universe). We've tried to make it as easy as possible for you to upgrade your packages for -spaCy v3.0. The most common use case for plugins is providing pipeline components -and extension attributes. When migrating your plugin, double-check the -following: +spaCy v3.0. The most common use case for plugins is providing pipeline +components and extension attributes. When migrating your plugin, double-check +the following: - Use the [`@Language.factory`](/api/language#factory) decorator to register your component and assign it a name. This allows users to refer to your diff --git a/website/meta/languages.json b/website/meta/languages.json index 9f69907cf..bdef8ceac 100644 --- a/website/meta/languages.json +++ b/website/meta/languages.json @@ -199,6 +199,36 @@ "name": "Vietnamese", "dependencies": [{ "name": "Pyvi", "url": "https://github.com/trungtv/pyvi" }] }, + { + "code": "lij", + "name": "Ligurian", + "example": "Sta chì a l'é unna fraxe.", + "has_examples": true + }, + { + "code": "hy", + "name": "Armenian", + "has_examples": true + }, + { + "code": "gu", + "name": "Gujarati", + "has_examples": true + }, + { + "code": "ml", + "name": "Malayalam", + "has_examples": true + }, + { + "code": "ne", + "name": "Nepali", + "has_examples": true + }, + { + "code": "mk", + "name": "Macedonian" + }, { "code": "xx", "name": "Multi-language", diff --git a/website/meta/site.json b/website/meta/site.json index 1a96ca660..fcff96b56 100644 --- a/website/meta/site.json +++ b/website/meta/site.json @@ -56,6 +56,10 @@ "label": "Community", "items": [ { "text": "Universe", "url": "/universe" }, + { + "text": "GitHub Discussions", + "url": "https://github.com/explosion/spaCy/discussions" + }, { "text": "Issue Tracker", "url": "https://github.com/explosion/spaCy/issues" }, { "text": "Stack Overflow", diff --git a/website/meta/universe.json b/website/meta/universe.json index ffad74180..29df8b4a3 100644 --- a/website/meta/universe.json +++ b/website/meta/universe.json @@ -1,5 +1,36 @@ { "resources": [ + { + "id": "spacy-textblob", + "title": "spaCyTextBlob", + "slogan": "Easy sentiment analysis for spaCy using TextBlob", + "description": "spaCyTextBlob is a pipeline component that enables sentiment analysis using the [TextBlob](https://github.com/sloria/TextBlob) library. It will add the additional extenstion `._.sentiment` to `Doc`, `Span`, and `Token` objects.", + "github": "SamEdwardes/spaCyTextBlob", + "pip": "spacytextblob", + "code_example": [ + "import spacy", + "from spacytextblob.spacytextblob import SpacyTextBlob", + "", + "nlp = spacy.load('en_core_web_sm')", + "spacy_text_blob = SpacyTextBlob()", + "nlp.add_pipe(spacy_text_blob)", + "text = 'I had a really horrible day. It was the worst day ever! But every now and then I have a really good day that makes me happy.'", + "doc = nlp(text)", + "doc._.sentiment.polarity # Polarity: -0.125", + "doc._.sentiment.subjectivity # Sujectivity: 0.9", + "doc._.sentiment.assessments # Assessments: [(['really', 'horrible'], -1.0, 1.0, None), (['worst', '!'], -1.0, 1.0, None), (['really', 'good'], 0.7, 0.6000000000000001, None), (['happy'], 0.8, 1.0, None)]" + ], + "code_language": "python", + "url": "https://spacytextblob.netlify.app/", + "author": "Sam Edwardes", + "author_links": { + "twitter": "TheReaLSamlam", + "github": "SamEdwardes", + "website": "https://samedwardes.com" + }, + "category": ["pipeline"], + "tags": ["sentiment", "textblob"] + }, { "id": "spacy-ray", "title": "spacy-ray", @@ -788,6 +819,22 @@ "category": ["conversational"], "tags": ["chatbots"] }, + { + "id": "mindmeld", + "title": "MindMeld - Conversational AI platform", + "slogan": "Conversational AI platform for deep-domain voice interfaces and chatbots", + "description": "The MindMeld Conversational AI platform is among the most advanced AI platforms for building production-quality conversational applications. It is a Python-based machine learning framework which encompasses all of the algorithms and utilities required for this purpose. (https://github.com/cisco/mindmeld)", + "github": "cisco/mindmeld", + "pip": "mindmeld", + "thumb": "https://www.mindmeld.com/img/mindmeld-logo.png", + "category": ["conversational", "ner"], + "tags": ["chatbots"], + "author": "Cisco", + "author_links": { + "github": "cisco/mindmeld", + "website": "https://www.mindmeld.com/" + } + }, { "id": "torchtext", "title": "torchtext", @@ -1648,7 +1695,7 @@ "", "nlp = spacy.load('en')", "nlp.add_pipe(BeneparComponent('benepar_en'))", - "doc = nlp('The time for action is now. It's never too late to do something.')", + "doc = nlp('The time for action is now. It is never too late to do something.')", "sent = list(doc.sents)[0]", "print(sent._.parse_string)", "# (S (NP (NP (DT The) (NN time)) (PP (IN for) (NP (NN action)))) (VP (VBZ is) (ADVP (RB now))) (. .))", @@ -2527,14 +2574,14 @@ "description": "A spaCy rule-based pipeline for identifying positive cases of COVID-19 from clinical text. A version of this system was deployed as part of the US Department of Veterans Affairs biosurveillance response to COVID-19.", "pip": "cov-bsv", "code_example": [ - "import cov_bsv", - "", - "nlp = cov_bsv.load()", - "text = 'Pt tested for COVID-19. His wife was recently diagnosed with novel coronavirus. SARS-COV-2: Detected'", - "", - "print(doc.ents)", - "print(doc._.cov_classification)", - "cov_bsv.visualize_doc(doc)" + "import cov_bsv", + "", + "nlp = cov_bsv.load()", + "doc = nlp('Pt tested for COVID-19. His wife was recently diagnosed with novel coronavirus. SARS-COV-2: Detected')", + "", + "print(doc.ents)", + "print(doc._.cov_classification)", + "cov_bsv.visualize_doc(doc)" ], "category": ["pipeline", "standalone", "biomedical", "scientific"], "tags": ["clinical", "epidemiology", "covid-19", "surveillance"], @@ -2542,6 +2589,35 @@ "author_links": { "github": "abchapman93" } + }, + { + "id": "medspacy", + "title": "medspaCy", + "thumb": "https://raw.githubusercontent.com/medspacy/medspacy/master/images/medspacy_logo.png", + "slogan": "A toolkit for clinical NLP with spaCy.", + "github": "medspacy/medspacy", + "description": "A toolkit for clinical NLP with spaCy. Features include sentence splitting, section detection, and asserting negation, family history, and uncertainty.", + "pip": "medspacy", + "code_example": [ + "import medspacy", + "from medspacy.ner import TargetRule", + "", + "nlp = medspacy.load()", + "print(nlp.pipe_names)", + "", + "nlp.get_pipe('target_matcher').add([TargetRule('stroke', 'CONDITION'), TargetRule('diabetes', 'CONDITION'), TargetRule('pna', 'CONDITION')])", + "doc = nlp('Patient has hx of stroke. Mother diagnosed with diabetes. No evidence of pna.')", + "", + "for ent in doc.ents:", + " print(ent, ent._.is_negated, ent._.is_family, ent._.is_historical)", + "medspacy.visualization.visualize_ent(doc)" + ], + "category": ["biomedical", "scientific", "research"], + "tags": ["clinical"], + "author": "medspacy", + "author_links": { + "github": "medspacy" + } }, { "id": "rita-dsl", @@ -2578,6 +2654,32 @@ "author_links": { "github": "zaibacu" } + }, + { + "id": "PatternOmatic", + "title": "PatternOmatic", + "slogan": "Finds linguistic patterns effortlessly", + "description": "Discover spaCy's linguistic patterns matching a given set of String samples to be used by the spaCy's Rule Based Matcher", + "github": "revuel/PatternOmatic", + "pip": "PatternOmatic", + "code_example": [ + "from PatternOmatic.api import find_patterns", + "", + "samples = ['I am a cat!', 'You are a dog!', 'She is an owl!']", + "", + "patterns_found, _ = find_patterns(samples)", + "", + "print(f'Patterns found: {patterns_found}')" + ], + "code_language": "python", + "thumb": "https://svgshare.com/i/R3P.svg", + "image": "https://svgshare.com/i/R3P.svg", + "author": "Miguel Revuelta Espinosa", + "author_links": { + "github": "revuel" + }, + "category": ["scientific", "research", "standalone"], + "tags": ["Evolutionary Computation", "Grammatical Evolution"] } ], diff --git a/website/src/components/code.js b/website/src/components/code.js index fad1d2b7f..336c7dc80 100644 --- a/website/src/components/code.js +++ b/website/src/components/code.js @@ -120,52 +120,65 @@ function parseArgs(raw) { return result } +function convertLine(line, i) { + console.log(line, i) + const cliRegex = /^(\$ )?python -m spacy/ + if (cliRegex.test(line)) { + const text = line.replace(cliRegex, '') + const args = parseArgs(text) + const cmd = Object.keys(args).map((key, i) => { + const value = args[key] + return value === null || value === true || i === 0 ? key : `${key} ${value}` + }) + return ( + + + python -m + {' '} + spacy{' '} + {cmd.map((item, j) => { + const isCmd = j === 0 + const url = isCmd ? `/api/cli#${item.replace(' ', '-')}` : null + const isAbstract = isString(item) && /^\[(.+)\]$/.test(item) + const itemClassNames = classNames(classes.cliArg, { + [classes.cliArgHighlight]: isCmd, + [classes.cliArgEmphasis]: isAbstract, + }) + const text = isAbstract ? item.slice(1, -1) : item + return ( + + {j !== 0 && ' '} + + + + + ) + })} + + ) + } + const htmlLine = replacePrompt(highlightCode('bash', line), '$') + return htmlToReact(htmlLine) +} + function formatCode(html, lang, prompt) { if (lang === 'cli') { - const cliRegex = /^(\$ )?python -m spacy/ const lines = html .trim() .split('\n') - .map((line, i) => { - if (cliRegex.test(line)) { - const text = line.replace(cliRegex, '') - const args = parseArgs(text) - const cmd = Object.keys(args).map((key, i) => { - const value = args[key] - return value === null || value === true || i === 0 ? key : `${key} ${value}` - }) - return ( - - - python -m - {' '} - spacy{' '} - {cmd.map((item, j) => { - const isCmd = j === 0 - const url = isCmd ? `/api/cli#${item.replace(' ', '-')}` : null - const isAbstract = isString(item) && /^\[(.+)\]$/.test(item) - const itemClassNames = classNames(classes.cliArg, { - [classes.cliArgHighlight]: isCmd, - [classes.cliArgEmphasis]: isAbstract, - }) - const text = isAbstract ? item.slice(1, -1) : item - return ( - - {j !== 0 && ' '} - - - - - ) - })} + .map(line => + line + .split(' | ') + .map((l, i) => convertLine(l, i)) + .map((l, j) => ( + + {j !== 0 && | } + {l} - ) - } - const htmlLine = replacePrompt(highlightCode('bash', line), '$') - return htmlToReact(htmlLine) - }) + )) + ) return lines.map((line, i) => ( {i !== 0 &&
} diff --git a/website/src/templates/models.js b/website/src/templates/models.js index 17140b072..b9658dacd 100644 --- a/website/src/templates/models.js +++ b/website/src/templates/models.js @@ -120,7 +120,7 @@ function formatAccuracy(data) { ? null : { label, - value: (value * 100).toFixed(2), + value: value.toFixed(2), help: MODEL_META[label], } }) diff --git a/website/src/widgets/landing.js b/website/src/widgets/landing.js index 2cee9460f..cf5768758 100644 --- a/website/src/widgets/landing.js +++ b/website/src/widgets/landing.js @@ -207,42 +207,49 @@ const Landing = ({ data }) => { - + spaCy v3.0 features all new transformer-based pipelines that + bring spaCy's accuracy right up to the current state-of-the-art + . You can use any pretrained transformer to train your own pipelines, and even + share one transformer between multiple components with{' '} + multi-task learning. Training is now fully configurable and + extensible, and you can define your own custom models using{' '} + PyTorch, TensorFlow and other frameworks. The + new spaCy projects system lets you describe whole{' '} + end-to-end workflows in a single file, giving you an easy path + from prototype to production, and making it easy to clone and adapt + best-practice projects for your own use cases. + + + + Advanced NLP with spaCy: A free online course

- In this free and interactive online course you’ll learn how to - use spaCy to build advanced natural language understanding systems, using both - rule-based and machine learning approaches. It includes{' '} - 55 exercises featuring videos, slide decks, multiple-choice - questions and interactive coding practice in the browser. -
- - We were pleased to invite the spaCy community and other folks working on NLP to - Berlin for a small and intimate event. We booked a beautiful venue, hand-picked - an awesome lineup of speakers and scheduled plenty of social time to get to know - each other. The YouTube playlist includes 12 talks about NLP research, - development and applications, with keynotes by Sebastian Ruder (DeepMind) and - Yoav Goldberg (Allen AI). + Prodigy is an annotation tool so efficient that data scientists + can do the annotation themselves, enabling a new level of rapid iteration. + Whether you're working on entity recognition, intent detection or image + classification, Prodigy can help you train and evaluate your + models faster.
diff --git a/website/src/widgets/quickstart-install.js b/website/src/widgets/quickstart-install.js index 37ae10da4..6bb14b687 100644 --- a/website/src/widgets/quickstart-install.js +++ b/website/src/widgets/quickstart-install.js @@ -7,7 +7,7 @@ import { repo } from '../components/util' const DEFAULT_MODELS = ['en'] const DEFAULT_OPT = 'efficiency' const DEFAULT_HARDWARE = 'cpu' -const DEFAULT_CUDA = 'cuda100' +const DEFAULT_CUDA = 'cuda102' const CUDA = { '8.0': 'cuda80', '9.0': 'cuda90', @@ -16,56 +16,9 @@ const CUDA = { '10.0': 'cuda100', '10.1': 'cuda101', '10.2': 'cuda102', + '11.0': 'cuda110', } -const LANG_EXTRAS = ['zh', 'ja'] // only for languages with models -const DATA = [ - { - id: 'os', - title: 'Operating system', - options: [ - { id: 'mac', title: 'macOS / OSX', checked: true }, - { id: 'windows', title: 'Windows' }, - { id: 'linux', title: 'Linux' }, - ], - }, - { - id: 'package', - title: 'Package manager', - options: [ - { id: 'pip', title: 'pip', checked: true }, - { id: 'conda', title: 'conda' }, - { id: 'source', title: 'from source' }, - ], - }, - { - id: 'hardware', - title: 'Hardware', - options: [ - { id: 'cpu', title: 'CPU', checked: DEFAULT_HARDWARE === 'cpu' }, - { id: 'gpu', title: 'GPU', checked: DEFAULT_HARDWARE == 'gpu' }, - ], - dropdown: Object.keys(CUDA).map(id => ({ id: CUDA[id], title: `CUDA ${id}` })), - defaultValue: DEFAULT_CUDA, - }, - { - id: 'config', - title: 'Configuration', - multiple: true, - options: [ - { - id: 'venv', - title: 'virtual env', - help: 'Use a virtual environment and install spaCy into a user directory', - }, - { - id: 'train', - title: 'train models', - help: - 'Check this if you plan to train your own models with spaCy to install extra dependencies and data resources', - }, - ], - }, -] +const LANG_EXTRAS = ['ja'] // only for languages with models const QuickstartInstall = ({ id, title }) => { const [train, setTrain] = useState(false) @@ -99,7 +52,56 @@ const QuickstartInstall = ({ id, title }) => { const pkg = nightly ? 'spacy-nightly' : 'spacy' const models = languages.filter(({ models }) => models !== null) const data = [ - ...DATA, + { + id: 'os', + title: 'Operating system', + options: [ + { id: 'mac', title: 'macOS / OSX', checked: true }, + { id: 'windows', title: 'Windows' }, + { id: 'linux', title: 'Linux' }, + ], + }, + { + id: 'package', + title: 'Package manager', + options: [ + { id: 'pip', title: 'pip', checked: true }, + !nightly ? { id: 'conda', title: 'conda' } : null, + { id: 'source', title: 'from source' }, + ].filter(o => o), + }, + { + id: 'hardware', + title: 'Hardware', + options: [ + { id: 'cpu', title: 'CPU', checked: DEFAULT_HARDWARE === 'cpu' }, + { id: 'gpu', title: 'GPU', checked: DEFAULT_HARDWARE == 'gpu' }, + ], + dropdown: Object.keys(CUDA).map(id => ({ + id: CUDA[id], + title: `CUDA ${id}`, + })), + defaultValue: DEFAULT_CUDA, + }, + { + id: 'config', + title: 'Configuration', + multiple: true, + options: [ + { + id: 'venv', + title: 'virtual env', + help: + 'Use a virtual environment and install spaCy into a user directory', + }, + { + id: 'train', + title: 'train models', + help: + 'Check this if you plan to train your own models with spaCy to install extra dependencies and data resources', + }, + ], + }, { id: 'models', title: 'Trained pipelines', @@ -141,11 +143,6 @@ const QuickstartInstall = ({ id, title }) => { setters={setters} showDropdown={showDropdown} > - {nightly && ( - - # 🚨 Nightly releases are currently only available via pip - - )} python -m venv .env source .env/bin/activate @@ -180,15 +177,17 @@ const QuickstartInstall = ({ id, title }) => { pip install -r requirements.txt python setup.py build_ext --inplace - {(train || hardware == 'gpu') && ( - pip install -e '.[{pipExtras}]' - )} - - - conda install -c conda-forge spacy-transformers + + pip install {train || hardware == 'gpu' ? `'.[${pipExtras}]'` : '.'} + + + # packages only available via pip - conda install -c conda-forge spacy-lookups-data + pip install spacy-transformers + + + pip install spacy-lookups-data {models.map(({ code, models: modelOptions }) => {