Advertisement
LightProgrammer000

Forensic Plagiarism [python3]

Feb 18th, 2020
622
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.71 KB | None | 0 0
  1. '''
  2. Programa: Evidência forense de plágio
  3. '''
  4.  
  5. # Bibliotecas
  6. import re
  7.  
  8. # Principal
  9. def main():
  10.  
  11.     # Chamada de metodos
  12.     ass_cp = le_assinatura()
  13.     textos = le_textos()
  14.  
  15.     # Chamada de metodo para avaliar textos com plagios
  16.     print("\nO autor do texto {} está infectado com COH-PIAH".format(avalia_textos(textos, ass_cp)))
  17.  
  18. ###################
  19. #     METODOS     #
  20. ###################
  21.  
  22. # Metodo: A funcao le os valores dos tracos linguisticos do modelo
  23. def le_assinatura():
  24.  
  25.     # Apresentacao
  26.     print("Bem-vindo ao detector automático de COH-PIAH.\n\n")
  27.  
  28.     # Entrada de dados
  29.     wal = float(input("Entre o tamanho medio de palavra:"))
  30.     ttr = float(input("Entre a relação Type-Token:"))
  31.     hlr = float(input("Entre a Razão Hapax Legomana:"))
  32.     sal = float(input("Entre o tamanho médio de sentença:"))
  33.     sac = float(input("Entre a complexidade média da sentença:"))
  34.     pal = float(input("Entre o tamanho medio de frase:"))
  35.  
  36.     # Retorno de uma assinatura a ser comparada com os textos fornecidos
  37.     return [wal, ttr, hlr, sal, sac, pal]
  38.  
  39. # Metodo: Leitura de texto
  40. def le_textos():
  41.  
  42.     # Variavel
  43.     i = 1
  44.     textos = []  # Lista
  45.  
  46.     # Entrada de dados
  47.     texto = input("\nDigite o texto " + str(i) + " (aperte enter para sair):")
  48.  
  49.     # Estrutura de repeticao
  50.     while texto:
  51.  
  52.         # Acrescimo de texto
  53.         textos.append(texto)
  54.  
  55.         # Incremento
  56.         i += 1
  57.  
  58.         # Entrada de dados
  59.         texto = input("\nDigite o texto " + str(i) + " (aperte enter para sair):")
  60.  
  61.     # Retorno de lista com texto
  62.     return textos
  63.  
  64. ###################
  65. #     FUNCOES     #
  66. ###################
  67.  
  68. # Funcao: Lista de sentencas
  69. def separa_sentencas(texto):
  70.  
  71.     # Eliminacao pelo sistema de regex
  72.     sentencas = re.split(r'[.!?]+', texto)
  73.  
  74.     # Estrutura de decisao: Elimando posicao vazia
  75.     if sentencas[-1] == '':
  76.  
  77.         # Eliminando posicao
  78.         del sentencas[-1]
  79.  
  80.     # Retorno de uma lista das sentencas dentro do texto
  81.     return sentencas
  82.  
  83. # Funcao: Lista de frases
  84. def separa_frases(sentenca):
  85.  
  86.     # Retorno de uma lista das frases dentro da sentenca
  87.     return re.split(r'[,:;]+', sentenca)
  88.  
  89. # Funcao: Lista de palavras
  90. def separa_palavras(frase):
  91.  
  92.     # Devolve uma lista das palavras dentro da frase
  93.     return frase.split()
  94.  
  95. # Funcao: Lista de palavras unicas
  96. def n_palavras_unicas(lista_palavras):
  97.  
  98.     # Variaveis
  99.     freq = dict()  # Dicionario
  100.     unicas = 0
  101.  
  102.     # Estrutura de repeticao
  103.     for palavra in lista_palavras:
  104.  
  105.         # Palavras minusculas
  106.         p = palavra.lower()
  107.  
  108.         # Estrutura de decisao
  109.         if p in freq:
  110.  
  111.             if freq[p] == 1:
  112.                 unicas -= 1
  113.             freq[p] += 1
  114.  
  115.         else:
  116.             freq[p] = 1
  117.             unicas += 1
  118.  
  119.     # Retorno do numero de palavras que aparecem uma unica vez
  120.     return unicas
  121.  
  122. # Funcao: Lista de palavras diferentes
  123. def n_palavras_diferentes(lista_palavras):
  124.  
  125.     # Dicionario
  126.     freq = dict()
  127.  
  128.     # Estrutura de repeticao
  129.     for palavra in lista_palavras:
  130.  
  131.         # Palavras minusculas
  132.         p = palavra.lower()
  133.  
  134.         # Estrutura de decisao
  135.         if p in freq:
  136.             freq[p] += 1
  137.  
  138.         else:
  139.             freq[p] = 1
  140.  
  141.     # Retorno do numero de palavras diferentes utilizadas
  142.     return len(freq)
  143.  
  144. # Funcao: Calculo da assinatura do texto
  145. def calcula_assinatura(texto):
  146.  
  147.     # Retorno da assinatura do texto
  148.     return [tamanho_medio_de_palavra(texto), relacao_Type_Token(texto), razao_Hapax_Legomana(texto),
  149.             tamanho_medio_de_sentenca(texto), complexidade_de_sentenca(texto), tamanho_medio_de_frase(texto)]
  150.  
  151. # Funcao: Comparacao de assinaturas entre textos
  152. def compara_assinatura(as_a, as_b):
  153.  
  154.     # Variavel
  155.     som = 0
  156.  
  157.     # Estrutura de repeticao
  158.     for i in range(0, 6):
  159.  
  160.         # Calculo
  161.         som += abs(as_a[i] - as_b[i])
  162.  
  163.     # Similaridade
  164.     similaridade = som / 6
  165.  
  166.     # Retorno do grau de similaridade nas assinaturas
  167.     return similaridade
  168.  
  169. # Funcao: Avaliacao de textos
  170. def avalia_textos(textos, ass_cp):
  171.  
  172.     # Lista de textos
  173.     lista_similaridade = []
  174.  
  175.     # Estrutura de repeticao
  176.     for i in range(0, len(textos)):
  177.         as_texto = calcula_assinatura(textos[i])
  178.         grau_similaridade = compara_assinatura(as_texto, ass_cp)
  179.         lista_similaridade.append(grau_similaridade)
  180.  
  181.     # Posicao
  182.     # pos = int(min(lista_similaridade))
  183.     pos = lista_similaridade.index((min(lista_similaridade))) + 1
  184.  
  185.     # Retorno do numero (1 a n) do texto com maior probabilidade de ter sido infectado por COH-PIAH
  186.     # return "\nO autor do texto " + str(pos) + " está infectado com COH-PIAH"
  187.     return pos
  188.  
  189. ####################
  190. #     CALCULOS     #
  191. ####################
  192.  
  193. # Funcao: Tamanho medio de palavra
  194. def tamanho_medio_de_palavra(texto):
  195.  
  196.     return numero_total_de_caractere_palavra(texto) / numero_total_de_palavras(texto)
  197.  
  198. # Funcao: Relacao Type Token
  199. def relacao_Type_Token(texto):
  200.  
  201.     return numero_total_de_palavras_diferentes(texto) / numero_total_de_palavras(texto)
  202.  
  203. # Funcao: Razao_Hapax_Legomana
  204. def razao_Hapax_Legomana(texto):
  205.  
  206.     return numero_total_de_palavras_unicas(texto) / numero_total_de_palavras(texto)
  207.  
  208. # Funcao: Tamanho medio de sentenca
  209. def tamanho_medio_de_sentenca(texto):
  210.  
  211.     return numero_total_de_caractere_sentenca(texto) / numero_total_de_sentencas(texto)
  212.  
  213. # Funcao: Complexidade de sentenca
  214. def complexidade_de_sentenca(texto):
  215.  
  216.     return numero_total_de_frases(texto) / numero_total_de_sentencas(texto)
  217.  
  218. # Funcao: Tamanho medio de frase
  219. def tamanho_medio_de_frase(texto):
  220.  
  221.     return numero_total_de_caractere_frase(texto) / numero_total_de_frases(texto)
  222.  
  223. ###################
  224. #     SUPORTE     #
  225. ###################
  226.  
  227. def numero_total_de_caractere_palavra(texto):
  228.  
  229.     # Numero de frases
  230.     num_car = 0
  231.  
  232.     # Lista de sentencas
  233.     lista_sentenca = separa_sentencas(texto)[:]
  234.  
  235.     # Lista de frases
  236.     lista_frases = []
  237.     for i in lista_sentenca:
  238.         lista_frases += separa_frases(i)
  239.  
  240.     # Lista de palavras
  241.     lista_palavras = []
  242.     for i in lista_frases:
  243.         lista_palavras += separa_palavras(i)
  244.  
  245.     # Soma dos tamanhos das palavras
  246.     for i in lista_palavras:
  247.         num_car += len(i)
  248.  
  249.     return num_car
  250.  
  251. def numero_total_de_caractere_frase(texto):
  252.  
  253.     # Numero de frases
  254.     num_car = 0
  255.  
  256.     # Lista de sentencas
  257.     lista_sentenca = separa_sentencas(texto)[:]
  258.  
  259.     # Lista de frases
  260.     lista_frases = []
  261.     for i in lista_sentenca:
  262.         lista_frases += separa_frases(i)
  263.  
  264.     # Soma total de caracteres
  265.     for i in lista_frases:
  266.         num_car += len(i)
  267.  
  268.     return num_car
  269.  
  270. def numero_total_de_caractere_sentenca(texto):
  271.  
  272.     # Numero de frases
  273.     num_car = 0
  274.  
  275.     # Lista de sentencas
  276.     lista_sentenca = separa_sentencas(texto)[:]
  277.  
  278.     # Soma total de caracteres
  279.     lista_frases = []
  280.     for i in lista_sentenca:
  281.         num_car += len(i)
  282.  
  283.     return num_car
  284.  
  285. def numero_total_de_frases(texto):
  286.  
  287.     lista_sentenca = separa_sentencas(texto)
  288.  
  289.     # Numero de frases
  290.     num_fras = 0
  291.  
  292.     for i in lista_sentenca:
  293.         num_fras += len(separa_frases(i))
  294.  
  295.     return num_fras
  296.  
  297. def numero_total_de_sentencas(texto):
  298.  
  299.     # Lista de sentencas
  300.     lista_sentenca = separa_sentencas(texto)
  301.  
  302.     # Número total de sentenças
  303.     return len(lista_sentenca)
  304.  
  305. def numero_total_de_palavras(texto):
  306.  
  307.     # Lista de sentencas
  308.     lista_sentenca = separa_sentencas(texto)
  309.  
  310.     # Lista de frases
  311.     lista_frases = []
  312.     for i in lista_sentenca:
  313.         lista_frases += separa_frases(i)
  314.  
  315.     # Lista de palavras
  316.     lista_palavras = []
  317.     for i in lista_frases:
  318.         lista_palavras += separa_palavras(i)
  319.  
  320.     num_pal = len(lista_palavras)
  321.  
  322.     return num_pal
  323.  
  324. def numero_total_de_palavras_unicas(texto):
  325.  
  326.     # Lista de sentencas
  327.     lista_sentenca = separa_sentencas(texto)
  328.  
  329.     # Lista de frases
  330.     lista_frases = []
  331.     for i in lista_sentenca:
  332.         lista_frases += separa_frases(i)
  333.  
  334.     # Lista de palavras
  335.     lista_palavras = []
  336.     for i in lista_frases:
  337.         lista_palavras += separa_palavras(i)
  338.  
  339.     # Numero de palavras unicas
  340.     return n_palavras_unicas(lista_palavras)
  341.  
  342. def numero_total_de_palavras_diferentes(texto):
  343.  
  344.     # Lista de sentencas
  345.     lista_sentenca = separa_sentencas(texto)
  346.  
  347.     # Lista de frases
  348.     lista_frases = []
  349.     for i in lista_sentenca:
  350.         lista_frases += separa_frases(i)
  351.  
  352.     # Lista de palavras
  353.     lista_palavras = []
  354.     for i in lista_frases:
  355.         lista_palavras += separa_palavras(i)
  356.  
  357.     # Numero de palavras unicas
  358.     return n_palavras_diferentes(lista_palavras)
  359.  
  360. # Execucao
  361. if __name__ == '__main__':
  362.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement