Python机器学习NLP自然语言处理基本操作家暴归类

目录
  • 概述
  • 数据介绍
  • 词频统计
  • 朴素贝叶斯
  • 代码实现
    • 预处理
    • 主函数

概述

从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁.

数据介绍

该数据是家庭暴力的一份司法数据.分为 4 个不同类别: 报警人被老公打,报警人被老婆打,报警人被儿子打,报警人被女儿打. 今天我们就要运用我们前几次学到的知识, 来实现一个 NLP 分类问题.

词频统计

CountVectorizer是一个文本特征提取的方法. 可以帮助我们计算每种词汇在该训练文本中出现的频率, 以获得词频矩阵.

格式:

vec = CountVectorizer(
        analyzer="word",
        max_features=4000
    )

参数:

analyzer: 对语料进行 “word” 或 “char” 分析

max_features: 最大关键词集

方法列表

作用fit()拟合transform()返回词频统计矩阵

朴素贝叶斯

MultinomialNB多项式朴素贝叶斯, 是一种非常常见的分类方法.

公式:

 P(B|A) = P(B)*P(A|B)/P(A)

例子:

假设北京冬天堵车的概率是 80% P(B) = 0.8
假设北京冬天下雪的概率是 10% P(A) = 0.1
如果某一天堵车,下雪的概率是 10%, P(A|B) = 0.1
我们就可以得到P(B|A)= P(B)堵车的概率0.8 * P(A|B),如果某一天堵车,下雪的概率 0.1
除以P(A) 下雪的概率 = 0.1,等到0.8
也就是说如果北京冬天某一天下雪,那么有80%可能性当天会堵车

代码实现

预处理

import random
import jieba
import pandas as pd
def load_data():
    """
    加载数据, 进行基本转换
    :return: 老公, 老婆, 儿子, 女儿 (家暴数据)
    """
    # 加载停用词
    stopwords = pd.read_csv('data/stopwords.txt', index_col=False, quoting=3, sep="\t", names=['stopword'],
                            encoding='utf-8')
    stopwords = stopwords['stopword'].values
    print(stopwords, len(stopwords))
    # 加载语料
    laogong_df = pd.read_csv("data/beilaogongda.csv", encoding="utf-8", sep=",")
    laopo_df = pd.read_csv("data/beilaopoda.csv", encoding="utf-8", sep=",")
    erzi_df = pd.read_csv("data/beierzida.csv", encoding="utf-8", sep=",")
    nver_df = pd.read_csv("data/beinverda.csv", encoding="utf-8", sep=",")
    # 去除nan
    laogong_df.dropna(inplace=True)
    laopo_df.dropna(inplace=True)
    erzi_df.dropna(inplace=True)
    nver_df.dropna(inplace=True)
    # 转换
    laogong = laogong_df.segment.values.tolist()
    laopo = laopo_df.segment.values.tolist()
    erzi = erzi_df.segment.values.tolist()
    nver = nver_df.segment.values.tolist()
    # 调试输出
    print(laogong[:5])
    print(laopo[:5])
    print(erzi[:5])
    print(nver[:5])
    return laogong, laopo, erzi, nver, stopwords
def pre_process_data(content_lines, category, stop_words):
    """
    数据预处理
    :param content_lines: 语料
    :param category: 分类
    :param stop_words: 停用词
    :return: 预处理完的数据
    """
    # 存放结果
    sentences = []
    # 遍历
    for line in content_lines:
        try:
            segs = jieba.lcut(line)
            segs = [v for v in segs if not str(v).isdigit()]  # 去除数字
            segs = list(filter(lambda x: x.strip(), segs))  # 去除左右空格
            segs = list(filter(lambda x: len(x) > 1, segs))  # 长度为1的字符
            segs = list(filter(lambda x: x not in stop_words, segs))  # 去除停用词
            result = (" ".join(segs), category)  # 空格拼接
            sentences.append(result)
        except Exception:
            # 打印错误行
            print(line)
            continue
    return sentences
