Python を使用して小さなテキスト分類システムを実装する
背景
テキスト マイニングとは、未知の、理解可能な、最終的に使用可能な知識を大量のテキスト データから抽出し、その知識を使用して将来の参照のために情報をより適切に整理するプロセスを指します。つまり、非構造化テキストから知識を見つけるプロセスです。
現在、テキスト マイニングには 7 つの主要な領域があります:
· 検索と情報取得 IR
· テキスト クラスタリング: クラスタリング手法を使用して、単語、断片、段落、またはドキュメントをグループ化および分類します
· テキスト分類: フラグメント、段落、またはファイルをグループ化および分類し、データ マイニング分類方法の使用に基づいてインスタンスにラベルを付けるようにトレーニングします モデル
-
· ウェブ マイニング: データおよびテキスト マイニング、ネットワークのサイズと相互接続に特別な注意を払います
· 情報抽出 IE: 非構造化テキストから関連する事実と関係を特定して抽出する; 非構造化テキストまたは半構造化テキストから構造化情報を抽出する 構造化データを抽出するプロセス
· 自然言語処理 NLP: 本質的な構造と文法と意味論の観点から見た言語の意味
テキスト分類システム (python 3.5)
中国語 テキスト分類技術とプロセスには主に次のステップが含まれます:
1. 前処理: テキストのノイズ情報を除去します。 HTML タグ、テキスト形式の変換、文の境界の検出
2. 中国語の単語の分割: 中国語の単語の分割を使用します。テキストの分割とストップワードの削除
3. 単語ベクトル空間の構築: テキスト単語の頻度をカウントし、テキスト単語ベクトルを生成します。スペース
4. 重み付け戦略 - TF-IDF: TF-IDF を使用して特徴語を検出し、文書トピックの特徴を反映して抽出します
5. 分類語を使用して分類器をトレーニングします
6.分類結果
1. 前処理
a. 処理するテキストの範囲を選択します
b. 分類されたテキスト コーパスを確立します
-
·カテゴリに分類されたテキスト リソース
・テストセットコーパス
-
分類されるテキストコーパスは、トレーニングセットまたは外部ソースからのテキストコーパスの一部にすることができます
c テキスト形式の変換: Python の l
ライブラリを使用して HTML タグを削除します。
d. 文の境界を検出します: 文の終わりをマークします 2. 中国語の単語の分割
単語の分割は、特定の仕様に従って連続した単語のシーケンスを再構成することです 中国語の単語のシーケンスを結合するプロセスは、中国語を分割することです。文字シーケンス (文) を独立した単語に分割することは、ある程度までは非常に複雑ですが、最終的には確率論がこの問題を解決します。 )
単語のセグメンテーションは、自然言語処理の最も基本的なモジュールであり、テキストや文章の構造化された表現は言語処理に大きな影響を与えます。テキストでは、テキストの現在の構造化表現は、単語ベクトル空間、エージェント モデル、依存関係構文のツリー表現、
RDFのグラフ表現の 4 つのカテゴリに分類されます。
中国語の単語のサンプルコードを以下に示します: # -*- コーディング: utf-8
-*-import os
import jieba
def savefile(savepath, content):
fp = open(savepath,"w",encoding='gb2312', errors='ignore')
fp.write( content)
fp.close()
def readfile(path):
fp = open(path,"r", encoding='gb2312',errors='ignore')
content = fp.read()
fp.close ()
return content
# corpus_path =
"train_small/" # 非分割単語分類の予測ライブラリ パス
# seg_path = "train_seg/" # 単語分割後の分類されたコーパス パス corpus_path = "test_small/" # 非分割単語分類の予測ライブラリ パス seg_path = "test_seg/" # 分類されたコーパス単語分割後のパス カテゴリ =
os.listdir(corpus_path) # 変更されたディレクトリの下にあるすべてのサブディレクトリを取得します for mydir in catelist:
class_path = corpus_path + mydir + "/" # カテゴリのサブディレクトリのパスを綴ります
seg_dir = seg_path + mydir + " /" # セグメンテーションという単語をスペルアウトした後にカテゴリ ディレクトリを予測します
if not os.path.exists(seg_dir): # 存在するかどうか、存在しない場合は作成します
os.makedirs(seg_dir)
file_list = os.listdir(class_path)
file_pathin file_list:
fullname = class_path + file_path
content =
Readfile (FullName).Strip () # ファイルを読み取る Content = Content.replace ("RN", "").Strip () # 変更部分と余分なスペースを削除
content_seg = jieba.cut (content)
savefile(seg_dir) + file_path, " ".join(content_seg))
print("単語分割の終わり")import os
import pickle
from sklearn.datasets.base import Bunch
#Bunch 类提供了一种key,value的对象形式
#target_name 所有分类集的名称列表
#label 每个文件的分类标签列表
#filenames 文件路径
#contents 分词后文件词向量形式def readfile(path):
fp = open(path, "r", encoding='gb2312', errors='ignore')
content = fp.read()
fp.close()
return content
bunch=Bunch(target_name=[],label=[],filenames=[],contents=[])
# wordbag_path="train_word_bag/train_set.dat"
# seg_path="train_seg/"wordbag_path="test_word_bag/test_set.dat"seg_path="test_seg/"catelist=os.listdir(seg_path)
bunch.target_name.extend(catelist)#将类别信息保存到Bunch对象for mydir in catelist:
class_path=seg_path+mydir+"/"
file_list=os.listdir(class_path)
for file_path in file_list:
fullname=class_path+file_path
bunch.label.append(mydir)#保存当前文件的分类标签
bunch.filenames.append(fullname)#保存当前文件的文件路径
bunch.contents.append(readfile(fullname).strip())#保存文件词向量
#Bunch对象持久化file_obj=open(wordbag_path,"wb")
pickle.dump(bunch,file_obj)
file_obj.close()
print("构建文本对象结束")
import os from sklearn.datasets.base import Bunch import pickle#持久化类from sklearn import feature_extraction from sklearn.feature_extraction.text import TfidfTransformer#TF-IDF向量转换类from sklearn.feature_extraction.text import TfidfVectorizer#TF-IDF向量生成类def readbunchobj(path): file_obj=open(path,"rb") bunch=pickle.load(file_obj) file_obj.close() return bunch def writebunchobj(path,bunchobj): file_obj=open(path,"wb") pickle.dump(bunchobj,file_obj) file_obj.close() def readfile(path): fp = open(path, "r", encoding='gb2312', errors='ignore') content = fp.read() fp.close() return content path="train_word_bag/train_set.dat"bunch=readbunchobj(path) #停用词stopword_path="train_word_bag/hlt_stop_words.txt"stpwrdlst=readfile(stopword_path).splitlines() #构建TF-IDF词向量空间对象tfidfspace=Bunch(target_name=bunch.target_name,label=bunch.label,filenames=bunch.filenames,tdm=[],vocabulary={}) #使用TfidVectorizer初始化向量空间模型vectorizer=TfidfVectorizer(stop_words=stpwrdlst,sublinear_tf=True,max_df=0.5) transfoemer=TfidfTransformer()#该类会统计每个词语的TF-IDF权值 #文本转为词频矩阵,单独保存字典文件tfidfspace.tdm=vectorizer.fit_transform(bunch.contents) tfidfspace.vocabulary=vectorizer.vocabulary_ #创建词袋的持久化space_path="train_word_bag/tfidfspace.dat"writebunchobj(space_path,tfidfspace)
上文代码中进行操作的都是训练集的数据,下面是测试集(抽取字训练集),训练步骤和训练集相同,首先是分词,之后生成词向量文件,直至生成词向量模型,不同的是,在训练词向量模型时需要加载训练集词袋,将测试集产生的词向量映射到训练集词袋的词典中,生成向量空间模型,代码如下:
import os from sklearn.datasets.base import Bunch import pickle#持久化类from sklearn import feature_extraction from sklearn.feature_extraction.text import TfidfTransformer#TF-IDF向量转换类from sklearn.feature_extraction.text import TfidfVectorizer#TF-IDF向量生成类from TF_IDF import space_path def readbunchobj(path): file_obj=open(path,"rb") bunch=pickle.load(file_obj) file_obj.close() return bunch def writebunchobj(path,bunchobj): file_obj=open(path,"wb") pickle.dump(bunchobj,file_obj) file_obj.close() def readfile(path): fp = open(path, "r", encoding='gb2312', errors='ignore') content = fp.read() fp.close() return content #导入分词后的词向量bunch对象path="test_word_bag/test_set.dat"bunch=readbunchobj(path) #停用词stopword_path="train_word_bag/hlt_stop_words.txt"stpwrdlst=readfile(stopword_path).splitlines() #构建测试集TF-IDF向量空间testspace=Bunch(target_name=bunch.target_name,label=bunch.label,filenames=bunch.filenames,tdm=[],vocabulary={}) #导入训练集的词袋trainbunch=readbunchobj("train_word_bag/tfidfspace.dat") #使用TfidfVectorizer初始化向量空间vectorizer=TfidfVectorizer(stop_words=stpwrdlst,sublinear_tf=True,max_df=0.5,vocabulary=trainbunch.vocabulary) transformer=TfidfTransformer(); testspace.tdm=vectorizer.fit_transform(bunch.contents) testspace.vocabulary=trainbunch.vocabulary #创建词袋的持久化space_path="test_word_bag/testspace.dat"writebunchobj(space_path,testspace)
下面执行多项式贝叶斯算法进行测试文本分类并返回精度,代码如下:
import pickle from sklearn.naive_bayes import MultinomialNB # 导入多项式贝叶斯算法包 def readbunchobj(path): file_obj = open(path, "rb") bunch = pickle.load(file_obj) file_obj.close() return bunch # 导入训练集向量空间trainpath = "train_word_bag/tfidfspace.dat"train_set = readbunchobj(trainpath) # d导入测试集向量空间testpath = "test_word_bag/testspace.dat"test_set = readbunchobj(testpath) # 应用贝叶斯算法 # alpha:0.001 alpha 越小,迭代次数越多,精度越高clf = MultinomialNB(alpha=0.001).fit(train_set.tdm, train_set.label) # 预测分类结果predicted = clf.predict(test_set.tdm) total = len(predicted);rate = 0 for flabel, file_name, expct_cate in zip(test_set.label, test_set.filenames, predicted): if flabel != expct_cate: rate += 1 print(file_name, ": 实际类别:", flabel, "-->预测分类:", expct_cate) # 精度print("error_rate:", float(rate) * 100 / float(total), "%")
6.分类结果评估
机器学习领域的算法评估有三个基本指标:
· 召回率(recall rate,查全率):是检索出的相关文档数与文档库中所有相关文档的比率,衡量的是检索系统的查全率
召回率=系统检索到的相关文件/系统所有相关的文件综述
· 准确率(Precision,精度):是检索出的相关文档数于检索出的文档总数的比率,衡量的是检索系统的查准率
准确率=系统检索到的相关文件/系统所有的检索到的文件数
准确率和召回率是相互影响的,理想情况下是二者都高,但是一般情况下准确率高,召回率就低;召回率高,准确率就低
· F-Score():计算公式为:
当=1时就是最常见的-Measure
三者关系如下:
具体评估代码如下:
import numpy as np from sklearn import metrics #评估def metrics_result(actual,predict): print("精度:{0:.3f}".format(metrics.precision_score(actual,predict))) print("召回:{0:0.3f}".format(metrics.recall_score(actual,predict))) print("f1-score:{0:.3f}".format(metrics.f1_score(actual,predict))) metrics_result(test_set.label,predicted) 中文文本语料 中文停用词文本集合 工程全部代码 原文链接
以上がPython を使用して小さなテキスト分類システムを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









