November 17, 2023

Stemming

стемминг

const natural = require('natural');
const fs = require('fs');

// Загрузка стеммеров для разных языков
const stemmers = {
  ru: natural.PorterStemmerRu,
  en: natural.PorterStemmer,
  fr: natural.PorterStemmerFr
};

// Чтение содержимого текстового файла
const filePath = 'file.txt';
const textContent = fs.readFileSync(filePath, 'utf-8');

// Токенизация текста на слова
const tokenizer = new natural.WordTokenizer();
const words = tokenizer.tokenize(textContent);

// Стемминг каждого слова для каждого языка
const stemmedWords = words.map(word => {
  return Object.keys(stemmers).reduce((result, lang) => {
    result[lang] = lang === 'ru' ? stemmers[lang].stem(word) : stemmers[lang].stem(word.toLowerCase());
    return result;
  }, {});
});

// Сохранение стеммированных слов в новый файл
const outputFilePath = 'lang_out.txt';
fs.writeFileSync(outputFilePath, JSON.stringify(stemmedWords, null, 2), 'utf-8');

console.log('Стемминг завершен. Стеммированные слова сохранены в', outputFilePath);

Вместо использования JSON.stringify для сериализации массива stemmedWords в JSON формат, вы можете использовать другой подход, например, записывать стеммированные слова прямо в текстовый файл, разделяя их с помощью определенного разделителя, такого как пробел или перевод строки.

Ниже представлен пример, как вы можете изменить код для сохранения стеммированных слов в текстовый файл, используя перевод строки в качестве разделителя:

const natural = require('natural');
const fs = require('fs');

// Загрузка стеммеров для разных языков
const stemmers = {
  ru: new natural.PorterStemmerRu(),
  en: new natural.PorterStemmer(),
  fr: new natural.PorterStemmerFr()
};

// Чтение содержимого текстового файла
const filePath = 'путь/к/вашему/текстовому/файлу.txt';
const textContent = fs.readFileSync(filePath, 'utf-8');

// Токенизация текста на слова
const tokenizer = new natural.WordTokenizer();
const words = tokenizer.tokenize(textContent);

// Стемминг каждого слова для каждого языка
const outputFilePath = 'путь/к/вашему/выходному/файлу.txt';
const stream = fs.createWriteStream(outputFilePath, { flags: 'a' }); // Создание потока для записи в файл

words.forEach(word => {
  const stemmedWords = Object.keys(stemmers).map(lang => {
    return lang === 'ru' ? stemmers[lang].stem(word.toLowerCase()) : stemmers[lang].stem(word.toLowerCase());
  }).join('\n'); // Разделение стеммированных слов переводом строки

  stream.write(stemmedWords + '\n'); // Запись стеммированных слов в файл с переводом строки
});

stream.end(); // Завершение записи в файл
console.log('Стемминг завершен. Стеммированные слова сохранены в', outputFilePath);

Этот код выполняет стемминг каждого слова из входного файла и записывает стеммированные слова в выходной файл, разделяя их переводом строки. Вместо перевода строки ('\n') вы можете использовать другой разделитель в зависимости от требований вашего приложения.