def pre_process():
    """
    数据预处理主函数
    :return: 返回预处理好的语料 (分词 + 标注)
    """
    # 读取数据
    laogong, laopo, erzi, nver, stop_words = load_data()
    # 预处理
    laogong = pre_process_data(laogong, 0, stop_words)
    laopo = pre_process_data(laopo, 1, stop_words)
    erzi = pre_process_data(erzi, 2, stop_words)
    nver = pre_process_data(nver, 3, stop_words)
    # 调试输出
    print(laogong[:2])
    print(laopo[:2])
    print(erzi[:2])
    print(nver[:2])
    # 拼接
    result = laogong + laopo + erzi + nver
    return result
if __name__ == '__main__':
    pre_process()

主函数

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from pre_peocessing import pre_process
def main(sentences):
    """主函数"""
    # 实例化
    vec = CountVectorizer(
        analyzer="word",
        max_features=4000
    )
    # 取出语料和标签
    x, y = zip(*sentences)
    # 分割数据集
    X_train, X_test, y_train, y_test = train_test_split(x, y, random_state=0)
    # 转换为词袋模型
    vec.fit(X_train)
    print(vec.get_feature_names())
    # 实例化朴素贝叶斯
    classifier = MultinomialNB()
    classifier.fit(vec.transform(X_train), y_train)
    # 预测
    y_predit = classifier.predict(vec.transform(X_test))
    # print(y_predit)
    # print(y_test)
    # 计算准确率
    score = classifier.score(vec.transform(X_test), y_test)
    print(score)
if __name__ == '__main__':
    data = pre_process()
    main(data)

输出结果:

