Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Pypi

Declensor library

Using dclua.py library you can train declension models and declense words. This will just replace suffix of the word to correspond new morphological properties you want the word to have. Here's some topics that will help you understand how it works.

Morphological vector

Morphological vector is a vector which determines morphology properties for the lexeme. Number on each coordinate determine some property. You can use your vectors for your language, but here's the structure, which is suggested to use for Ukrainian.

Noun vectors

Noun vectors has 2 coordinates: [number][case]. Here's the table, what means each value.

CoordinateNumberCase
0Nominative
1SingularGenitive
2PluralDative
3Accusative
4Instrumental
5Locative
6Vocative

Infinitive suffix placed at [0][0].

Verbs vectors

Noun vectors has 4 coordinates: [tense][person][number][gender].

CoordinateTensePersonNumberGender
0FirstSingularMasculine
1PresentSecondPluralFeminine
2FutureThirdNeutral
3Past

Infinitive suffix placed at [0][0][0][0].

Adjective vectors

Noun vectors has 3 coordinates: [gender][number][person].

CoordinateGenderNumberPerson
0SingularFirst
1MasculinePluralSecond
2FeminineThird
3Neutral

Infinitive suffix placed at [0][0][0].

Declension rule

Declension rule is a multidimensional array which contains declensed suffixes, which is indexed using morphology vectors. You can create such model for your word in this way:

rule=dclua.DeclenseTrainer.analyze({
(0,0): 'усмішка',
(1,0): 'усмішка',
(1,1): 'усмішки',
(1,2): 'усмішці',
#...
(2,6): 'усмішки'
});

Now the rule will look like this:

rule[0][0] =='ка'rule[1][0] =='ка'rule[1][1] =='ки'rule[1][2] =='ці'#...rule[2][6] =='ки'

Every word has its suffix, so you need to create rule for each of them in order to use in the future.

analyze method also accept minsize argument, which determine size of the minimal producing suffix.

Word declension

Once you have model (bundle of rules) for different suffixes, you can use them to declense words. The syntax is following:

Declensor.declense(str word, tuple newmporph, tuple morphology=None)

Suppose, you have model variable, which contains models for all suffixes we want. Then you can declense words in the following way:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1))
<<<'сонця'

The morphology vector of given word will be recognized automatically, so it may take some time to found appropriate declension model in models. If you already know the morphology of the word you want to declense, assign it to the morphology argument:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1), morphology=(1,2))
<<<'сонця'

Train your model

In order to train your model you can use template from template.py in this directory.

Generalizing model

Sometimes suffix in a model can appear in slight variations. For example, aab, aac: only the last letter is different. You can set up groups of letters, which can differ in such cases, and generalize your model according to this groups. Example of using:

>>>dclua.DeclenseTrainer.generalizeModel(
... model= [
... [["она"], ["они"], ["онів"]],
... [["ова"], ["ови"], ["овів"]],
... ],
... groups= [
... ["н", "в", "п", "м"]
... ],
... threshold=.3
... )
...
<<< [
... [
... [['она'], ['они'], ['онів']],
... [['ова'], ['ови'], ['овів']],
... [['опа'], ['опи'], ['опів']],
... [['ома'], ['оми'], ['омів']]
... ]
... ]

Threshold parameter is a ratio between amount of rules, which can be generalized to some group and size of that group. It's equal to .3 by default, so if there are less then .3 * size_of_group rules, they won't be generalized.

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Pypi

Declensor library

Using dclua.py library you can train declension models and declense words. This will just replace suffix of the word to correspond new morphological properties you want the word to have. Here's some topics that will help you understand how it works.

Morphological vector

Morphological vector is a vector which determines morphology properties for the lexeme. Number on each coordinate determine some property. You can use your vectors for your language, but here's the structure, which is suggested to use for Ukrainian.

Noun vectors

Noun vectors has 2 coordinates: [number][case]. Here's the table, what means each value.

