Skip to content

Instantly share code, notes, and snippets.

@gerep
Last active January 21, 2022 20:21
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gerep/dedd08a88327a2a070b62eee5f4d8ae5 to your computer and use it in GitHub Desktop.
Save gerep/dedd08a88327a2a070b62eee5f4d8ae5 to your computer and use it in GitHub Desktop.
import re
def le_assinatura():
'''A funcao le os valores dos tracos linguisticos do modelo e devolve uma assinatura a ser comparada com os textos fornecidos'''
print("Bem-vindo ao detector automático de COH-PIAH.")
wal = float(input("Entre o tamanho medio de palavra:"))
ttr = float(input("Entre a relação Type-Token:"))
hlr = float(input("Entre a Razão Hapax Legomana:"))
sal = float(input("Entre o tamanho médio de sentença:"))
sac = float(input("Entre a complexidade média da sentença:"))
pal = float(input("Entre o tamanho medio de frase:"))
return [wal, ttr, hlr, sal, sac, pal]
def le_textos():
i = 1
textos = []
texto = input("Digite o texto " + str(i) +" (aperte enter para sair):")
while texto:
textos.append(texto)
i += 1
texto = input("Digite o texto " + str(i) +" (aperte enter para sair):")
return textos
def separa_sentencas(texto):
'''A funcao recebe um texto e devolve uma lista das sentencas dentro do texto'''
sentencas = re.split(r'[.!?]+', texto)
if sentencas[-1] == '':
del sentencas[-1]
return sentencas
def separa_frases(sentenca):
'''A funcao recebe uma sentenca e devolve uma lista das frases dentro da sentenca'''
return re.split(r'[,:;]+', sentenca)
def separa_palavras(frase):
'''A funcao recebe uma frase e devolve uma lista das palavras dentro da frase'''
return frase.split()
def n_palavras_unicas(lista_palavras):
'''Essa funcao recebe uma lista de palavras e devolve o numero de palavras que aparecem uma unica vez'''
freq = dict()
unicas = 0
for palavra in lista_palavras:
p = palavra.lower()
if p in freq:
if freq[p] == 1:
unicas -= 1
freq[p] += 1
else:
freq[p] = 1
unicas += 1
return unicas
def n_palavras_diferentes(lista_palavras):
'''Essa funcao recebe uma lista de palavras e devolve o numero de palavras diferentes utilizadas'''
freq = dict()
for palavra in lista_palavras:
p = palavra.lower()
if p in freq:
freq[p] += 1
else:
freq[p] = 1
return len(freq)
def compara_assinatura(as_a, as_b):
'''IMPLEMENTAR. Essa funcao recebe duas assinaturas de texto e deve devolver o grau de
similaridade nas assinaturas.'''
# Sab=∑i=16||fi,a−fi,b||6
somatoria = 0
for traco_linguistico in range(len(as_a)):
somatoria = somatoria + abs(as_a[traco_linguistico] - as_b[traco_linguistico])
return somatoria / 6
def calcula_assinatura(texto):
'''IMPLEMENTAR. Essa funcao recebe um texto e deve devolver a assinatura do texto.'''
sentencas = separa_sentencas(texto)
lista_frases = []
for s in sentencas:
frases_separadas = separa_frases(s)
# separa_frases retorna um item de lista para cada sentença
# e esses itens são unidos em uma única lista, frases
for frases in frases_separadas:
lista_frases.append(frases)
lista_palavras = []
for f in lista_frases:
palavras_separadas = separa_palavras(f)
for palavras in palavras_separadas:
lista_palavras.append(palavras)
assinatura = []
assinatura.append(tamanho_medio_palavras(lista_palavras))
assinatura.append(relacao_type_token(lista_palavras))
assinatura.append(razao_hapax_legomana(lista_palavras))
assinatura.append(tamanho_medio_de_sentenca(sentencas))
assinatura.append(complexidade_de_sentenca(lista_frases, sentencas))
assinatura.append(tamanho_medio_de_frase(lista_frases))
return assinatura
def avalia_textos(textos, ass_cp):
'''IMPLEMENTAR. Essa funcao recebe uma lista de textos e deve devolver o numero (1 a n)
do texto com maior probabilidade de ter sido infectado por COH-PIAH.'''
valor = ass_cp[0]
for x in range(len(ass_cp)):
if ass_cp[x] < valor:
valor = ass_cp[x]
indice = x
return indice
# Tamanho médio de palavra é a soma dos tamanhos das palavras dividida pelo número total de palavras:
def tamanho_medio_palavras(palavras):
tamanho_das_palavras = 0
total_de_palavras = len(palavras)
for palavra in palavras:
tamanho_das_palavras = tamanho_das_palavras + len(palavra)
return tamanho_das_palavras/total_de_palavras
# Relação Type-Token é o número de palavras diferentes dividido pelo número total de palavras.
def relacao_type_token(palavras):
return n_palavras_diferentes(palavras) / len(palavras)
# Razão Hapax Legomana é o número de palavras que aparecem uma única vez dividido pelo total de palavras.
def razao_hapax_legomana(palavras):
return n_palavras_unicas(palavras) / len(palavras)
# Tamanho médio de sentença é a soma dos números de caracteres em todas as sentenças dividida pelo número
# de sentenças (os caracteres que separam uma sentença da outra não devem ser contabilizados como parte da sentença).
def tamanho_medio_de_sentenca(sentencas):
caracteres_sentenca = 0
for sentenca in sentencas:
caracteres_sentenca = caracteres_sentenca + len(sentenca)
return caracteres_sentenca / len(sentencas)
# Complexidade de sentença é o número total de frases divido pelo número de sentenças.
def complexidade_de_sentenca(lista_frases, sentencas):
return len(lista_frases) / len(sentencas)
# Tamanho médio de frase é a soma do número de caracteres em cada frase dividida pelo
# número de frases no texto (os caracteres que separam uma frase da outra não devem ser contabilizados como parte da frase).
def tamanho_medio_de_frase(lista_frases):
caracteres_frase = 0
for frases in lista_frases:
caracteres_frase = caracteres_frase + len(frases)
return caracteres_frase / len(lista_frases)
def main():
assinatura_principal = le_assinatura()
textos = le_textos()
assinaturas = []
for texto in textos:
assinaturas.append(calcula_assinatura(texto))
assinaturas_comparadas = []
for assinatura in assinaturas:
assinaturas_comparadas.append(compara_assinatura(assinatura_principal, assinatura))
infectado = avalia_textos(textos, assinaturas_comparadas)
print("O autor do texto", infectado, "está infectado com COH-PIAH.")
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment