Філологи-мовознавці. Клуб ботанів

knedlyk

Заблокирован
Реєстрація
29.03.18
Місто
🟦🟨
Телефон
Піксель
knedlyk, імхо, потрібен словник відмінків імен, прізвищ і по-батькові
На пайтоні за допомогою дружини та чатаджипіті зробив скриптик з бібліотекою polymorphy2, на 75% вдалося досягнутри результату. Проблеми були з короткими прізвищами, апострофами і ще з низкою прізвищ на "-ук" та "-ко".
В процесі зрозумів, що все ж потрібний знахідний відмінок xD.
 

knedlyk

Заблокирован
Реєстрація
29.03.18
Місто
🟦🟨
Телефон
Піксель
knedlyk, імхо, потрібен словник відмінків імен, прізвищ і по-батькові
На пайтоні за допомогою дружини та чатаджипіті зробив скриптик з бібліотекою polymorphy2, на 75% вдалося досягнутри результату. Проблеми були з короткими прізвищами, апострофами і ще з низкою прізвищ на "-ук" та "-ко".
В процесі зрозумів, що все ж потрібний знахідний відмінок xD.
Колеги з сусідньої "організації" підказали ще один морфологічний аналізатор "Шевченко", щоправда на JS https://shevchenko-js.tooleks.com/#documentation, на github https://github.com/tooleks/shevchenko-js

PS Намагаюся розібратися, як його на пайтон конвертнути :)
 
Реєстрація
26.10.07
Місто
London
Телефон
Samsung Galaxy S20
knedlyk можна не ковертувати, а або скомпілити у CLI і смикати пайтоном через консоль, або там вже є готова версія що піднімає http сервер і стукатись пайтоном до нього.
 

knedlyk

Заблокирован
Реєстрація
29.03.18
Місто
🟦🟨
Телефон
Піксель
knedlyk можна не ковертувати, а або скомпілити у CLI і смикати пайтоном через консоль, або там вже є готова версія що піднімає http сервер і стукатись пайтоном до нього.
Підкажіть, як скомпілювати? Мені важливо локально запускати на машині у wsl: згодовувати текстовий файл скрипту, в якому він перетворює рядки тексту на відповідний відмінок.
Ідеально було би спробувати створити розширення для libreoffice, яке могло би це робити автоматом або макрос (я в тому не дуже розбираюся).
 
Реєстрація
26.10.07
Місто
London
Телефон
Samsung Galaxy S20
knedlyk
Для початку має бути встановлений nodejs. Далі інсталюємо `pkg`
Bash:
npm i --global pkg
У директорії з кодом набираємо
Bash:
npx pkg .

На виході має бінарники для вінди/лінукса/мака. Опціонально можна передавати в аргументах аби білдилось тільки під одну платформу.
Ну і звісно треба написати index.js який буде приймати агрументи з консолі і видавати потрібний формат на виході.
Ну і Шевченко.ЖС явно працює тільки з ПІБ, воно не розраховане на довільні слова. Якщо тобі саме для ПІБ потрібно - напиши у ПП, я тобі зроблю ті бінарники. Там роботи на 5 хв.
 

knedlyk

Заблокирован
Реєстрація
29.03.18
Місто
🟦🟨
Телефон
Піксель
knedlyk
Для початку має бути встановлений nodejs. Далі інсталюємо `pkg`
Bash:
npm i --global pkg
У директорії з кодом набираємо
Bash:
npx pkg .

На виході має бінарники для вінди/лінукса/мака. Опціонально можна передавати в аргументах аби білдилось тільки під одну платформу.
Ну і звісно треба написати index.js який буде приймати агрументи з консолі і видавати потрібний формат на виході.
Ну і Шевченко.ЖС явно працює тільки з ПІБ, воно не розраховане на довільні слова. Якщо тобі саме для ПІБ потрібно - напиши у ПП, я тобі зроблю ті бінарники. Там роботи на 5 хв.
дякую!

врешті вийшов такий код, який аналізує вхідний файл зі списком прізвищ, імен, по батькові, змінює відмінок залежно від параметру та зберігає до зазначеного файлу, можна примусово зазначити граматичний рід. Використовується JS бібліотека "Шевченко". Залежності треба встановити вручну.
Код:
const shevchenko = require('shevchenko');
const genderDetection = require('gender-detection');
const { promisify } = require('util');
const fs = require('fs');

const readFile = promisify(fs.readFile);

async function main() {
  const args = process.argv.slice(2);
  const inputFile = args[0];
  const outputFile = args[1];
  const caseType = args[2] || 'nominative';

  if (!inputFile || args [0] == '-h' || args [0] =='--help') {
    console.error('Usage: node index.js <inputFile> <outputFile> [male|female] [caseType] | [--help]');
    console.error('\nOptions for "caseType":');
    console.error('  - nominative, is default if none is given');
    console.error('  - genitive');
    console.error('  - dative');
    console.error('  - accusative');
    console.error('  - ablative');
    console.error('  - locative');
    console.error('  - vocative');
    console.error('\nExample: node index.js input.txt output.txt female vocative\n');
    return;
  }

  // читаємо зовнішній файл та отримуємо рядки з прізвищами
  const fileData = await readFile(inputFile, 'utf8');
  const namesArray = fileData.split('\n');

  // конвертуємо кожне прізвище
  const convertedNames = await Promise.all(namesArray.map(async (name) => {
    const [familyName, givenName, patronymicName] = name.trim().split(' ');

    // перевірка на наявність порожнього рядка
    if (!givenName) {
//      console.warn(`Warning: Given name is missing for "${familyName} ${patronymicName}"`);
      return name;
    }

//    const gender = genderDetection.detect(givenName.toLowerCase()) || 'unknown';

    const anthroponym = { givenName, patronymicName, familyName };

    const gender = await shevchenko.detectGender(anthroponym); // "feminine"
    if (gender == null) {
        throw new Error('Failed to detect grammatical gender.');
    }

    const genderShevchenko = gender === 'female' ? 'feminine' : 'masculine';
    const genderShevchenkoDetected = await shevchenko.detectGender(anthroponym);
    const genderShevchenkoFinal = genderShevchenkoDetected || genderShevchenko;
    const input = { ...anthroponym, gender: genderShevchenkoFinal };
    const output = await shevchenko[`in${caseType[0].toUpperCase()}${caseType.slice(1)}`](input);

    return `${output.familyName} ${output.givenName} ${output.patronymicName}`;
  }));

  // записуємо


  // записуємо результат в зовнішній файл
//  await fs.promises.writeFile(outputFqzile, convertedNames.join('\n'));
  await fs.promises.writeFile(outputFile, convertedNames.filter(Boolean).join('\n'));

  console.log('Converted successfully to '+caseType+'! See output file '+outputFile);
}

main().catch((error) => console.error(error));
 
Останнє редагування:
Реєстрація
26.10.07
Місто
London
Телефон
Samsung Galaxy S20
knedlyk
Код:
// never used
const helpReq = args[3];
 
// args - массив, тому  args=='-h' || args =='--help' завжи повертатиме false
if (!inputFile || args=='-h' || args =='--help')

// якщо текстовий документ створений на windows чи mac, цей шматок може відпрацювати некорретно, бо там інші переноси рядків.
const namesArray = fileData.split('\n');