CoordinateNumberCase
0Nominative
1SingularGenitive
2PluralDative
3Accusative
4Instrumental
5Locative
6Vocative

Infinitive suffix placed at [0][0].

Verbs vectors

Noun vectors has 4 coordinates: [tense][person][number][gender].

CoordinateTensePersonNumberGender
0FirstSingularMasculine
1PresentSecondPluralFeminine
2FutureThirdNeutral
3Past

Infinitive suffix placed at [0][0][0][0].

Adjective vectors

Noun vectors has 3 coordinates: [gender][number][person].

CoordinateGenderNumberPerson
0SingularFirst
1MasculinePluralSecond
2FeminineThird
3Neutral

Infinitive suffix placed at [0][0][0].

Declension rule

Declension rule is a multidimensional array which contains declensed suffixes, which is indexed using morphology vectors. You can create such model for your word in this way:

rule=dclua.DeclenseTrainer.analyze({
(0,0): 'усмішка',
(1,0): 'усмішка',
(1,1): 'усмішки',
(1,2): 'усмішці',
#...
(2,6): 'усмішки'
});

Now the rule will look like this:

rule[0][0] =='ка'rule[1][0] =='ка'rule[1][1] =='ки'rule[1][2] =='ці'#...rule[2][6] =='ки'

Every word has its suffix, so you need to create rule for each of them in order to use in the future.

analyze method also accept minsize argument, which determine size of the minimal producing suffix.

Word declension

Once you have model (bundle of rules) for different suffixes, you can use them to declense words. The syntax is following:

Declensor.declense(str word, tuple newmporph, tuple morphology=None)

Suppose, you have model variable, which contains models for all suffixes we want. Then you can declense words in the following way:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1))
<<<'сонця'

The morphology vector of given word will be recognized automatically, so it may take some time to found appropriate declension model in models. If you already know the morphology of the word you want to declense, assign it to the morphology argument:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1), morphology=(1,2))
<<<'сонця'

Train your model

In order to train your model you can use template from template.py in this directory.

Generalizing model

Sometimes suffix in a model can appear in slight variations. For example, aab, aac: only the last letter is different. You can set up groups of letters, which can differ in such cases, and generalize your model according to this groups. Example of using:

>>>dclua.DeclenseTrainer.generalizeModel(
... model= [
... [["она"], ["они"], ["онів"]],
... [["ова"], ["ови"], ["овів"]],
... ],
... groups= [
... ["н", "в", "п", "м"]
... ],
... threshold=.3
... )
...
<<< [
... [
... [['она'], ['они'], ['онів']],
... [['ова'], ['ови'], ['овів']],
... [['опа'], ['опи'], ['опів']],
... [['ома'], ['оми'], ['омів']]
... ]
... ]

Threshold parameter is a ratio between amount of rules, which can be generalized to some group and size of that group. It's equal to .3 by default, so if there are less then .3 * size_of_group rules, they won't be generalized.

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Pypi

Declensor library

Using dclua.py library you can train declension models and declense words. This will just replace suffix of the word to correspond new morphological properties you want the word to have. Here's some topics that will help you understand how it works.

Morphological vector

Morphological vector is a vector which determines morphology properties for the lexeme. Number on each coordinate determine some property. You can use your vectors for your language, but here's the structure, which is suggested to use for Ukrainian.

Noun vectors

Noun vectors has 2 coordinates: [number][case]. Here's the table, what means each value.

CoordinateNumberCase
0Nominative
1SingularGenitive
2PluralDative
3Accusative
4Instrumental
5Locative
6Vocative

Infinitive suffix placed at [0][0].

Verbs vectors

Noun vectors has 4 coordinates: [tense][person][number][gender].

CoordinateTensePersonNumberGender
0FirstSingularMasculine
1PresentSecondPluralFeminine
2FutureThirdNeutral
3Past

Infinitive suffix placed at [0][0][0][0].

Adjective vectors

Noun vectors has 3 coordinates: [gender][number][person].

