Pular para conteúdo

Identificador

IdentificadorPII

Source code in identificador_pii/identificador.py
  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
class IdentificadorPII():

    def __init__(self) -> None: 
        self.patterns = None

    def load_patterns(self) -> dict:
        """
        Carrega os padrões para buscar documentos brasileiros.



        Returns:
            dict: Dicionário com os padrões regex que serão buscados.
        """

        patterns  = {
        'cpf':  r'^\d{11}$|^\d{3}\.\d{3}\.\d{3}-\d{2}$',
        'telefone': r'^\(?\d{2}\)?\s?\d{4,5}-?\d{4}$',
        'cnh': r'^[A-Z]{2}\d{9}$',
        'email':  r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b',
        'nis': r'\b\d{3}\.\d{5}\.\d{2}-\d{1}\b|\b\d{11}\b'
        }

        self.patterns = patterns



    def add_pattern(self, pattern_name: str, pattern_regex: str) -> dict:
        """
        Função que adiciona um novo padrão regex a ser buscado

        Args:
            pattern_name (str): nome que será dado ao novo padrão
            pattern_regex (str): reges que registra o comportamento daquele padrão
        """
        self.patterns[pattern_name] = pattern_regex

    def remove_pattern(self, pattern_name: str):
        """
        Função que adiciona um novo padrão regex a ser buscado

        Args:
            pattern_name (str): nome que será dado ao novo padrão
        """

        self.patterns.pop(pattern_name)


    def classify_column(self, df, coluna):
        """
        Função que clasifica uma única coluna de um dataframe

        Args:
            df (pandas.DataFrame): Conjunto de dados a ser analisao.
            coluna (str): Nome da coluna a ser analisada.

        Returns:
            coluna (str): Nome da coluna.
            nome (str): nome.
            match_count (int): Quantidade de correspondencias encontradas.
            perc_match_count (float): Percentual de correspondencias encontradas.
        """

        self.load_patterns()
        patterns_to_check = self.patterns

        match_counts = {}
        for pattern in patterns_to_check:
            matches = df[coluna].astype(str).str.match(patterns_to_check[pattern], na=False)
            match_counts[pattern] = matches.sum()

        max_matches_col = max(match_counts, key=match_counts.get)
        max_matches_count = match_counts[max_matches_col]
        max_matches_perc = round((max_matches_count / len(df)),2)


        if df[coluna].dtype == object:
            res = busca_nomes(df, coluna)
            if res[2] > max_matches_count:
                pred = 'nome'
                max_matches_count = res[2]
                max_matches_perc = res[3]
                max_matches_col = 'nome'

        if max_matches_count == 0:
            pred = 'any'
            max_matches_col = ''
        elif max_matches_perc <= .3:
            pred = 'other'
        else:
            pred = max_matches_col

        return [coluna, pred, max_matches_col,max_matches_count,  max_matches_perc]



    def classify_df(self, df):
        """
        Classifica um dataframe.

        Args:
            df (pandas.DataFrame): Conjunto de dados a ser analisao.

        Returns:
            df (pandas.DataFrame): Dataframe as informações de classificação.
        """
        preds = []

        for column in df.columns:
            preds.append(self.classify_column(df, column))
        return pd.DataFrame(preds, columns= ['column_name', 'prediction', 'most_matched_pii','match_count', 'match_perc'])

add_pattern(pattern_name, pattern_regex)

Função que adiciona um novo padrão regex a ser buscado

Parameters:

Name Type Description Default
pattern_name str

nome que será dado ao novo padrão

required
pattern_regex str

reges que registra o comportamento daquele padrão

required
Source code in identificador_pii/identificador.py
33
34
35
36
37
38
39
40
41
def add_pattern(self, pattern_name: str, pattern_regex: str) -> dict:
    """
    Função que adiciona um novo padrão regex a ser buscado

    Args:
        pattern_name (str): nome que será dado ao novo padrão
        pattern_regex (str): reges que registra o comportamento daquele padrão
    """
    self.patterns[pattern_name] = pattern_regex