MySQLには、無料のコミュニティバージョンと有料エンタープライズバージョンがあります。コミュニティバージョンは無料で使用および変更できますが、サポートは制限されており、安定性要件が低く、技術的な能力が強いアプリケーションに適しています。 Enterprise Editionは、安定した信頼性の高い高性能データベースを必要とするアプリケーションに対する包括的な商業サポートを提供し、サポートの支払いを喜んでいます。バージョンを選択する際に考慮される要因には、アプリケーションの重要性、予算編成、技術スキルが含まれます。完璧なオプションはなく、最も適切なオプションのみであり、特定の状況に応じて慎重に選択する必要があります。

hadidb:軽量で高レベルのスケーラブルなPythonデータベースHadIDB(HadIDB)は、Pythonで記述された軽量データベースで、スケーラビリティが高くなっています。 PIPインストールを使用してHADIDBをインストールする:PIPINSTALLHADIDBユーザー管理CREATEユーザー:CREATEUSER()メソッド新しいユーザーを作成します。 Authentication()メソッドは、ユーザーのIDを認証します。 fromhadidb.operationimportuseruser_obj = user( "admin"、 "admin")user_obj。

Hash値として保存されているため、Navicatを介してMongoDBパスワードを直接表示することは不可能です。紛失したパスワードを取得する方法:1。パスワードのリセット。 2。構成ファイルを確認します(ハッシュ値が含まれる場合があります)。 3.コードを確認します(パスワードをハードコードできます)。

