無痛接入FastText算法進行文本分類(附代碼)

AI應用開發相關目錄

本專欄包括AI應用開發相關內容分享,包括不限于AI算法部署實施細節、AI應用后端分析服務相關概念及開發技巧、AI應用后端應用服務相關概念及開發技巧、AI應用前端實現路徑及開發技巧
適用于具備一定算法及Python使用基礎的人群

  1. AI應用開發流程概述
  2. Visual Studio Code及Remote Development插件遠程開發
  3. git開源項目的一些問題及鏡像解決辦法
  4. python實現UDP報文通信
  5. python實現日志生成及定期清理
  6. Linux終端命令Screen常見用法
  7. python實現redis數據存儲
  8. python字符串轉字典
  9. python實現文本向量化及文本相似度計算
  10. python對MySQL數據的常見使用
  11. 一文總結python的異常數據處理示例
  12. 基于selenium和bs4的通用數據采集技術(附代碼)
  13. 基于python的知識圖譜技術
  14. 一文理清python學習路徑
  15. Linux、Git、Docker常用指令
  16. linux和windows系統下的python環境遷移
  17. linux下python服務定時(自)啟動
  18. windows下基于python語言的TTS開發
  19. python opencv實現圖像分割
  20. python使用API實現word文檔翻譯
  21. yolo-world:”目標檢測屆大模型“
  22. 爬蟲進階:多線程爬蟲
  23. python使用modbustcp協議與PLC進行簡單通信
  24. ChatTTS:開源語音合成項目
  25. sqlite性能考量及使用(附可視化操作軟件)
  26. 拓撲數據的關鍵點識別算法
  27. python腳本將視頻抽幀為圖像數據集
  28. 圖文RAG組件:360LayoutAnalysis中文論文及研報圖像分析
  29. Ubuntu服務器的GitLab部署
  30. 無痛接入圖像生成風格遷移能力:GAN生成對抗網絡
  31. 一文理清OCR的前世今生
  32. labelme使用筆記
  33. HAC-TextRank算法進行關鍵語句提取
  34. Segment any Text:優質文本分割是高質量RAG的必由之路
  35. 無痛接入FastText算法進行文本分類

文章目錄

  • AI應用開發相關目錄
  • 簡介
  • 數據集情況
  • 環境部署:
  • 代碼及使用


簡介

FastText的特點如下:
速度:FastText的設計初衷就是為了高效,它的訓練速度比許多其他文本處理工具快得多。
簡單:FastText的模型結構相對簡單,易于理解和實現。
準確性:盡管模型簡單,但FastText在許多文本分類任務中都能達到與其他復雜模型相媲美的準確度。
多功能性:除了文本分類,FastText還可以用于詞嵌入的生成,它可以捕捉到詞的語義信息,比如相似的詞在嵌入空間中會彼此接近。
支持多語言:FastText能夠處理多種語言的文本,這對于跨語言文本分類任務非常有用。
無需大量數據:對于一些小語種或者數據稀缺的場景,FastText也能夠有效工作。

FastText的核心思想是將文本數據轉換成向量表示,然后使用這些向量進行分類或相似度計算。它使用了一種層次化的softmax技術來加速訓練過程,并采用了負采樣來改善分類性能。

在文本分類任務中,FastText將文本轉換成一系列的n-gram,然后通過模型學習每個n-gram的權重,最后將這些權重組合起來,形成整個文本的向量表示。這個向量隨后被送入一個softmax層進行分類。

此外,文本分類算法在大模型領域也具有一定的應用前景:

訓練FastText分類器,從大量領域不可知數據中識別領域內數據。具體來說,為了訓練FastText分類器,選擇了一定數量的領域內數據作為正面樣本,并選擇了同等數量的領域外數據作為負面樣本。訓練好的二元分類器隨后被用來從通用語料庫(例如,網絡語料庫)中選擇領域內數據;其次,應用過濾器,以確保領域內數據(包括原始的領域內語料庫和選擇的數據)具有高教育價值。通過這種方式,可以提高過濾后的領域內數據的質量,進而提高模型的性能。

數據集情況

停用詞集:
在這里插入圖片描述
原始數據集:
在這里插入圖片描述

環境部署:

https://pypi.org/project/fasttext-wheel/#files

下載對應版本的fasttext.whl文件,直接pip會出現輪子文件構建失敗的現象。
此外下載一下處理繁體文本的文字:

pip install langconv -i https://pypi.tuna.tsinghua.edu.cn/simple

代碼及使用

項目文件夾總體情況:
在這里插入圖片描述

數據清理文件text_cleaner.py:

# -*- coding: utf-8 -*-from types import MethodType, FunctionType
import jieba
import re
# 導入用于繁體/簡體轉換的包
from langconv import *def clean_txt(raw):fil = re.compile(r"[^0-9a-zA-Z\u4e00-\u9fa5]+")return fil.sub(' ', raw)def seg(sentence, sw, apply=None, cut_all=False):"""對中文文本去特殊符號、去停用詞、分詞:param sentence: 原始中文文本:param sw::param apply::param cut_all::return: 分詞后中文文本"""if isinstance(apply, FunctionType) or isinstance(apply, MethodType):sentence = apply(sentence)return ' '.join([i for i in jieba.cut(sentence, cut_all=cut_all) if i.strip() and i not in sw])def stop_words():with open('stopwords.txt', 'r', encoding='utf-8') as swf:stopwords = [i.strip() for i in swf.readlines()]return stopwordsdef cht_to_chs(line):"""中文繁體文本轉簡體:param line: 原始文本:return: 中文簡體文本"""line = Converter('zh-hans').convert(line)line.encode('utf-8')return linedef replace_text(input_str, str_targ, str_rep):if isinstance(input_str, list):return [replace_text(s, str_targ, str_rep) for s in input_str]return input_str.replace(str_targ, str_rep)# 對某個sentence進行處理:
if __name__ == '__main__':content = '海爾(Haier)新風機 室內外空氣交換 恒氧新風機 XG-100QH/AA'res = seg(content.lower().replace('\n', ''), stop_words(), apply=clean_txt)print(res)test = stop_words()print(test)

數據預處理步驟,生成中間csv文檔,訓練集文檔,驗證集文檔:

# -*- coding: utf-8 -*-import pandas as pd
import numpy as np
import random
from text_cleaner import *
from tqdm import tqdm
import os
import re
from sklearn.utils import shuffledef load_df(file_path, encoding='utf-8', drop_dup=True, drop_na=True):"""從csv文件讀取dataframe:param file_path: csv文件路徑:param encoding: 編碼,默認 UTF-8:param drop_dup: 去掉重復行:param drop_na: 去掉空行:return: dataframe"""df = pd.read_csv(file_path, encoding=encoding, engine='python')if drop_dup:df = df.drop_duplicates()if drop_na:df = df.dropna()return dfdef write_txt(file_name, df_data, delimiter=' ', fmt="%s", encoding='utf-8'):"""把dataframe寫入txt,用于DF轉fasttext訓練集:param delimiter::param file_name: 寫入的txt文件路徑:param df_data: <label> <text>型的DataFrame:param fmt: 格式,默認為字符串:param encoding: 編碼,默認為 UTF-8:return:"""np.savetxt(file_name, df_data.values, delimiter=delimiter, fmt=fmt, encoding=encoding)def dataframe_split(df_text, train_ratio):"""將dataframe按比例分割:param df_text: 原始dataframe:param train_ratio: 訓練集占比:return: 訓練集和驗證集"""df_text = shuffle(df_text)train_set_size = int(len(df_text) * train_ratio)valid_set_size = int(len(df_text) * (1 - train_ratio))df_train_data = df_text[:train_set_size]df_valid_data = df_text[train_set_size:(train_set_size + valid_set_size)]return df_train_data, df_valid_datadef count_diff_in_col(df_text, col_name):"""統計某一列不同種類的個數:param df_text: dataframe:param col_name: 需要統計的列名:return: 一個字典"""col_set = set(df_text[col_name].values)col_list = list(df_text[col_name].values)compute = dict()for item in col_set:compute.update({item: col_list.count(item)})return dict(sorted(compute.items()))def drop_rows_where_col_has(dataframe, col_name, target):"""刪除 dataframe中, col_name列包含target的行:param dataframe::param col_name::param target::return: 新的dataframe"""return dataframe.drop(dataframe[dataframe[col_name] == target].index)def df_data_augmentation(dataframe, col_label='label', col_text='text', num_sample=50, sample_length=18):"""將每一類標簽的樣本擴充至指定數量:param dataframe::param col_label::param col_text::param num_sample: 擴充后每個種類樣本的數量,默認50:param sample_length: 樣本文本的長度, 默認18:return: 返回擴充后的dataframe 和 記錄不同標簽樣本的字典"""dict_tmp = count_diff_in_col(dataframe, col_label)df_sample = dataframe.copy(deep=True)for key in list(dict_tmp.keys()):if dict_tmp[key] < num_sample:df_tmp = df_sample[(df_sample[col_label] == key)]list_text = []for text in df_tmp[col_text].values.tolist():list_text.extend(text.split())while dict_tmp[key] < num_sample:str_tmp = ' '.join(random.sample(list_text, sample_length))df_sample = df_sample.append({col_label: key, col_text: str_tmp}, ignore_index=True)dict_tmp.update({key: dict_tmp[key] + 1})return df_sample, dict_tmpdef repalce_df_text(dataframe, col_name, str_targ, str_rep):"""將dataframe中某一列的字符串中 str_tage 替換為 str_rep:param dataframe::param col_name::param str_targ::param str_rep::return:"""li0 = dataframe[col_name].values.tolist()li1 = replace_text(li0, str_targ, str_rep)if len(li1) == len(li0):dataframe[col_name] = li1return dataframeelse:print('Lenghth of dataframe has been changed !')return -1def df_cut_ch(dataframe, col_name, save_path=''):"""對 dataframe的col_name列中的中文文本分詞, 默認cut_all:param dataframe::param col_name::param save_path:保存路徑,默認不保存:return:"""df_cut = dataframe.copy(deep=True)text_cut = []stopwords = stop_words()for text in tqdm(dataframe[col_name].astype(str)):datacutwords = ' '.join([i for i in jieba.cut(text) if i.strip() and i not in stopwords])text_cut.append(datacutwords)del df_cut[col_name]df_cut[col_name] = text_cutif len(save_path):df_cut.to_csv(save_path, encoding='utf_8_sig', index=False)return df_cut# 頭條數據抽取方法
def getdata(filepath):data = pd.read_table(filepath, encoding='utf-8', sep='\n', header=None)pattern = re.compile('(\d+)_!_(.*?)_!_(.*?)_!_(.*?)_!_([\s\S]*)')datanew = data[0].str.extract(pattern)columsdic = {0:'id',1:'num',2:'catgor',3:'content',4:'keys'}datanew.rename(columns=columsdic, inplace=True)datanew['text'] = datanew['content'] + datanew['keys']datanew['pre'] = '__label__'datanew['labels'] = datanew['pre']+datanew['catgor']datanew = datanew.loc[:, ['labels', 'text']]return datanewif __name__ == '__main__':basepath = os.getcwd()file = r'toutiao_cat_data.txt'filepath = os.path.join(basepath, file)print(filepath)# print(getdata(filepath))cutfile = r'cutdata.csv'cutfilepath = os.path.join(basepath, cutfile)datanotcut = getdata(filepath)datacut = df_cut_ch(dataframe=datanotcut, col_name='text', save_path=cutfilepath)data = pd.read_csv(cutfilepath, encoding='utf-8')data = shuffle(data)df_train_data, df_valid_data = dataframe_split(df_text=data, train_ratio=0.7)write_txt(file_name=r'df_train_data.txt', df_data=df_train_data, encoding='utf-8')write_txt(file_name=r'df_valid_data.txt', df_data=df_valid_data, encoding='utf-8')

在這里插入圖片描述
在這里插入圖片描述
模型訓練及測試:

# -*- coding: utf-8 -*-import fasttext
import pandas as pd
from sklearn.metrics import classification_report
import os
import time
import rereport_index = 0def train_model(train_file, dim=100, epoch=100, lr=0.5, loss='softmax', wordNgrams=2, save_dir=''):"""訓練fasttext模型并保存在 save_dir 文件夾, 詳細參數參閱https://fasttext.cc/docs/en/python-module.html#train_supervised-parameters:param train_file: 訓練數據文件:param dim: 詞向量大小, 默認100:param epoch: 默認100:param lr: 學習率, 默認0.5:param loss: 損失函數,默認softmax, 多分類問題推薦 ova:param wordNgrams: 默認2:param save_dir: 模型保存文件夾,默認不保存:return: 文本分類器模型"""classifier = fasttext.train_supervised(train_file, label='__label__', dim=dim, epoch=epoch,lr=lr, wordNgrams=wordNgrams, loss=loss)if len(save_dir):# model_name = f'model_dim{str(dim)}_epoch{str(epoch)}_lr{str(lr)}_loss{str(loss)}' \#              f'_ngram{str(wordNgrams)}_{str(report_index)}.model'# if not os.path.exists(save_dir):#     os.mkdir(save_dir)# classifier.save_model(os.path.join(save_dir, model_name))classifier.save_model(savepath)return classifierdef give_classification_report(classifier, valid_csv, col_label=0, col_text=1, report_file=''):"""使用 classification_report 驗證 fasttext 模型分類效果,需在_FastText 類中添加dict_args()屬性:param classifier: fasttext文本分類模型:param valid_csv: 驗證數據集,需要csv格式:param col_label: 標簽列名,默認 'label':param col_text: 文本列名, 默認'text':param report_file: 保存report文件名,默認不保存:return: classification report"""df_valid = pd.read_table(valid_csv, sep='\n', header=None)print(df_valid)pattern = re.compile('(.*?) ([\s\S]*)')datause = df_valid[0].str.extract(pattern)print(classifier.predict(str(datause.iloc[0,1]))[0][0])alluse = []for i in range(datause.shape[0]):predict = classifier.predict(str(datause.iloc[i,1]))[0][0]alluse.append(predict)datause["predicted"] = alluseprint(datause)tags = list(set(datause[0]))report = classification_report(datause[0].tolist(), datause["predicted"].tolist(), target_names=tags)return report
train_file = r'df_train_data.txt'
savepath = r'model.bin'
rainmodel = train_model(train_file=train_file, save_dir=savepath)
modeluse = fasttext.load_model(r'model.bin')
valid_csv = r'df_valid_data.txt'
report_file = r'report_file.txt'
report = give_classification_report(classifier=modeluse, valid_csv=valid_csv, col_label= 0,col_text =1,report_file = '')
print(report)
precision    recall  f1-score   support__label__news_edu       0.90      0.89      0.90      5835__label__news_culture       0.95      0.93      0.94     10658__label__news_travel       0.88      0.91      0.89      8519__label__news_world       0.92      0.92      0.92      7961__label__news_finance       0.91      0.92      0.92     11853__label__news_house       0.85      0.84      0.84      8213__label__news_tech       0.94      0.94      0.94      8749__label__news_car       0.94      0.93      0.93      5324__label__news_sports       0.90      0.89      0.89      7556__label__news_story       0.97      0.96      0.96     11319__label__news_game       0.88      0.77      0.82      1880__label__stock       0.88      0.90      0.89     12442__label__news_agriculture       0.85      0.87      0.86      6390__label__news_military       0.84      0.86      0.85      7993
__label__news_entertainment       0.35      0.06      0.10       114accuracy                           0.90    114806macro avg       0.86      0.84      0.84    114806weighted avg       0.90      0.90      0.90    114806

其中數據集可參考:https://github.com/aceimnorstuvwxz/toutiao-text-classfication-dataset

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36241.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36241.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36241.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

API-其他事件

學習目標&#xff1a; 掌握其他事件 學習內容&#xff1a; 頁面加載事件元素滾動事件頁面尺寸事件 頁面加載事件&#xff1a; 加載外部資源&#xff08;如圖片、外聯CSS和JavaScript等&#xff09;加載完畢時觸發的事件。 為什么要學&#xff1f;&#xff1f; 有些時候需要等…

OnlyOffice:為現代工作方式而生的辦公套件

ONLYOFFICE官網鏈接&#xff1a;https://www.onlyoffice.com/zh/office-suite.aspx https://www.onlyoffice.com/zh/pdf-editor.aspx OnlyOffice 是一款開源的辦公套件&#xff0c;它提供了一系列的辦公工具&#xff0c;包括文檔編輯器、表格編輯器和演示文稿編輯器。這些工具…

帶你了解現行數據庫的高級特性和新方法

數據庫的高級特性和新方法 數據庫的高級操作數據庫事務用戶權限控制數據的備份與還原Binlog運行日志數據庫的新特性窗口函數的使用 閱讀指南&#xff1a; 本文探討了數據庫的高級特性和新方法&#xff0c;詳細介紹了這些高級特性及其操作方式&#xff0c;并涵蓋了一些最新的操作…

客戶案例|某 SaaS 企業租戶敏感數據保護實踐

近年來&#xff0c;隨著云計算技術的快速發展&#xff0c;軟件即服務&#xff08;SaaS&#xff09;在各行業的應用逐漸增多&#xff0c;SaaS 應用給企業數字化發展帶來了便捷性、成本效益與可訪問性&#xff0c;同時也帶來了一系列數據安全風險。作為 SaaS 產品運營服務商&…

韓國鋰電池工廠火災:行業安全警鐘再次敲響

三天前&#xff0c;6月24日上午&#xff0c;韓國京畿道華城市一電池廠突發火災&#xff0c;造成嚴重人員傷亡&#xff0c;其中包括多名中國籍員工。這一事件不僅令人痛心&#xff0c;更為全球鋰電池行業安全敲響了警鐘。 事發當天&#xff0c;電池廠內堆放鋰電池成品的區域突然…

TypeError: %c requires int or char

踩坑&#xff1a;在用python寫腳本查詢sql數據時&#xff0c;使用%s來替換sql語句里的變量&#xff0c;結果一直報&#xff0c;而其他sql使用同樣的方法正常&#xff0c;最后發現是因為sql語句里有模糊查詢 like "%測試%"&#xff0c;這里的%被誤以為%s&#xff0c;解…

Mendix 創客訪談錄|Mendix開發制造業客戶復雜應用的強大實力

本期創客 鄭立 Eviden中國低代碼服務團隊負責人 大家好&#xff0c;我是鄭立&#xff0c;目前擔任Eviden中國低代碼服務團隊的負責人&#xff0c;Mendix是Eviden中國在低代碼領域的最重要的合作伙伴&#xff0c;目前我們在多個制造業客戶中推廣和實施Mendix低代碼項目&#xff…

[MQTT]Mosquitto的權限管理_使用者/密碼(pwfile)和訪問控制清單(aclfile)

延續Mosquitto的內網連接(intranet)和使用者/密碼權限設置文章&#xff0c;經解讀mosquitto官網文檔&#xff0c;在權限管理部分&#xff0c;除了設置使用者/密碼(pwfile)之外&#xff0c;還有訪問控制清單(Access Control List, aclfile)可以設置。經過測試&#xff0c;同時設…

Linux 中變量的取用與設定

優質博文&#xff1a;IT-BLOG-CN Linux是一個多人多任務的環境&#xff0c;每個人登錄系統都能取得一個bash shell&#xff0c;每個人都能夠使用bash下達mail這個指令來接收自己的郵箱等等。問題是&#xff0c;bash如何得知你的郵箱是那個文件&#xff1f;這就需要『變量』的幫…

【ubuntu noble】docker 容器無法使用 nvidia gpu

運行ai模型的時候提示 no GPU available 執行 nvidia-smi 提示 Failed to initialize NVML: Unknown Error 解決方案 一. 宿主機執行sudo docker info&#xff0c;確保 runtime 字段中有 nvidia 字樣 Runtimes: nvidia runc io.containerd.runc.v2 Default Runtime: runc 注…

從0開始學習pyspark--pyspark的核心概念[第0節]

在學習 PySpark時會遇到很多新的關鍵詞,理解這些概念,對我們學習PySpark有極大的幫助,以下是一些PySpark的關鍵概念及其詳細解釋&#xff1a; 1. PySpark PySpark是Apache Spark的Python API。Spark是一個用于大規模數據處理的開源分布式計算系統&#xff0c;支持內存計算和基…

基于Java的寵物領養管理系統【附源碼】

摘 要 近些年來&#xff0c;隨著科技的飛速發展&#xff0c;互聯網的普及逐漸延伸到各行各業中&#xff0c;給人們生活帶來了十分的便利&#xff0c;寵物管理系統利用計算機網絡實現信息化管理&#xff0c;使整個寵物領養的發展和服務水平有顯著提升。 本文擬采用IDEA開發工具…

《分析模式》漫談07-怎樣把一張圖從不嚴謹改到嚴謹

DDD領域驅動設計批評文集 做強化自測題獲得“軟件方法建模師”稱號 《軟件方法》各章合集 下圖是《分析模式》原書第2章的圖2.10&#xff0c;里面有一些錯誤和考慮不周的地方&#xff1a; 2004中譯本和2020中譯本的翻譯如下&#xff1a; 基本上都是照搬&#xff0c;沒有改過…

【02-02】SpringMVC基于注解的應用

一、請求處理 1、常用注解 RequestMapping 作用&#xff1a;用來匹配客戶端發送的請求&#xff08;用來處理URL映射&#xff0c;將請求映射到處理方法中&#xff09;&#xff0c;可以在類或者方法上使用。 用在類上&#xff0c;可以將請求模塊化&#xff0c;避免請求方法中的…

【Java Web】三大域對象

目錄 一、域對象概述 二、三大域對象 三、域對象使用相關API 一、域對象概述 一些可用于存儲數據和傳遞數據的對象被稱為域對象&#xff0c;根據傳遞數據范圍的不同&#xff0c;我們稱之為不同的域&#xff0c;不同的域對象代表不同的域&#xff0c;共享數據的范圍也不同。 二、…

【小紅書標題打造】規則+底層邏輯解析|輔助工具|爆款必備

前言 大家好&#xff0c;我是一名自媒體工具人&#xff0c;今天不是教大家去自己寫標題&#xff08;現在這個時代自己寫真沒必要&#xff09;而是教大家了解爆款標題的相關知識以及辨別。后面會附贈 安裝此文規則生成標題的輸出工具。在這個工具發展龐大的時代&#xff0c;如果…

【知識圖譜系列】一步步指導:安裝與配置JDK和Neo4j的完美搭配

本文將提供詳細的步驟&#xff0c;介紹如何下載、安裝和配置Java開發工具包&#xff08;JDK&#xff09;以及流行的圖形數據庫Neo4j。將從選擇合適的JDK版本開始&#xff0c;然后是下載和配置環境變量&#xff0c;接著以同樣的方式處理Neo4j。最后&#xff0c;會通過一些檢查步…

Windows應急響應靶機 - Web3

一、靶機介紹 應急響應靶機訓練-Web3 前景需要&#xff1a;小苕在省護值守中&#xff0c;在靈機一動情況下把設備停掉了&#xff0c;甲方問&#xff1a;為什么要停設備&#xff1f;小苕說&#xff1a;我第六感告訴我&#xff0c;這機器可能被黑了。 這是他的服務器&#xff…

【CSS in Depth 2 精譯】1.6 本章小結

1.6 本章小結 瀏覽器遵循層疊規則來確定哪些樣式在哪些元素上生效&#xff1b;選擇器優先級由選擇器中的 id 數、class 類的個數以及標簽名的個數來共同確定。優先級更高的聲明將覆蓋較低聲明&#xff1b;當某些屬性沒有層疊值時&#xff0c;它們會從父元素繼承一個樣式值。這…

YouCompleteMe插件安裝方法簡述

一、前言 YouCompleteMe是VIM中進行C/C 開發的重要工具&#xff0c;可以極大提升linux下C/C開發效率。 YCM需要高版本的gcc (8.0以上版本&#xff0c;支持C17) 和 vim&#xff08;8.0以上&#xff0c;支持python3.6以上&#xff09; 二、編譯gcc_8.3 1. 獲取源碼 wget https:…