Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var fs = require('fs');
- // небольшая штучка, которая читает файлы по имени из папки, режет на слова, переводит в нижний регистр, а потом хранит в кеше
- function Reader(folder){
- this.folder = folder;
- this.database = {};
- }
- // сама ф-ия чтения
- Reader.prototype.read = function (name){
- if (this.database.hasOwnProperty(name)){
- return this.database[name];
- }
- var str = fs.readFileSync(this.folder + '/' + name).toString();
- str = str.substr(str.indexOf('\n\n') + 2);
- return this.database[name] = str.split(/[^a-zA-Z]+/g).filter(x => x).map(x => x.toLowerCase());
- };
- // учимся (просто собираем слова в словарик)
- var learned = (() => {
- console.time('learning');
- // читаем из папки 1
- var reader = new Reader('1');
- // временный словарик (в нём будет вообще всё)
- var dictionary = {};
- // читаем truth
- var truth = fs.readFileSync('1/!truth.txt').toString()
- .split('\n') // режем на строки
- .map(x => x.trim().split(' ')) // каждую строку режем по пробелу
- .filter(x => x.length == 2); // оставляем только те, в которых два куска
- // пробегаем по разрезанному на куски файлу, читаем файлы и заносим слова в словарик
- truth.forEach(a => {
- var isSpam = a[1] == 'SPAM';
- var candidate = reader.read(a[0]).forEach(x => { // для каждого слова
- if (!x) return;
- if (dictionary.hasOwnProperty(x)){ // если есть в словарике
- dictionary[x].total += 1;
- if (isSpam) dictionary[x].spam += 1;
- } else {
- // иначе добавляем
- dictionary[x] = {
- total: 1,
- spam: isSpam ? 1 : 0,
- danger: 0.0 // насколько слово опасно (поставим потом)
- }
- }
- });
- });
- // фильтруем словарь, оставляем только слова с более чем пятью попаданиями
- var filtered = {};
- for (var key in dictionary){
- var v = dictionary[key]
- if (v.total > 5){
- v.danger = v.spam / v.total;
- filtered[key] = v;
- }
- }
- // небольшая проверка
- var success = 0;
- truth.forEach(a => {
- var isSpam = a[1] == 'SPAM';
- var summary = 0;
- var candidate = reader.read(a[0]).forEach(x => {
- if (filtered.hasOwnProperty(x) && filtered[x].danger > 0.99){
- summary += filtered[x].spam / filtered[x].total;
- }
- });
- var result = summary > 1;
- if (result == isSpam){
- success++;
- } else {
- console.log('miss: ' + (isSpam ? 'spam' : 'nospam') + ', ' + summary)
- }
- });
- console.timeEnd('learning');
- console.log('learn result: ' + success / truth.length);
- return filtered;
- })();
- ((filtered) => {
- var reader = new Reader('2');
- var truth = fs.readFileSync('2/!truth.txt').toString().split('\n').map(x => x.trim().split(' '))
- .filter(x => x.length == 2);
- var success = 0;
- truth.forEach(a => {
- var isSpam = a[1] == 'SPAM';
- var summary = 0;
- var candidate = reader.read(a[0]).forEach(x => {
- if (filtered.hasOwnProperty(x) && filtered[x].danger > 0.99){
- summary += filtered[x].spam / filtered[x].total;
- }
- });
- var result = summary > 5;
- if (result == isSpam){
- success++;
- } else {
- console.log('miss: ' + (isSpam ? 'spam' : 'nospam') + ', ' + summary)
- }
- });
- console.log('test result: ' + success / truth.length);
- })(learned);
Advertisement
Add Comment
Please, Sign In to add comment