['!' '"' '#' ... '450' '22549' '22544'] 2627
['报警人被老公打,请民警到场处理。', '看到上址女子被老公打  持刀 需要救护 (已通知120,如民警到场不需要,请致电120或110)请民警带好必要的防护设备,并且注意自身安全。', '报警人被老公打,醉酒持刀,(请民警携带必要个人防护装备到场处理,并注意自身安全。)', '报警人被老公打,对方人在,无需救护,请民警到场处理。', '报警人称 被老公打 1人伤 无需120 请民警到场处理。']
['报警人称被妻子打,未持械,人伤,无需120,妻子在场,请民警注意自身安全,请民警到场处理。', '家暴,称被其老婆打了,无持械,1人伤无需救护,请民警到场处理。', '报警人被老婆打,持械,无人伤,请民警到场处理,并注意自身安全。', '家庭纠纷报警人被老婆打 无需救护,请民警到场处理。', '闹离婚引发被老婆打,无持械,人无伤,请民警到场处理。']
['报警人被儿子打,无人伤,请民警到场处理。', '报警人称被儿子打 请民警到场处理。(内线:22649)', '报警人被儿子打 无人伤,无持械, 请民警携带必要防护装备并注意自身安全。', '报警人被儿子打,请民警到场处理', '报警人称被儿子打,人轻伤(一人伤),无持械。请民警携带必要的防护设备,并注意自身安全 请民警到场处理。']
['报警人称 被女儿打,1人伤 无需120,请民警到场处理。', '报警人被女儿打,因家庭纠纷,对方离开,请民警携带必要的防护设备,并注意自身安全。', '报警人被女儿打,无持械,请民警到场处理。', '报警人称被女儿打,无持械,人无事,请民警到场处理。请携带必要的防护装备,并请注意自身安全。', '报警人称其老婆被女儿打,无持械,人未伤,请民警到场处理。']
[('报警 老公 民警 到场', 0), ('上址 老公 持刀 救护 通知 民警 到场 致电 民警 防护 设备', 0)]
[('报警 人称 妻子 持械 人伤 无需 妻子 在场 民警 民警 到场', 1), ('家暴 老婆 持械 人伤 无需 救护 民警 到场', 1)]
[('报警 儿子 无人 民警 到场', 2), ('报警 人称 儿子 民警 到场', 2)]
[('报警 人称 女儿 人伤 无需 民警 到场', 3), ('报警 女儿 家庭 纠纷 离开 民警 携带 防护 设备', 3)]
['aa67c3', 'q5', '一人', '一人伤', '一名', '一拳', '一楼', '一辆', '丈夫', '上址', '不上', '不住', '不倒翁', '不明', '不清', '不用', '不行', '不让', '不详', '不通', '不需', '东西', '中断', '中有', '中称', '丰路', '乒乓', '九亭', '九泾路', '争吵', '亚美尼亚人', '人代报', '人伤', '人借', '人头', '人手', '人无事', '人无伤', '人未伤', '人称', '人系', '代为', '代报', '休假', '伤及', '住户', '保安', '保温瓶', '做好', '催促', '催问', '儿子', '儿称', '充电器', '公交车站', '公分', '公路', '关在', '关机', '其称', '其近', '具体地址', '冲突', '几天', '凳子', '出血', '出轨', '分处', '分局', '分已', '分所处', '分钟', '刚刚', '到场', '前妻', '剪刀', '割伤', '加拿大', '区划', '医治', '医院', '十一', '卧室', '卫生局', '去过', '又称', '反打', '反锁', '发生', '受伤', '变更', '口角', '口齿不清', '后往', '告知', '咬伤', '咱不需', '啤酒瓶', '喉咙', '喊救命', '喜泰路', '喝酒', '嘴唇', '回到', '回去', '回家', '回来', '在场', '在家', '地上', '地址', '坐在', '处置', '处警', '夏梦霭', '外伤', '外国人', '外面', '多岁', '大桥', '大理石', '大碍', '夫妻', '头上', '头伤', '头晕', '头痛', '头部', '奥迪', '女儿', '妇女', '妈妈', '妹妹', '妻子', '威胁', '婚外情', '婴儿', '媳妇', '孙女', '孤老', '定位', '家中', '家庭', '家庭成员', '家庭暴力', '家暴', '家门', '对峙', '对象', '将门', '小区', '小姑', '小孩', '尾号', '居委', '居委会', '居民', '岳母', '工作', '工作人员', '工具', '工号', '已处', '市场', '并称', '座机', '开门', '异地', '弄口', '引发', '弟弟', '当事人', '得知', '必备', '怀孕', '急救车', '情况', '情况不明', '情绪', '情节', '成功', '手上', '手持', '手指', '手机', '手机号', '手痛', '手部', '手里', '打人', '打伤', '打倒', '打其', '打打', '打架', '打死', '打电话', '打破', '打耳光', '打请', '扫帚', '抓伤', '报称', '报警', '担子', '拖鞋', '拦不住', '拿出', '拿到', '拿尺', '拿长', '拿鞋', '持刀', '持械', '持续', '持饭', '掐着', '接电话', '控制', '措施', '携带', '放下', '放到', '救命', '救护', '救护车', '无人', '无碍', '无需', '早上', '昨天', '暂时', '有伤', '有刀', '木棍', '杀人', '村里', '来电', '杯子', '松江', '桌上', '梅陇', '棍子', '棒头', '椅子', '楼上', '榔头', '此警', '武器', '武器装备', '残疾人', '母亲', '母子', '毛巾', '民警', '水壶', '水果刀', '求助', '沈杨', '没事', '沪牌', '注意安全', '活动室', '派出所', '流血', '浦东', '激动', '烟缸', '烧纸', '照片', '爬不起来', '父亲', '父女', '牙齿', '物业公司', '物品', '玩具', '现人', '现刀', '现场', '现称', '现要', '现跑', '玻璃', '瓶子', '用具', '用脚', '电告', '电线', '电视机', '电话', '疑似', '疾病', '白色', '皮带', '盒子', '相关', '看不见', '眼睛', '矛盾', '砍刀', '砸坏', '确认', '离去', '离婚', '离开', '离异', '称其', '称属', '称有', '称现', '称要', '稍后', '窗口', '竹棍', '等候', '等同', '筷子', '精神', '精神病', '纠纷', '经济纠纷', '翟路', '翟路纪', '老人', '老伯伯', '老伴', '老公', '老北', '老大爷', '老太', '老太太', '老头', '老婆', '老年', '联系电话', '肋骨', '肯德基', '脖子', '脸盆', '自动', '自残', '自称', '自行', '致电', '英语翻译', '菜刀', '虐待', '螺丝刀', '衣服', '衣架', '补充', '装备', '装机', '西门', '解释', '警卫室', '警察', '设备', '询问', '该户', '赌博', '走后', '赶出来', '起因', '路人报', '路边', '路近', '身上', '转接', '轻伤', '轻微伤', '轿车', '辛耕路', '过场', '过警', '过顾', '还称', '进屋', '追其', '逃出来', '逃逸', '通知', '通话', '邻居', '酒瓶', '醉酒', '钥桥', '铁棍', '铁质', '锁事', '锅铲', '锤子', '门卫', '门卫室', '门口', '门外', '门岗', '闵行', '防护', '阿姨', '陈路', '隔壁', '鞋子', '韩国', '项链', '验伤', '骨折', '黑色', '鼻子', '龙州', '龙舟']
C:\Users\Windows\Anaconda3\lib\site-packages\sklearn\feature_extraction\image.py:167: DeprecationWarning: `np.int` is a deprecated alias for the builtin `int`. To silence this warning, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the release note link for additional information.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  dtype=np.int):
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\Windows\AppData\Local\Temp\jieba.cache
Loading model cost 0.922 seconds.
Prefix dict has been built successfully.
1.0
Process finished with exit code 0

