-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.ts
127 lines (117 loc) · 4.89 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import * as Stanford from "stanford-ner"; // biblioteca de Stanford que facilita o uso do Natural Node
let ner = new Stanford.NER(); // nova instancia de NER
let cfg = require('./config.json'); // obtendo o arquivo de configuracao
let MongoClient = require('mongodb').MongoClient; // obtendo o cliente para se conectar no mongo
let query = require('./query'); // obtendo a string que contém a query inicial que será executada pelo MongoDB
let regras = require('./regras');
let latinize = require('latinize'); // Para tornar a string Latina (sem acentos). Necessario para ser processada no idioma ingles
let colResultado; // referencia da collection que sera salva o resultado
//let Sleep = require('sleep');
/*
* Esta função é responsável por analisar a propriedade "est" dentro de
* cada documento e usar a biblioteca Stanford NER como facilitadora do
* uso da Natural Node. Ela classifica o texto em entidades, tais como
* Organizações e Pessoas. Identificado as pessoas no texto,
* é substituído por outro genérico, com o intuito de remover nomes próprios
* da história recuperada do Facebook.
* @param docs
*/
async function analisar(docs) {
let val, index = 0;
// Iterando os documentos retornados da consulta
for (let item of docs) {
// Verificando se o documento possui a propriedade "est"
if (item.est) {
// Verificando a propriedade "est" possui indice valido
if (item.est[0]) {
if (index % 500 == 0) {
ner.exit();
ner = new Stanford.NER();
};
// Removendo os acentos e outros caracteres e transformando os arrays de historias numa string unica
item.est = cleanUp(item.est.join(''));
// Se a string contém link, é analisada de forma diferente (sem link)
if (item.est.indexOf('http') > -1) {
// ner.getEntities obtém as entidades do texto
index++;
val = await ner.getEntities(item.est.split('http')[0]);
} else {
index++;
val = await ner.getEntities(item.est);
}
// Com as entidades recuperadas, é iterado para verificar se contém PERSON (Pessoas)
if (val) {
val.forEach((entidade) => {
entidade.forEach((value, key) => {
// Verifica se o Mapa tem PERSON
if (key == 'PERSON') {
// Se tiver, itera sobre os nomes (PEOPLE)
value.forEach((nome) => {
// Troca o nome identificado por um texto
item.est = item.est.replace(nome, 'Somewho');
item.subject = regras(item.est);
})
}
});
})
}
}
}
// Após o processamento do documento, é salvo
salvar(item, index);
}
// Chegou ao fim desse ciclo
console.log("Processo concluido");
}
/*
* Esta função salva um documento passado por argumento em uma nova collection do MongoDB
*/
function salvar(data, index) {
colResultado.save(data, function(e, s) {
//Callback da operação de salvar
console.log("Salvando item modificado: ", index);
});
}
/*
* Esta função troca qualquer caracter que não é uma letra por nada para
* estar apta à Stanford NER
*/
function cleanUp(texto){
return latinize(texto.replace(/[^a-z ]+/gi, ''));
}
/*
* Função principal do script, ela se conecta na base de dados e realiza a consulta.
*/
function main() {
// Conectando no MongoDB
MongoClient.connect(cfg.URI_MONGO, function(err, db) {
// salvando o nome da collection onde estão os dados
let col = db.collection('questionarios');
// salvando o nome da collection onde será salvo os resultados tratados
colResultado = db.collection('questionarios_nlp');
// Execução de agregação do MongoDB
col.aggregate(query, {allowDiskUse: true}).toArray(function(erro, docs) {
if (!erro) {
// se nao houver erro, invoca iniciar
console.log(docs.length)
iniciar(docs);
} else {
console.log("Erro encontrado", erro);
}
})
});
}
/*
* Função separa devido o conteudo ser síncrono. Essa função invoca a função que analisará
* o texto de forma síncrona.
*/
async function iniciar(data) {
// await irá esperar até que todos os documentos (registros) sejam processandos
await analisar(data);
// finalizando o Stanford NER
ner.exit();
}
/*
* Invocando a função principal que irá iniciar a operação
*/
main();