NODEJS для STEEMIT - Анализ количества наиболее встречающихся слов в постах // NODEJS for STEEMIT - Analysis of the number of most common words
Итак, в прошлом посте:
- мы установили NodeJS
- произвели запуск первого минимального поста.
Ссылка на прошлый пост: https://steemit.com/hive-171319/@alexmove/nodejs-how-to-work-in-steem-steemit-basics-of-work-osnovy-raboty
Пришло время сделать что-то еще. Изучать NODEJS интересно, сразу применяя на практике и делая что-то любопытное.
В этом посте:
- рассмотрим функцию определения количества повторов слов в посте
- рассмотрим выбор наиболее часто встречающихся слов
- получение последних постов по нужному тегу
- соединение всех рассмотренных функций в один скрипт с подключением нужных модулей
Этот скрипт я использовал в одном из прошлых постов. Анализировал наиболее часто употребляемые слова в последних постах.
Ссылки на посты:
https://steemit.com/steemit/@alexmove/most-common-words-in-100-posts-with-tag-steemit
https://steemit.com/hive-171319/@alexmove/analiz-100-postov-s-tegom-ukraine-na-samye-ispolzuemye-slova-samoe-ispolzuemoe-slovo-ochen
Разберем этот скрипт.
Вначале добавим все константы и подключение к модулям.
//подключение к модулю dsteem для работы с API STEEMIT
const dsteem = require('dsteem');
const client = new dsteem.Client('https://api.steemit.com');
//ключ и имя аккауна - тут надо ввести свой приватный ключ
let wifkey = 'хххххх';
//имя аккаунта
let votey = "alexmove";
//технические переменные
var author;
var permlinkR;
var body3R;
Далее функция, которая считывает данные о постах.
Я присваиваю в переменные author - имя аккаунта, а в permlinkR ссылку поста. Это нужно для работы моей отдельной функции по обнаружении наиболее встречающихся слов. Хотя можно было бы сделать иначе, и обойтись без дополнительных переменных. Но мне так удобнее было на момент написания этого скрипта. И сейчас для наглядности происходящего это также удобно.
async function main() {
    const query = {
    //указать тег, который нужно читать
        tag: 'bru',
    //количество получаемых постов
        limit: 1,
    //нужно ли получать текст поста
        truncate_body: 0,
    };
    client.database
        .getDiscussions('trending', query)
        .then(result => {
            var posts = [];
            result.forEach(post => {
                author = post.author;
                permlinkR = post.permlink;
                body = post.body;
                body = body.split(" ");
                words(body);
                 
             
            });
  
        console.log(body3R); 
       
        })
        .catch(err => {
            console.log(err);
            alert('Error occured, please reload the page');
        });
}
//catch error messages
main().catch(console.error);
И функция, которая получает последние посты в STEEMIT
client.database.call('get_content', [author, permlinkR]).then(function(discussion){})
Функция которая анализирует наиболее употрбеляемые слова:
function words(body) 
{
                
    //let words = body1.split(" ");
        var wordsCount = body.reduce(function (acc, w) {
        if(acc[w]) {
            acc[w] += 1
        } else {
            acc[w] = 1;
        }
        
        return acc;
        }, {});
     
        for (var w in wordsCount) 
        {
            console.log('Cлово "%s" встречается %d раз', w, wordsCount[w]);
            //если слово встречается больше 2 раз, и длина слова больше 4 символов
            if (wordsCount[w]>2) {
            if (w.length>4)  {
               
               //  body3R = body3R +  `| @`+author + ` | ` + `<a href="https://steemit.com/@${author}/${permlinkR}">` + permlinkR + ` </a> | Word "`+ w +`"| be found  ` + wordsCount[w]+ ' times | \n';
                bodyArr = bodyArr + ` ` + w;
                fs.writeFileSync("bdLOG.txt",body3R);
            }
            
            
            }
        }
}
Соединяем все это в один файл, называем его "analize.js", поменяешь в каталог "js" на диске С:
Вот полный текст скрипта:
const dsteem = require('dsteem');
const client = new dsteem.Client('https://api.steemit.com');
let wifkey = 'xxxxx';
let votey = "alexmove";
var author;
var permlinkR;
var body3R;
function words(body) 
{
                
    //let words = body1.split(" ");
        var wordsCount = body.reduce(function (acc, w) {
        if(acc[w]) {
            acc[w] += 1
        } else {
            acc[w] = 1;
        }
        
        return acc;
        }, {});
     
        for (var w in wordsCount) 
        {
            //console.log('Cлово "%s" встречается %d раз', w, wordsCount[w]);
            if (wordsCount[w]>2) {
            if (w.length>4)  {
               
                    body3R = body3R +  `| @`+author + ` | ` + `<a href="https://steemit.com/@${author}/${permlinkR}">` + permlinkR + ` </a> | Word "`+ w +`"| be found  ` + wordsCount[w]+ ' times | \n';
            }
            }
        }
}
async function main() {
    const query = {
        tag: 'bru',
        limit: 10,
        truncate_body: 0,
    };
    client.database
        .getDiscussions('trending', query)
        .then(result => {
            var posts = [];
            result.forEach(post => {
                author = post.author;
                permlinkR = post.permlink;
                body = post.body;
                body = body.split(" ");
                words(body);
                 
             
            });
  
        console.log(body3R); 
       
        })
        .catch(err => {
            console.log(err);
            alert('Error occured, please reload the page');
        });
}
//catch error messages
main().catch(console.error);
client.database.call('get_content', [author, permlinkR]).then(function(discussion){})
  
