Clasificación de Documentos de Texto usando el enfoque de Naïve Bayes

Este artículo tiene como objetivo implementar la clasificación de documentos usando Naïve Bayes usando python.

Implementación paso a paso:

Paso 1:

  • Ingrese el número total de documentos del usuario.
  • Ingrese el texto y la clase de cada documento y divídalo en una lista.
  • Cree una array 2D y agregue cada lista de documentos a una array.
  • Usando una estructura de datos Set, almacene todas las palabras clave en una lista.
  • Introduzca el texto a clasificar por el usuario.

Python3

print('\n *-----* Classification using Naïve bayes *-----* \n')
total_documents = int(input("Enter the Total Number of documents: "))
doc_class = []
i = 0
keywords = []
while not i == total_documents:
    doc_class.append([])
    text = input(f"\nEnter the text of Doc-{i+1} : ").lower()
    clas = input(f"Enter the class of Doc-{i+1} : ")
    doc_class[i].append(text.split())
    doc_class[i].append(clas)
    keywords.extend(text.split())
    i = i+1
keywords = set(keywords)
keywords = list(keywords)
keywords.sort()
to_find = input("\nEnter the Text to classify using Naive Bayes: ").lower().split()

Paso 2:

  • Cree una lista vacía llamada «probability_table».
  • Cuente todas las apariciones de todas las palabras clave en cada documento y guárdelas en la lista «probability_table».

Python3

probability_table = []
for i in range(total_documents):
    probability_table.append([])
    for j in keywords:
        probability_table[i].append(0)
doc_id = 1
for i in range(total_documents):
    for k in range(len(keywords)):
        if keywords[k] in doc_class[i][0]:
            probability_table[i][k] += doc_class[i][0].count(keywords[k])
print('\n')

Paso 3:

  • Importe una tabla bonita para mostrar la lista «probability_table» en un formato tabular ordenado.
  • Dar el título de la Tabla como ‘Probabilidad de Documentos’
  • Imprime la tabla.

Python3

import prettytable
keywords.insert(0, 'Document ID')
keywords.append("Class")
Prob_Table = prettytable.PrettyTable()
Prob_Table.field_names = keywords
Prob_Table.title = 'Probability of Documents'
x=0
for i in probability_table:
    i.insert(0,x+1)
    i.append(doc_class[x][1])
    Prob_Table.add_row(i)
    x=x+1
print(Prob_Table)
print('\n')
for i in probability_table:
    i.pop(0)

Paso 4:

  • Cuente el número de palabras totales que pertenecen a la clase ‘+’.
  • Cuente el número de palabras totales que pertenecen a la clase ‘-‘.
  • Cuente el número de documentos totales que pertenecen a la clase ‘+’.
  • Cuente el número de documentos totales que pertenecen a la clase ‘-‘.

Python3

totalpluswords=0
totalnegwords=0
totalplus=0
totalneg=0
vocabulary=len(keywords)-2
for i in probability_table:
    if i[len(i)-1]=="+":
        totalplus+=1
        totalpluswords+=sum(i[0:len(i)-1])
    else:
        totalneg+=1
        totalnegwords+=sum(i[0:len(i)-1])
keywords.pop(0)
keywords.pop(len(keywords)-1)

Paso-5:

  • Para superar el problema de frecuencia cero, utilice la siguiente fórmula para encontrar la probabilidad final de clasificar cada palabra presente en el texto.

P(Palabra/Clase) = (Núm. de ocurrencias de palabra en clase+1) / (Número total de palabras presentes en clase + Total de palabras clave)

  • Formatee la probabilidad de cada palabra con una precisión de 4 dígitos.
     

Python3

#For positive class
temp=[]
for i in to_find:
    count=0
    x=keywords.index(i)
    for j in probability_table:
        if j[len(j)-1]=="+":
            count=count+j[x]
    temp.append(count)
    count=0
for i in range(len(temp)):
    temp[i]=format((temp[i]+1)/(vocabulary+totalpluswords),".4f")
print()
temp=[float(f) for f in temp]
print("Probabilities of Each word to be in '+' class are: ")
h=0
for i in to_find:
    print(f"P({i}/+) = {temp[h]}")
    h=h+1
print()

Paso-6:

  • Encuentre la probabilidad final de Cada clase usando la fórmula de Naïve Bayes.
  • Formatee el resultado final con una precisión de 8 dígitos.

Python3

pplus=float(format((totalplus)/(totalplus+totalneg),".8f"))
for i in temp:
    pplus=pplus*i
pplus=format(pplus,".8f")
print("probability of Given text to be in '+' class is :",pplus)
print()

Paso-7:

  • Realice también los pasos 5 y 6 para las clases negativas.

Python3

#For Negative class
temp=[]
for i in to_find:
    count=0
    x=keywords.index(i)
    for j in probability_table:
        if j[len(j)-1]=="-":
            count=count+j[x]
    temp.append(count)
    count=0