CoordinateGenderNumberPerson
0SingularFirst
1MasculinePluralSecond
2FeminineThird
3Neutral

Infinitive suffix placed at [0][0][0].

Declension rule

Declension rule is a multidimensional array which contains declensed suffixes, which is indexed using morphology vectors. You can create such model for your word in this way:

rule=dclua.DeclenseTrainer.analyze({
(0,0): 'усмішка',
(1,0): 'усмішка',
(1,1): 'усмішки',
(1,2): 'усмішці',
#...
(2,6): 'усмішки'
});

Now the rule will look like this:

rule[0][0] =='ка'rule[1][0] =='ка'rule[1][1] =='ки'rule[1][2] =='ці'#...rule[2][6] =='ки'

Every word has its suffix, so you need to create rule for each of them in order to use in the future.

analyze method also accept minsize argument, which determine size of the minimal producing suffix.

Word declension

Once you have model (bundle of rules) for different suffixes, you can use them to declense words. The syntax is following:

Declensor.declense(str word, tuple newmporph, tuple morphology=None)

Suppose, you have model variable, which contains models for all suffixes we want. Then you can declense words in the following way:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1))
<<<'сонця'

The morphology vector of given word will be recognized automatically, so it may take some time to found appropriate declension model in models. If you already know the morphology of the word you want to declense, assign it to the morphology argument:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1), morphology=(1,2))
<<<'сонця'

Train your model

In order to train your model you can use template from template.py in this directory.

Generalizing model

Sometimes suffix in a model can appear in slight variations. For example, aab, aac: only the last letter is different. You can set up groups of letters, which can differ in such cases, and generalize your model according to this groups. Example of using:

>>>dclua.DeclenseTrainer.generalizeModel(
... model= [
... [["она"], ["они"], ["онів"]],
... [["ова"], ["ови"], ["овів"]],
... ],
... groups= [
... ["н", "в", "п", "м"]
... ],
... threshold=.3
... )
...
<<< [
... [
... [['она'], ['они'], ['онів']],
... [['ова'], ['ови'], ['овів']],
... [['опа'], ['опи'], ['опів']],
... [['ома'], ['оми'], ['омів']]
... ]
... ]

Threshold parameter is a ratio between amount of rules, which can be generalized to some group and size of that group. It's equal to .3 by default, so if there are less then .3 * size_of_group rules, they won't be generalized.

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Pypi

Declensor library

Using dclua.py library you can train declension models and declense words. This will just replace suffix of the word to correspond new morphological properties you want the word to have. Here's some topics that will help you understand how it works.

Morphological vector

Morphological vector is a vector which determines morphology properties for the lexeme. Number on each coordinate determine some property. You can use your vectors for your language, but here's the structure, which is suggested to use for Ukrainian.

Noun vectors

Noun vectors has 2 coordinates: [number][case]. Here's the table, what means each value.

CoordinateNumberCase
0Nominative
1SingularGenitive
2PluralDative
3Accusative
4Instrumental
5Locative
6Vocative

Infinitive suffix placed at [0][0].

Verbs vectors

Noun vectors has 4 coordinates: [tense][person][number][gender].

CoordinateTensePersonNumberGender
0FirstSingularMasculine
1PresentSecondPluralFeminine
2FutureThirdNeutral
3Past

Infinitive suffix placed at [0][0][0][0].

Adjective vectors

Noun vectors has 3 coordinates: [gender][number][person].

CoordinateGenderNumberPerson
0SingularFirst
1MasculinePluralSecond
2FeminineThird
3Neutral

Infinitive suffix placed at [0][0][0].

Declension rule

Declension rule is a multidimensional array which contains declensed suffixes, which is indexed using morphology vectors. You can create such model for your word in this way:

rule=dclua.DeclenseTrainer.analyze({
(0,0): 'усмішка',
(1,0): 'усмішка',
(1,1): 'усмішки',
(1,2): 'усмішці',
#...
(2,6): 'усмішки'
});

Now the rule will look like this:

rule[0][0] =='ка'rule[1][0] =='ка'rule[1][1] =='ки'rule[1][2] =='ці'#...rule[2][6] =='ки'

Every word has its suffix, so you need to create rule for each of them in order to use in the future.

analyze method also accept minsize argument, which determine size of the minimal producing suffix.

Word declension

Once you have model (bundle of rules) for different suffixes, you can use them to declense words. The syntax is following:

Declensor.declense(str word, tuple newmporph, tuple morphology=None)

Suppose, you have model variable, which contains models for all suffixes we want. Then you can declense words in the following way:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1))
<<<'сонця'

The morphology vector of given word will be recognized automatically, so it may take some time to found appropriate declension model in models. If you already know the morphology of the word you want to declense, assign it to the morphology argument:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1), morphology=(1,2))
<<<'сонця'

Train your model

In order to train your model you can use template from template.py in this directory.

Generalizing model

Sometimes suffix in a model can appear in slight variations. For example, aab, aac: only the last letter is different. You can set up groups of letters, which can differ in such cases, and generalize your model according to this groups. Example of using:

>>>dclua.DeclenseTrainer.generalizeModel(
... model= [
... [["она"], ["они"], ["онів"]],
... [["ова"], ["ови"], ["овів"]],
... ],
... groups= [
... ["н", "в", "п", "м"]
... ],
... threshold=.3
... )
...
<<< [
... [
... [['она'], ['они'], ['онів']],
... [['ова'], ['ови'], ['овів']],
... [['опа'], ['опи'], ['опів']],
... [['ома'], ['оми'], ['омів']]
... ]
... ]

Threshold parameter is a ratio between amount of rules, which can be generalized to some group and size of that group. It's equal to .3 by default, so if there are less then .3 * size_of_group rules, they won't be generalized.

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Pypi

Declensor library

Using dclua.py library you can train declension models and declense words. This will just replace suffix of the word to correspond new morphological properties you want the word to have. Here's some topics that will help you understand how it works.

Morphological vector

Morphological vector is a vector which determines morphology properties for the lexeme. Number on each coordinate determine some property. You can use your vectors for your language, but here's the structure, which is suggested to use for Ukrainian.

Noun vectors

Noun vectors has 2 coordinates: [number][case]. Here's the table, what means each value.

CoordinateNumberCase
0Nominative
1SingularGenitive
2PluralDative
3Accusative
4Instrumental
5Locative
6Vocative

Infinitive suffix placed at [0][0].

Verbs vectors

Noun vectors has 4 coordinates: [tense][person][number][gender].

CoordinateTensePersonNumberGender
0FirstSingularMasculine
1PresentSecondPluralFeminine
2FutureThirdNeutral
3Past

Infinitive suffix placed at [0][0][0][0].

Adjective vectors

Noun vectors has 3 coordinates: [gender][number][person].

CoordinateGenderNumberPerson
0SingularFirst
1MasculinePluralSecond
2FeminineThird
3Neutral

Infinitive suffix placed at [0][0][0].

Declension rule

Declension rule is a multidimensional array which contains declensed suffixes, which is indexed using morphology vectors. You can create such model for your word in this way:

rule=dclua.DeclenseTrainer.analyze({
(0,0): 'усмішка',
(1,0): 'усмішка',
(1,1): 'усмішки',
(1,2): 'усмішці',
#...
(2,6): 'усмішки'
});

Now the rule will look like this:

rule[0][0] =='ка'rule[1][0] =='ка'rule[1][1] =='ки'rule[1][2] =='ці'#...rule[2][6] =='ки'

Every word has its suffix, so you need to create rule for each of them in order to use in the future.

analyze method also accept minsize argument, which determine size of the minimal producing suffix.

Word declension

Once you have model (bundle of rules) for different suffixes, you can use them to declense words. The syntax is following:

Declensor.declense(str word, tuple newmporph, tuple morphology=None)

Suppose, you have model variable, which contains models for all suffixes we want. Then you can declense words in the following way:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1))
<<<'сонця'

The morphology vector of given word will be recognized automatically, so it may take some time to found appropriate declension model in models. If you already know the morphology of the word you want to declense, assign it to the morphology argument:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1), morphology=(1,2))
<<<'сонця'

Train your model

In order to train your model you can use template from template.py in this directory.

Generalizing model

Sometimes suffix in a model can appear in slight variations. For example, aab, aac: only the last letter is different. You can set up groups of letters, which can differ in such cases, and generalize your model according to this groups. Example of using:

>>>dclua.DeclenseTrainer.generalizeModel(
... model= [
... [["она"], ["они"], ["онів"]],
... [["ова"], ["ови"], ["овів"]],
... ],
... groups= [
... ["н", "в", "п", "м"]
... ],
... threshold=.3
... )
...
<<< [
... [
... [['она'], ['они'], ['онів']],
... [['ова'], ['ови'], ['овів']],
... [['опа'], ['опи'], ['опів']],
... [['ома'], ['оми'], ['омів']]
... ]
... ]

Threshold parameter is a ratio between amount of rules, which can be generalized to some group and size of that group. It's equal to .3 by default, so if there are less then .3 * size_of_group rules, they won't be generalized.

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Pypi

Declensor library

Using dclua.py library you can train declension models and declense words. This will just replace suffix of the word to correspond new morphological properties you want the word to have. Here's some topics that will help you understand how it works.

Morphological vector

Morphological vector is a vector which determines morphology properties for the lexeme. Number on each coordinate determine some property. You can use your vectors for your language, but here's the structure, which is suggested to use for Ukrainian.

Noun vectors

Noun vectors has 2 coordinates: [number][case]. Here's the table, what means each value.

CoordinateNumberCase
0Nominative
1SingularGenitive
2PluralDative
3Accusative
4Instrumental
5Locative
6Vocative

Infinitive suffix placed at [0][0].

Verbs vectors

Noun vectors has 4 coordinates: [tense][person][number][gender].

CoordinateTensePersonNumberGender
0FirstSingularMasculine
1PresentSecondPluralFeminine
2FutureThirdNeutral
3Past

Infinitive suffix placed at [0][0][0][0].

Adjective vectors

Noun vectors has 3 coordinates: [gender][number][person].

CoordinateGenderNumberPerson
0SingularFirst
1MasculinePluralSecond
2FeminineThird
3Neutral

Infinitive suffix placed at [0][0][0].

Declension rule

Declension rule is a multidimensional array which contains declensed suffixes, which is indexed using morphology vectors. You can create such model for your word in this way:

rule=dclua.DeclenseTrainer.analyze({
(0,0): 'усмішка',
(1,0): 'усмішка',
(1,1): 'усмішки',
(1,2): 'усмішці',
#...
(2,6): 'усмішки'
});

Now the rule will look like this:

rule[0][0] =='ка'rule[1][0] =='ка'rule[1][1] =='ки'rule[1][2] =='ці'#...rule[2][6] =='ки'

Every word has its suffix, so you need to create rule for each of them in order to use in the future.

analyze method also accept minsize argument, which determine size of the minimal producing suffix.

Word declension

Once you have model (bundle of rules) for different suffixes, you can use them to declense words. The syntax is following:

Declensor.declense(str word, tuple newmporph, tuple morphology=None)

Suppose, you have model variable, which contains models for all suffixes we want. Then you can declense words in the following way:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1))
<<<'сонця'

The morphology vector of given word will be recognized automatically, so it may take some time to found appropriate declension model in models. If you already know the morphology of the word you want to declense, assign it to the morphology argument:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1), morphology=(1,2))
<<<'сонця'

Train your model

In order to train your model you can use template from template.py in this directory.

Generalizing model