准确率基本为 100%. 妈妈再也不同担心我被家暴啦!

以上就是Python机器学习NLP自然语言处理基本操作家暴归类的详细内容,更多关于NLP自然语言处理的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python机器学习NLP自然语言处理基本操作词袋模型

    概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 词袋模型 词袋模型 (Bag of Words Model) 能帮助我们把一个句子转换为向量表示. 词袋模型把文本看作是无序的词汇集合, 把每一单词都进行统计. 向量化 词袋模型首先会进行分词, 在分词之后. 通过通过统计在每个词在文本中出现的次数. 我们就可以得到该文本基于词语的特征, 如果将各个文本样本的这些词与对应的词频放在一起

  • Python机器学习NLP自然语言处理基本操作电影影评分析

    目录 概述 RNN 权重共享 计算过程 LSTM 阶段 代码 预处理 主函数 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. RNN RNN (Recurrent Neural Network), 即循环神经网络. RNN 相较于 CNN, 可以帮助我们更好的处理序列信息, 挖掘前后信息之间的联系. 对于 NLP 这类的任务, 语料的前后概率有极大的联系. 比如: "明天天气真好&

  • Python机器学习NLP自然语言处理基本操作之精确分词

    目录 概述 分词器 jieba 安装 精确分词 全模式 搜索引擎模式 获取词性 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 分词器 jieba jieba 算法基于前缀词典实现高效的词图扫描, 生成句子中汉字所有可能成词的情况所构成的有向无环图. 通过动态规划查找最大概率路径, 找出基于词频的最大切分组合. 对于未登录词采用了基于汉字成词能力的 HMM 模型, 使用 Viter

  • Python机器学习NLP自然语言处理基本操作词向量模型

    目录 概述 词向量 词向量维度 Word2Vec CBOW 模型 Skip-Gram 模型 负采样模型 词向量的训练过程 1. 初始化词向量矩阵 2. 神经网络反向传播 词向量模型实战 训练模型 使用模型 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 词向量 我们先来说说词向量究竟是什么. 当我们把文本交给算法来处理的时候, 计算机并不能理解我们输入的文本, 词向量就由此而生了.

  • 浅谈Python NLP入门教程

    正文 本文简要介绍Python自然语言处理(NLP),使用Python的NLTK库.NLTK是Python的自然语言处理工具包,在NLP领域中,最常使用的一个Python库. 什么是NLP? 简单来说,自然语言处理(NLP)就是开发能够理解人类语言的应用程序或服务. 这里讨论一些自然语言处理(NLP)的实际应用例子,如语音识别.语音翻译.理解完整的句子.理解匹配词的同义词,以及生成语法正确完整句子和段落. 这并不是NLP能做的所有事情. NLP实现 搜索引擎: 比如谷歌,Yahoo等.谷歌搜索引

  • Python机器学习NLP自然语言处理基本操作关键词

    目录 概述 关键词 TF-IDF 关键词提取 TF IDF TF-IDF jieba TF-IDF 关键词抽取 jieba 词性 不带关键词权重 附带关键词权重 TextRank 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 关键词 关键词 (keywords), 即关键词语. 关键词能描述文章的本质, 在文献检索, 自动文摘, 文本聚类 / 分类等方面有着重要的应用. 关键词抽

  • Python机器学习NLP自然语言处理基本操作新闻分类

    目录 概述 TF-IDF 关键词提取 TF IDF TF-IDF TfidfVectorizer 数据介绍 代码实现 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. TF-IDF 关键词提取 TF-IDF (Term Frequency-Inverse Document Frequency), 即词频-逆文件频率是一种用于信息检索与数据挖掘的常用加权技术. TF-IDF 可以帮助我

  • Python机器学习NLP自然语言处理Word2vec电影影评建模

    目录 概述 词向量 词向量维度 代码实现 预处理 主程序 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 词向量 我们先来说说词向量究竟是什么. 当我们把文本交给算法来处理的时候, 计算机并不能理解我们输入的文本, 词向量就由此而生了. 简单的来说, 词向量就是将词语转换成数字组成的向量. 当我们描述一个人的时候, 我们会使用身高体重等种种指标, 这些指标就可以当做向量. 有了向量

  • Python机器学习NLP自然语言处理基本操作家暴归类

    目录 概述 数据介绍 词频统计 朴素贝叶斯 代码实现 预处理 主函数 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 数据介绍 该数据是家庭暴力的一份司法数据.分为 4 个不同类别: 报警人被老公打,报警人被老婆打,报警人被儿子打,报警人被女儿打. 今天我们就要运用我们前几次学到的知识, 来实现一个 NLP 分类问题. 词频统计 CountVectorizer是一个文本特征提取的方

  • Python机器学习NLP自然语言处理基本操作之命名实例提取

    目录 概述 命名实例 HMM 随机场 马尔科夫随机场 CRF 命名实例实战 数据集 crf 预处理 主程序 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 命名实例 命名实例 (Named Entity) 指的是 NLP 任务中具有特定意义的实体, 包括人名, 地名, 机构名, 专有名词等. 举个例子: Luke Rawlence 代表人物 Aiimi 和 University o

  • Python机器学习NLP自然语言处理基本操作之京东评论分类

    目录 概述 RNN 权重共享 计算过程 LSTM 阶段 数据介绍 代码 预处理 主函数 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. RNN RNN (Recurrent Neural Network), 即循环神经网络. RNN 相较于 CNN, 可以帮助我们更好的处理序列信息, 挖掘前后信息之间的联系. 对于 NLP 这类的任务, 语料的前后概率有极大的联系. 比如: "明天

  • Python机器学习NLP自然语言处理基本操作之Seq2seq的用法

    概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. Seq2seq Seq2seq 由 Encoder 和 Decoder 两个 RNN 组成. Encoder 将变长序列输出, 编码成 encoderstate 再由 Decoder 输出变长序列. Seq2seq 的使用领域: 机器翻译: Encoder-Decoder 的最经典应用 文本摘要: 输入是一段文本序列, 输出是这段文本

随机推荐