MySQLは、基本的なデータストレージと管理のためにネットワーク接続なしで実行できます。ただし、他のシステムとのやり取り、リモートアクセス、または複製やクラスタリングなどの高度な機能を使用するには、ネットワーク接続が必要です。さらに、セキュリティ対策(ファイアウォールなど)、パフォーマンスの最適化(適切なネットワーク接続を選択)、およびデータバックアップは、インターネットに接続するために重要です。

MySQL接続は、次の理由が原因である可能性があります。MySQLサービスは開始されず、ファイアウォールは接続をインターセプトし、ポート番号が間違っています。ユーザー名またはパスワードが間違っています。My.cnfのリスニングアドレスは不適切に構成されています。トラブルシューティング手順には以下が含まれます。 2.ファイアウォール設定を調整して、MySQLがポート3306をリッスンできるようにします。 3.ポート番号が実際のポート番号と一致していることを確認します。 4.ユーザー名とパスワードが正しいかどうかを確認します。 5. my.cnfのバインドアドレス設定が正しいことを確認してください。

MySQLワークベンチは、構成が正しい場合、MariadBに接続できます。最初にコネクタタイプとして「mariadb」を選択します。接続構成では、ホスト、ポート、ユーザー、パスワード、およびデータベースを正しく設定します。接続をテストするときは、ユーザー名とパスワードが正しいかどうか、ポート番号が正しいかどうか、ファイアウォールが接続を許可するかどうか、データベースが存在するかどうか、MariadBサービスが開始されていることを確認してください。高度な使用法では、接続プーリングテクノロジーを使用してパフォーマンスを最適化します。一般的なエラーには、不十分な権限、ネットワーク接続の問題などが含まれます。エラーをデバッグするときは、エラー情報を慎重に分析し、デバッグツールを使用します。ネットワーク構成を最適化すると、パフォーマンスが向上する可能性があります

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。

データの専門家として、さまざまなソースから大量のデータを処理する必要があります。これは、データ管理と分析に課題をもたらす可能性があります。幸いなことに、AWS GlueとAmazon Athenaの2つのAWSサービスが役立ちます。
