gmo61520

Untitled

Dec 16th, 2015
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.11 KB | None | 0 0
  1. var fs = require('fs');
  2.  
  3. // небольшая штучка, которая читает файлы по имени из папки, режет на слова, переводит в нижний регистр, а потом хранит в кеше
  4. function Reader(folder){
  5. this.folder = folder;
  6. this.database = {};
  7. }
  8.  
  9. // сама ф-ия чтения
  10. Reader.prototype.read = function (name){
  11. if (this.database.hasOwnProperty(name)){
  12. return this.database[name];
  13. }
  14.  
  15. var str = fs.readFileSync(this.folder + '/' + name).toString();
  16. str = str.substr(str.indexOf('\n\n') + 2);
  17. return this.database[name] = str.split(/[^a-zA-Z]+/g).filter(x => x).map(x => x.toLowerCase());
  18. };
  19.  
  20. // учимся (просто собираем слова в словарик)
  21. var learned = (() => {
  22. console.time('learning');
  23.  
  24. // читаем из папки 1
  25. var reader = new Reader('1');
  26.  
  27. // временный словарик (в нём будет вообще всё)
  28. var dictionary = {};
  29.  
  30. // читаем truth
  31. var truth = fs.readFileSync('1/!truth.txt').toString()
  32. .split('\n') // режем на строки
  33. .map(x => x.trim().split(' ')) // каждую строку режем по пробелу
  34. .filter(x => x.length == 2); // оставляем только те, в которых два куска
  35.  
  36. // пробегаем по разрезанному на куски файлу, читаем файлы и заносим слова в словарик
  37. truth.forEach(a => {
  38. var isSpam = a[1] == 'SPAM';
  39. var candidate = reader.read(a[0]).forEach(x => { // для каждого слова
  40. if (!x) return;
  41.  
  42. if (dictionary.hasOwnProperty(x)){ // если есть в словарике
  43. dictionary[x].total += 1;
  44. if (isSpam) dictionary[x].spam += 1;
  45. } else {
  46. // иначе добавляем
  47. dictionary[x] = {
  48. total: 1,
  49. spam: isSpam ? 1 : 0,
  50. danger: 0.0 // насколько слово опасно (поставим потом)
  51. }
  52. }
  53. });
  54. });
  55.  
  56. // фильтруем словарь, оставляем только слова с более чем пятью попаданиями
  57. var filtered = {};
  58. for (var key in dictionary){
  59. var v = dictionary[key]
  60. if (v.total > 5){
  61. v.danger = v.spam / v.total;
  62. filtered[key] = v;
  63. }
  64. }
  65.  
  66. // небольшая проверка
  67. var success = 0;
  68. truth.forEach(a => {
  69. var isSpam = a[1] == 'SPAM';
  70. var summary = 0;
  71.  
  72. var candidate = reader.read(a[0]).forEach(x => {
  73. if (filtered.hasOwnProperty(x) && filtered[x].danger > 0.99){
  74. summary += filtered[x].spam / filtered[x].total;
  75. }
  76. });
  77.  
  78. var result = summary > 1;
  79. if (result == isSpam){
  80. success++;
  81. } else {
  82. console.log('miss: ' + (isSpam ? 'spam' : 'nospam') + ', ' + summary)
  83. }
  84. });
  85.  
  86. console.timeEnd('learning');
  87. console.log('learn result: ' + success / truth.length);
  88.  
  89. return filtered;
  90. })();
  91.  
  92. ((filtered) => {
  93. var reader = new Reader('2');
  94.  
  95. var truth = fs.readFileSync('2/!truth.txt').toString().split('\n').map(x => x.trim().split(' '))
  96. .filter(x => x.length == 2);
  97.  
  98. var success = 0;
  99. truth.forEach(a => {
  100. var isSpam = a[1] == 'SPAM';
  101. var summary = 0;
  102.  
  103. var candidate = reader.read(a[0]).forEach(x => {
  104. if (filtered.hasOwnProperty(x) && filtered[x].danger > 0.99){
  105. summary += filtered[x].spam / filtered[x].total;
  106. }
  107. });
  108.  
  109. var result = summary > 5;
  110. if (result == isSpam){
  111. success++;
  112. } else {
  113. console.log('miss: ' + (isSpam ? 'spam' : 'nospam') + ', ' + summary)
  114. }
  115. });
  116.  
  117. console.log('test result: ' + success / truth.length);
  118. })(learned);
Advertisement
Add Comment
Please, Sign In to add comment