for i in range(len(temp)):
    temp[i]=format((temp[i]+1)/(vocabulary+totalnegwords),".4f")
print()
temp=[float(f) for f in temp]
print("Probabilities of Each word to be in '-' class are: ")
h=0
for i in to_find:
    print(f"P({i}/-) = {temp[h]}")
    h=h+1
print()
pneg=float(format((totalneg)/(totalplus+totalneg),".8f"))
for i in temp:
    pneg=pneg*i
pneg=format(pneg,".8f")
print("probability of Given text to be in '-' class is :",pneg)
print('\n')

Paso-8:

  • Compara las probabilidades finales de ambas clases.
  • Imprime el resultado final.

Python3

if pplus>pneg:
    print(f"Using Naive Bayes Classification, We can clearly say that the given text belongs to '+' class with probability {pplus}")
else:
    print(f"Using Naive Bayes Classification, We can clearly say that the given text belongs to '-' class with probability {pneg}")
print('\n')

A continuación se muestra la implementación completa:

Python3

print('\n *-----* Classification using Naïve bayes *-----* \n')
total_documents = int(input("Enter the Total Number of documents: "))
doc_class = []
i = 0
keywords = []
while not i == total_documents:
    doc_class.append([])
    text = input(f"\nEnter the text of Doc-{i+1} : ").lower()
    clas = input(f"Enter the class of Doc-{i+1} : ")
    doc_class[i].append(text.split())
    doc_class[i].append(clas)
    keywords.extend(text.split())
    i = i+1
keywords = set(keywords)
keywords = list(keywords)
keywords.sort()
to_find = input("\nEnter the Text to classify using Naive Bayes: ").lower().split()
  
probability_table = []
for i in range(total_documents):
    probability_table.append([])
    for j in keywords:
        probability_table[i].append(0)
doc_id = 1
for i in range(total_documents):
    for k in range(len(keywords)):
        if keywords[k] in doc_class[i][0]:
            probability_table[i][k] += doc_class[i][0].count(keywords[k])
print('\n')
import prettytable
keywords.insert(0, 'Document ID')
keywords.append("Class")
Prob_Table = prettytable.PrettyTable()
Prob_Table.field_names = keywords
Prob_Table.title = 'Probability of Documents'
x=0
for i in probability_table:
    i.insert(0,x+1)
    i.append(doc_class[x][1])
    Prob_Table.add_row(i)
    x=x+1
print(Prob_Table)
print('\n')
for i in probability_table:
    i.pop(0)
totalpluswords=0
totalnegwords=0
totalplus=0
totalneg=0
vocabulary=len(keywords)-2
for i in probability_table:
    if i[len(i)-1]=="+":
        totalplus+=1
        totalpluswords+=sum(i[0:len(i)-1])
    else:
        totalneg+=1
        totalnegwords+=sum(i[0:len(i)-1])
keywords.pop(0)
keywords.pop(len(keywords)-1)
#For positive class
temp=[]
for i in to_find:
    count=0
    x=keywords.index(i)
    for j in probability_table:
        if j[len(j)-1]=="+":
            count=count+j[x]
    temp.append(count)
    count=0
for i in range(len(temp)):
    temp[i]=format((temp[i]+1)/(vocabulary+totalpluswords),".4f")
print()
temp=[float(f) for f in temp]
print("Probabilities of Each word to be in '+' class are: ")
h=0
for i in to_find:
    print(f"P({i}/+) = {temp[h]}")
    h=h+1
print()
pplus=float(format((totalplus)/(totalplus+totalneg),".8f"))
for i in temp:
    pplus=pplus*i
pplus=format(pplus,".8f")
print("probability of Given text to be in '+' class is :",pplus)
print()
#For Negative class
temp=[]
for i in to_find:
    count=0
    x=keywords.index(i)
    for j in probability_table:
        if j[len(j)-1]=="-":
            count=count+j[x]
    temp.append(count)
    count=0
for i in range(len(temp)):
    temp[i]=format((temp[i]+1)/(vocabulary+totalnegwords),".4f")
print()
temp=[float(f) for f in temp]
print("Probabilities of Each word to be in '-' class are: ")
h=0
for i in to_find:
    print(f"P({i}/-) = {temp[h]}")
    h=h+1
print()
pneg=float(format((totalneg)/(totalplus+totalneg),".8f"))
for i in temp:
    pneg=pneg*i
pneg=format(pneg,".8f")
print("probability of Given text to be in '-' class is :",pneg)
print('\n')
if pplus>pneg:
    print(f"Using Naive Bayes Classification, We can clearly say that the given text belongs to '+' class with probability {pplus}")
else:
    print(f"Using Naive Bayes Classification, We can clearly say that the given text belongs to '-' class with probability {pneg}")
print('\n')

Captura de pantalla de salida:

 

 

 

Publicación traducida automáticamente

Artículo escrito por kothavvsaakash y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *