您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何理解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自然語言處理基本操作家暴歸類就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。