Sometimes suffix in a model can appear in slight variations. For example, aab, aac: only the last letter is different. You can set up groups of letters, which can differ in such cases, and generalize your model according to this groups. Example of using:

>>>dclua.DeclenseTrainer.generalizeModel(
... model= [
... [["она"], ["они"], ["онів"]],
... [["ова"], ["ови"], ["овів"]],
... ],
... groups= [
... ["н", "в", "п", "м"]
... ],
... threshold=.3
... )
...
<<< [
... [
... [['она'], ['они'], ['онів']],
... [['ова'], ['ови'], ['овів']],
... [['опа'], ['опи'], ['опів']],
... [['ома'], ['оми'], ['омів']]
... ]
... ]

Threshold parameter is a ratio between amount of rules, which can be generalized to some group and size of that group. It's equal to .3 by default, so if there are less then .3 * size_of_group rules, they won't be generalized.

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Pypi

Declensor library

Using dclua.py library you can train declension models and declense words. This will just replace suffix of the word to correspond new morphological properties you want the word to have. Here's some topics that will help you understand how it works.

Morphological vector

Morphological vector is a vector which determines morphology properties for the lexeme. Number on each coordinate determine some property. You can use your vectors for your language, but here's the structure, which is suggested to use for Ukrainian.

Noun vectors

Noun vectors has 2 coordinates: [number][case]. Here's the table, what means each value.

CoordinateNumberCase
0Nominative
1SingularGenitive
2PluralDative
3Accusative
4Instrumental
5Locative
6Vocative

Infinitive suffix placed at [0][0].

Verbs vectors

Noun vectors has 4 coordinates: [tense][person][number][gender].

CoordinateTensePersonNumberGender
0FirstSingularMasculine
1PresentSecondPluralFeminine
2FutureThirdNeutral
3Past

Infinitive suffix placed at [0][0][0][0].

Adjective vectors

Noun vectors has 3 coordinates: [gender][number][person].

CoordinateGenderNumberPerson
0SingularFirst
1MasculinePluralSecond
2FeminineThird
3Neutral

Infinitive suffix placed at [0][0][0].

Declension rule

Declension rule is a multidimensional array which contains declensed suffixes, which is indexed using morphology vectors. You can create such model for your word in this way:

rule=dclua.DeclenseTrainer.analyze({
(0,0): 'усмішка',
(1,0): 'усмішка',
(1,1): 'усмішки',
(1,2): 'усмішці',
#...
(2,6): 'усмішки'
});

Now the rule will look like this:

rule[0][0] =='ка'rule[1][0] =='ка'rule[1][1] =='ки'rule[1][2] =='ці'#...rule[2][6] =='ки'

Every word has its suffix, so you need to create rule for each of them in order to use in the future.

analyze method also accept minsize argument, which determine size of the minimal producing suffix.

Word declension

Once you have model (bundle of rules) for different suffixes, you can use them to declense words. The syntax is following:

Declensor.declense(str word, tuple newmporph, tuple morphology=None)

Suppose, you have model variable, which contains models for all suffixes we want. Then you can declense words in the following way:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1))
<<<'сонця'

The morphology vector of given word will be recognized automatically, so it may take some time to found appropriate declension model in models. If you already know the morphology of the word you want to declense, assign it to the morphology argument:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1), morphology=(1,2))
<<<'сонця'

Train your model

In order to train your model you can use template from template.py in this directory.

Generalizing model

Sometimes suffix in a model can appear in slight variations. For example, aab, aac: only the last letter is different. You can set up groups of letters, which can differ in such cases, and generalize your model according to this groups. Example of using:

>>>dclua.DeclenseTrainer.generalizeModel(
... model= [
... [["она"], ["они"], ["онів"]],
... [["ова"], ["ови"], ["овів"]],
... ],
... groups= [
... ["н", "в", "п", "м"]
... ],
... threshold=.3
... )
...
<<< [
... [
... [['она'], ['они'], ['онів']],
... [['ова'], ['ови'], ['овів']],
... [['опа'], ['опи'], ['опів']],
... [['ома'], ['оми'], ['омів']]
... ]
... ]

