Spanlp
spanlp: nlp applied for spanish vulgarity. A fast, robust Python library to check for profanity or offensive language in Spanish strings. It contains all the rude words of Spanish-speaking countries.
Install / Use
/learn @jfreddypuentes/SpanlpREADME
Indice
- Indice
- Sobre la librería
- Casos de uso
- Status Desarrollo
- Instalación
- Funcionamiento
- Testing
- Reportar un bug
- Contribuidorxs
- Contacto
Sobre la librería
spanlp es una librería escrita en Python para detección de groserías, vulgaridades, palabras de odio, racismo, xenofobia y bullying en textos escritos en Español. Puedes usar la librería y aplicarla a palabras de cualquiera de los más de 20 paises de habla hispana.
Incluye:
- Argentina 🇦🇷
- Bolivia 🇧🇴
- Chile 🇨🇱
- Colombia 🇨🇴
- Costa Rica 🇨🇷
- Cuba 🇨🇺
- Ecuador 🇪🇨
- El Salvador 🇸🇻
- España 🇪🇸
- Guatemala 🇬🇹
- Guinea Ecuatorial 🇬🇶
- Honduras 🇭🇳
- México 🇲🇽
- Nicaragua 🇳🇮
- Panamá 🇵🇦
- Paraguay 🇵🇾
- Perú 🇵🇪
- Puerto Rico 🇵🇷
- República Dominicana 🇩🇴
- Uruguay 🇺🇾
- Venezuela 🇻🇪
Casos de uso
- Censurar vulgaridades en un texto.
- Detectar y censurar vulgaridades en una sala de chat en linea.
- Encontrar y censurar frases y palabras de odio, racismo, xenofia, bullying. (Se deben incluir como parámetros)
- Censurar comentarios groseros o insultos en algún blog o aplicación web o sitio web.
- Censurar malas palabras en un sistema de recolección de opiniones, sugerencias, quejas y reclamos.
- Limpiar textos antes de ser publicados.
- Detectar y eliminar vulgaridades en textos que serán leidos y/o vistos por niños.
- Limpiar una base de datos con mucho texto.
Status Desarrollo
| Funcionalidad | Desarrollo | Pruebas | Release |
|-----------------------------------|------------|-------------|-----------
| Soporte de tokens con números | ✓ | ✓ | v0.0.5 |
| Estrategias de limpieza de datos | ✓ | ✓ | v0.0.5 |
| Completar dataset | ✓ | ✓ | v1.0.1 |
| Hamming | ✓ | ✓ | v1.0.2 |
| Levenstein | ✓ | ✓ | v1.1.0 |
| Bag distance | - | | - |
| Sorensen-Dice coefficient | - | | - |
| Tversky index | - | | - |
| Overlap index | - | | - |
| Tanimoto distance | - | | - |
| Ampliación datasets | Progreso | - | - |
| % de palabrotas en el texto | - | - | - |
Instalación
Para instalar la última versión use:
pip install spanlp
Para instalar una versión específica use (por ejemplo):
pip install spanlp==1.1.0
Funcionamiento
Los algoritmos y modulos se personalizan de forma dinámica y muy flexible. Veamos algunos usos.
Uso básico
Validar si una palabra o frase contiene o no una palabrota:
from spanlp.palabrota import Palabrota
palabrota = Palabrota()
print(palabrota.contains_palabrota("Hola huevon cómo está?"))
# salida: True
from spanlp.palabrota import Palabrota
palabrota = Palabrota()
print(palabrota.contains_palabrota("Hola a todos ¿cómo están?"))
# salida: False
Censurar una frase con los parámetros por defecto:
from spanlp.palabrota import Palabrota
palabrota = Palabrota()
print(palabrota.censor("Hola huevon cómo está?"))
# salida: Hola !$%#@! cómo está?
Censurar la misma frase, configurando carácteres propios
from spanlp.palabrota import Palabrota
palabrota = Palabrota(censor_char="*")
print(palabrota.censor("Hola huevon como está?"))
# salida: Hola ****** cómo está?
Censurar otra frase, configurando carácteres propios y país
from spanlp.palabrota import Palabrota
from spanlp.domain.countries import Country
palabrota = Palabrota(censor_char="@", countries=[Country.COLOMBIA, Country.VENEZUELA])
print(palabrota.censor("Hola huevon marico cómo está?"))
# salida: Hola @@@@@@ @@@@@@ cómo está?
Censuremos la misma frase pero solo con el país de Venezuela
from spanlp.palabrota import Palabrota
from spanlp.domain.countries import Country
palabrota = Palabrota(censor_char="@", countries=[Country.VENEZUELA])
print(palabrota.censor("Hola huevon marico cómo está?"))
# salida: Hola huevon @@@@@@ cómo está?
Censuremos la misma frase pero incluyendo "huevon" al vocabulario de Venezuela
from spanlp.palabrota import Palabrota
from spanlp.domain.countries import Country
palabrota = Palabrota(censor_char="@", countries=[Country.VENEZUELA], include=["huevon"])
print(palabrota.censor("Hola huevon marico cómo está?"))
# salida: Hola @@@@@@ @@@@@@ cómo está?
Censuremos la misma frase incluyendo "huevon" al vocabulario de Venezuela y excluyendo "marico"
from spanlp.palabrota import Palabrota
from spanlp.domain.countries import Country
palabrota = Palabrota(censor_char="@", countries=[Country.VENEZUELA], include=["huevon"], exclude=["marico"])
print(palabrota.censor("Hola huevon marico cómo está?"))
# salida: Hola huevon marico cómo está?
Censuremos la misma frase incluyendo ""Hola" y "huevon" al vocabulario de Venezuela y excluyendo "marico"
from spanlp.palabrota import Palabrota
from spanlp.domain.countries import Country
palabrota = Palabrota(censor_char="-", countries=[Country.VENEZUELA], include=["huevon"], exclude=["marico"])
print(palabrota.censor("Hola huevon marico cómo está?"))
# salida: ---- ---- marico cómo está?
Uso Avanzado
El uso avanzado incluye usar metricas de distancia y similitud para encontrar, comparar, censurar palabras. Estas son las metricas usadas a la fecha:
- ES-Indice de Jaccard (EN-Jaccard Index)
- ES-Similitud del coseno (EN-Cosine Similarity)
- ES-Levenshtein(EN-Levenshtein)
- ES-Damerau-Levenshtein(EN-Damerau-Levenshtein)
Censuremos la frase usando Cosine Similarity
from spanlp.palabrota import Palabrota
from spanlp.domain.countries import Country
from spanlp.domain.strategies import CosineSimilarity
palabrota = Palabrota(censor_char="*", countries=[Country.VENEZUELA], distance_metric=CosineSimilarity())
print(palabrota.censor("Hola huevo maric cómo está?"))
# salida: Hola huevo ***** cómo está?
A pesar de que "maric" no está en el dataset, al algoritmo la censuró dado que por la métrica de distancia es muy similar.
Censuremos la frase usando Cosine Similarity manipulando los parámetros
from spanlp.palabrota import Palabrota
from spanlp.domain.countries import Country
from spanlp.domain.strategies import CosineSimilarity
# Indicamos que tenga en cuenta palabras similares en al menos 30% y que normalice los datos (poner en minusculas, remover acentos)
cosine = CosineSimilarity(0.9, normalize=True)
palabrota = Palabrota(censor_char="*", countries=[Country.VENEZUELA], distance_metric=cosine)
print(palabrota.censor("Hola huevon MARIC cómo está?"))
# salida: hola huevon ***** **** esta? => Censuró "como" porque en el dataset está "cono" y son similares en más del 90%
Censuremos la frase usando JaccardIndex con los parámetros por defecto
from spanlp.palabrota import Palabrota
from spanlp.domain.countries import Country
from spanlp.domain.strategies import JaccardIndex
palabrota = Palabrota(censor_char="*", countries=[Country.VENEZUELA], distance_metric=JaccardIndex())
print(palabrota.censor("Hola huevo maric cómo está?"))
# salida: Hola huevo ***** cómo está?
El indice de Jaccard usa por defecto los siguientes parámetros:
threshold=0.8- Indica que censurará palabras con una similitud del 80% o más.normalize=False- False indica que no pasará el texto a minuscula y no removerá acentos.n_gram=2- Usa 2 subsecuencias de la palabra. (Ver N-grama)
Censuremos la frase usando JaccardIndex y modifiquemos los parámetros
from spanlp.palabrota import Palabrota
from spanlp.domain.countries import Country
from spanlp.domain.strategies import JaccardIndex
jaccard = JaccardIndex(threshold=0.9, normalize=True, n_gram=1)
pal