classify_column(df, coluna)

Função que clasifica uma única coluna de um dataframe

Parameters:

Name Type Description Default
df DataFrame

Conjunto de dados a ser analisao.

required
coluna str

Nome da coluna a ser analisada.

required

Returns:

Name Type Description
coluna str

Nome da coluna.

nome str

nome.

match_count int

Quantidade de correspondencias encontradas.

perc_match_count float

Percentual de correspondencias encontradas.

Source code in identificador_pii/identificador.py
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
def classify_column(self, df, coluna):
    """
    Função que clasifica uma única coluna de um dataframe

    Args:
        df (pandas.DataFrame): Conjunto de dados a ser analisao.
        coluna (str): Nome da coluna a ser analisada.

    Returns:
        coluna (str): Nome da coluna.
        nome (str): nome.
        match_count (int): Quantidade de correspondencias encontradas.
        perc_match_count (float): Percentual de correspondencias encontradas.
    """

    self.load_patterns()
    patterns_to_check = self.patterns

    match_counts = {}
    for pattern in patterns_to_check:
        matches = df[coluna].astype(str).str.match(patterns_to_check[pattern], na=False)
        match_counts[pattern] = matches.sum()

    max_matches_col = max(match_counts, key=match_counts.get)
    max_matches_count = match_counts[max_matches_col]
    max_matches_perc = round((max_matches_count / len(df)),2)


    if df[coluna].dtype == object:
        res = busca_nomes(df, coluna)
        if res[2] > max_matches_count:
            pred = 'nome'
            max_matches_count = res[2]
            max_matches_perc = res[3]
            max_matches_col = 'nome'

    if max_matches_count == 0:
        pred = 'any'
        max_matches_col = ''
    elif max_matches_perc <= .3:
        pred = 'other'
    else:
        pred = max_matches_col

    return [coluna, pred, max_matches_col,max_matches_count,  max_matches_perc]

classify_df(df)

Classifica um dataframe.

Parameters:

Name Type Description Default
df DataFrame

Conjunto de dados a ser analisao.

required

Returns:

Name Type Description
df DataFrame

Dataframe as informações de classificação.

Source code in identificador_pii/identificador.py
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
def classify_df(self, df):
    """
    Classifica um dataframe.

    Args:
        df (pandas.DataFrame): Conjunto de dados a ser analisao.

    Returns:
        df (pandas.DataFrame): Dataframe as informações de classificação.
    """
    preds = []

    for column in df.columns:
        preds.append(self.classify_column(df, column))
    return pd.DataFrame(preds, columns= ['column_name', 'prediction', 'most_matched_pii','match_count', 'match_perc'])

load_patterns()

Carrega os padrões para buscar documentos brasileiros.

Returns:

Name Type Description
dict dict

Dicionário com os padrões regex que serão buscados.

Source code in identificador_pii/identificador.py
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def load_patterns(self) -> dict:
    """
    Carrega os padrões para buscar documentos brasileiros.



    Returns:
        dict: Dicionário com os padrões regex que serão buscados.
    """

    patterns  = {
    'cpf':  r'^\d{11}$|^\d{3}\.\d{3}\.\d{3}-\d{2}$',
    'telefone': r'^\(?\d{2}\)?\s?\d{4,5}-?\d{4}$',
    'cnh': r'^[A-Z]{2}\d{9}$',
    'email':  r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b',
    'nis': r'\b\d{3}\.\d{5}\.\d{2}-\d{1}\b|\b\d{11}\b'
    }

    self.patterns = patterns

remove_pattern(pattern_name)

Função que adiciona um novo padrão regex a ser buscado

Parameters:

Name Type Description Default
pattern_name str

nome que será dado ao novo padrão

required
Source code in identificador_pii/identificador.py
43
44
45
46
47
48
49
50
51
def remove_pattern(self, pattern_name: str):
    """
    Função que adiciona um novo padrão regex a ser buscado

    Args:
        pattern_name (str): nome que será dado ao novo padrão
    """

    self.patterns.pop(pattern_name)