Threshold parameter is a ratio between amount of rules, which can be generalized to some group and size of that group. It's equal to .3 by default, so if there are less then .3 * size_of_group rules, they won't be generalized.

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

36 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Pypi

Declensor library

Using dclua.py library you can train declension models and declense words. This will just replace suffix of the word to correspond new morphological properties you want the word to have. Here's some topics that will help you understand how it works.

Morphological vector

Morphological vector is a vector which determines morphology properties for the lexeme. Number on each coordinate determine some property. You can use your vectors for your language, but here's the structure, which is suggested to use for Ukrainian.

Noun vectors

Noun vectors has 2 coordinates: [number][case]. Here's the table, what means each value.

CoordinateNumberCase
0Nominative
1SingularGenitive
2PluralDative
3Accusative
4Instrumental
5Locative
6Vocative

Infinitive suffix placed at [0][0].

Verbs vectors

Noun vectors has 4 coordinates: [tense][person][number][gender].

CoordinateTensePersonNumberGender
0FirstSingularMasculine
1PresentSecondPluralFeminine
2FutureThirdNeutral
3Past

Infinitive suffix placed at [0][0][0][0].

Adjective vectors

Noun vectors has 3 coordinates: [gender][number][person].

CoordinateGenderNumberPerson
0SingularFirst
1MasculinePluralSecond
2FeminineThird
3Neutral

Infinitive suffix placed at [0][0][0].

Declension rule

Declension rule is a multidimensional array which contains declensed suffixes, which is indexed using morphology vectors. You can create such model for your word in this way:

rule=dclua.DeclenseTrainer.analyze({
(0,0): 'усмішка',
(1,0): 'усмішка',
(1,1): 'усмішки',
(1,2): 'усмішці',
#...
(2,6): 'усмішки'
});

Now the rule will look like this:

rule[0][0] =='ка'rule[1][0] =='ка'rule[1][1] =='ки'rule[1][2] =='ці'#...rule[2][6] =='ки'

Every word has its suffix, so you need to create rule for each of them in order to use in the future.

analyze method also accept minsize argument, which determine size of the minimal producing suffix.

Word declension

Once you have model (bundle of rules) for different suffixes, you can use them to declense words. The syntax is following:

Declensor.declense(str word, tuple newmporph, tuple morphology=None)

Suppose, you have model variable, which contains models for all suffixes we want. Then you can declense words in the following way:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1))
<<<'сонця'

The morphology vector of given word will be recognized automatically, so it may take some time to found appropriate declension model in models. If you already know the morphology of the word you want to declense, assign it to the morphology argument:

>>>dcl=dclua.Declensor(model)
>>>dcl.declense('сонцю', (1,1), morphology=(1,2))
<<<'сонця'

Train your model

In order to train your model you can use template from template.py in this directory.

Generalizing model

Sometimes suffix in a model can appear in slight variations. For example, aab, aac: only the last letter is different. You can set up groups of letters, which can differ in such cases, and generalize your model according to this groups. Example of using:

>>>dclua.DeclenseTrainer.generalizeModel(
... model= [
... [["она"], ["они"], ["онів"]],
... [["ова"], ["ови"], ["овів"]],
... ],
... groups= [
... ["н", "в", "п", "м"]
... ],
... threshold=.3
... )
...
<<< [
... [
... [['она'], ['они'], ['онів']],
... [['ова'], ['ови'], ['овів']],
... [['опа'], ['опи'], ['опів']],
... [['ома'], ['оми'], ['омів']]
... ]
... ]

Threshold parameter is a ratio between amount of rules, which can be generalized to some group and size of that group. It's equal to .3 by default, so if there are less then .3 * size_of_group rules, they won't be generalized.

Releases

Packages

Used by

Contributors

Languages