// якщо хоч один рядок видасть помилку - воно усе зафейлиться.
// плюс код не відпрацює з пустими рядками у кінці, можна додати нагорі fileData.trim().split('\n') щоб їх трімнути
const convertedNames = await Promise.all(namesArray.map(async (name) => {

// сумнівно додатково детектити стать сторонньою лібою, яка до того ж початково розрахована на англійську
// але тобі видніше юзати вбудований у шевченка детектор чи додавати ще щось
const gender = genderDetection.detect(givenName) || 'unknown';
[/QUOTE]
[/SPOILER]
 

knedlyk

Заблокирован
Реєстрація
29.03.18
Місто
🟦🟨
Телефон
Піксель
knedlyk
Код:
// never used
const helpReq = args[3];

// args - массив, тому  args=='-h' || args =='--help' завжи повертатиме false
if (!inputFile || args=='-h' || args =='--help')

// якщо текстовий документ створений на windows чи mac, цей шматок може відпрацювати некорретно, бо там інші переноси рядків.
const namesArray = fileData.split('\n');

// якщо хоч один рядок видасть помилку - воно усе зафейлиться.
// плюс код не відпрацює з пустими рядками у кінці, можна додати нагорі fileData.trim().split('\n') щоб їх трімнути
const convertedNames = await Promise.all(namesArray.map(async (name) => {

// сумнівно додатково детектити стать сторонньою лібою, яка до того ж початково розрахована на англійську
// але тобі видніше юзати вбудований у шевченка детектор чи додавати ще щось
const gender = genderDetection.detect(givenName) || 'unknown';
[/QUOTE]
[/SPOILER]
Дякую за відгук! Вніс перевірки. З арґументами в масиві працює для видачі підказки.
Я з JS раніше не працював, тому тут багато нубівського )))
 

knedlyk

Заблокирован
Реєстрація
29.03.18
Місто
🟦🟨
Телефон
Піксель
knedlyk
Для початку має бути встановлений nodejs. Далі інсталюємо `pkg`
Bash:
npm i --global pkg
У директорії з кодом набираємо
Bash:
npx pkg .

На виході має бінарники для вінди/лінукса/мака. Опціонально можна передавати в аргументах аби білдилось тільки під одну платформу.
Ну і звісно треба написати index.js який буде приймати агрументи з консолі і видавати потрібний формат на виході.
Ну і Шевченко.ЖС явно працює тільки з ПІБ, воно не розраховане на довільні слова. Якщо тобі саме для ПІБ потрібно - напиши у ПП, я тобі зроблю ті бінарники. Там роботи на 5 хв.
Я подумав, що з рештою фраз (крім ПІП) впорається бібліотека pymorph2 чи pymorph3 - вона це ніби вміє робити. Можливо ви підкажете инший сценарій?
 
Реєстрація
26.10.07
Місто
London
Телефон
Samsung Galaxy S20
Я подумав, що з рештою фраз (крім ПІП) впорається бібліотека pymorph2 чи pymorph3 - вона це ніби вміє робити. Можливо ви підкажете инший сценарій?
На жаль не підкажу. Лінгвістичними лібами не цікавився
 

drmz

маниакально-депрессивный стэндап
Реєстрація
13.03.09
Місто
Гуляйполе
килограммы яиц, миллиметры Киева.

абзацы II, VIII, IX
"мм. Києві та Севастополі",
 

knedlyk

Заблокирован
Реєстрація
29.03.18
Місто
🟦🟨
Телефон
Піксель
килограммы яиц, миллиметры Киева.

абзацы II, VIII, IX
"мм. Києві та Севастополі",
Міста.
 

dzidzio

Генерал Ухилянтських Військ
Реєстрація
23.04.19
Місто
Тарнопіль
Телефон
iPhone 14

Кочевник

Ховрах-Терорист
Команда форуму
Реєстрація
30.01.08
Місто
Київ, Львів
Телефон
Sams Note 20 Ultra + S8
Нова пішта надіслала смс згідно нової дибільної системи транслітерації:
Posylka AENM00........ priamuie do vas u "Punkt pryimannia-vydachi (do 30 kh): vul. ..........., .." ............... (Lvivska obl.). Protiahom doby vy mozhete zminyty mistse dostavky, detali - https://my.novaposhtaglobal.ua
Я довго думав, читав наукові дослідження. Що таке "30 х", а може "30 кх"?
 
Зверху