Соединяем все это в один файл, называем его "analize.js", поменяешь в каталог "js" на диске С:
Запускаем nodejs command promt
набираем, как мы помним из прошлого поста, cd .., cd js (пока не окажемся в нужной нам папке C:\js).
набираем node analize.js
Если выводит ошибку: "SyntaxError: Unexpected token '}'" - значит это ошибка, где-то добавили лишний символ, возможно случайно. Пожалуйста, перепроверьте.
Если выводит ошибку: "Cannot find module 'dsteem', надо запустить команду "npm i dsteem" для того, чтобы установить модуль в ваш NODEJS
В случае успешного запуска, у вас получится вот такое окошко.
| First Header | Second Header | --- | -- | 
|---|---|---|---|
| @diosarich | one-day-in-my-hometown-5-or-the-wonders-of-nature-in-the-philippines-in-summer-the-pace-of-living-relaxes-to-a-steadier-rhythm | Word "Oriental" | be found 8 times | 
| @tinochka2 | one-day-in-my-town-fontan-zhizni-v-zaporozhe | Word "фонтан" | be found 3 times | 
| @tinochka2 | one-day-in-my-town-fontan-zhizni-v-zaporozhe | Word "когда" | be found 3 times | 
| @tinochka2 | one-day-in-my-town-fontan-zhizni-v-zaporozhe | Word "спасибо" | be found 3 times | 
Это сделано как раз для того, чтобы можно было в посте отобразить в красивой табличке. В самом скрипте, разумеется, это можно настроить.
Мы получаем подготовленный список для таблички, где указан автор, ссылка на пост, слово и количество, которое оно найдено.
Интересный материал на тему NODEJS для STEEMIT:
https://steemit.com/utopian-io/@edicted/dsteem-tutorial-lesson-5-inspecting-block-operations
Сегодня мы сделали скрипт для STEEMIT на NODEJS, который определяет количество наиболее используемых слов.
Есть вопросы? Задавайте.
Что интересно автоматизировать?
В следующем посте о NODEJS мы двинемся дальше исследовать программирование для STEEMIT
Всем счастья!
Спасибо за внимание!


Я бы, наверное, попробовала разгадать алгоритмы, кто как голосует. Например, я голосую в сообществе по свежим интересным постам. Куратор может голосовать по определенным тегам. Вот понять эту закономерность было бы интересно:) Вводить название аккаунта и понимаешь его логику!)
Это прямо ИИ надо разрабатывать... Но как минимум статистику можно собирать.
Возможно придумать/найти статистические формулы, и на базе них.
Хотя тут же есть факторы, которые сложно отследить автоматом. Например качество картинки на превью, тема поста и так далее.
Но в целом идея живая, можно вывести определенное количество свойств каждого поста, составить статистику по голосованию исследуемого аккаунта. И на базе этой статистики найти способ прогнозирования, если будет закономерность.
Вау, крутая тема получается
@greatketty
Я тоже думал о чем-то подобном, только в гораздо упрощенной форме - просто писать комментарии под каждым постом, где кураторы апы ставят :)
А у тебя тут гораздо более масштабная идея. в
В случае реализации, можно прогнозировать, где будет ап китов - делать апвоуты ДО апа китов, и соответственно неплохо получать от кураторских)
Одна голова хорошо, а две лучше! Будет круто, если получится что-то:)
волшебники, как вы это делаете)