目次
背景
python 3.5)" >テキスト分類システム (python 3.5)
ホームページ バックエンド開発 Python チュートリアル Python を使用して小さなテキスト分類システムを実装する

Python を使用して小さなテキスト分類システムを実装する

Mar 27, 2017 pm 03:02 PM
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
xml

ライブラリを使用して HTML タグを削除します。

d. 文の境界を検出します: 文の終わりをマークします 2. 中国語の単語の分割

単語の分割は、特定の仕様に従って連続した単語のシーケンスを再構成することです 中国語の単語のシーケンスを結合するプロセスは、中国語を分割することです。文字シーケンス (文) を独立した単語に分割することは、ある程度までは非常に複雑ですが、最終的には確率論がこの問題を解決します。 )

単語のセグメンテーションは、自然言語処理の最も基本的なモジュールであり、テキストや文章の構造化された表現は言語処理に大きな影響を与えます。テキストでは、テキストの現在の構造化表現は、単語ベクトル空間、エージェント モデル、依存関係構文のツリー表現、

RDF

のグラフ表現の 4 つのカテゴリに分類されます。

中国語の単語のサンプルコードを以下に示します:

# -*- コーディング: utf-8 -*-import os
import jieba
def save
file(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("単語分割の終わり")

その後の単語ベクトル空間モデルの生成を容易にするために、単語分割後のこれらのテキスト情報をテキストベクトルに変換する必要があります情報とオブジェクト化は、Scikit-Learn ライブラリの Bunch データ構造を使用します。具体的なコードは次のとおりです。

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("构建文本对象结束")
ログイン後にコピー

3. ベクトル空間モデル

ストレージを節約するために、テキストは高次元のベクトル空間に格納されます。スペースを確保し、検索効率を向上させます。テキスト分類の前に、特定の単語が自動的に除外されます。このテーブルを無効にするには、ここからダウンロードできます。

4. 重み付け戦略: TF-IDF 法

ある単語またはフレーズが記事内で頻繁に出現し、他の記事ではめったに出現しない場合、この単語またはフレーズは優れたカテゴリー区別能力を備えていると考えられ、分類に適しています。

コードのこの部分を説明する前に、まず単語頻度と逆ファイル頻度の概念を見てみましょう

単語頻度 (TF): ファイル内に出現する特定の単語の頻度を指します。この数値は、長い文書に偏らないように単語数を正規化したもので、特定の文書内の単語の重要性は次のように表されます。

分子は文書内でその単語が出現する回数です。 、分母はドキュメント内のすべての単語の出現数の合計です

逆ドキュメント頻度 (IDF) は、単語の一般的な重要性の尺度です。特定の単語の IDF は、単語の総数で割ることができます。文書を単語番号を含むファイルで割って、その商の対数をとります:

|D| はコーパス内のファイルの総数、j は単語が含まれていない場合はその単語を含むファイルの数です。コーパスの場合、分母はゼロになるため、一般に、単語の頻度とファイルの逆頻度の積を計算するために、分母に 1

が追加されます。ファイル コレクション全体で重みの高い TF -IDF が生成される可能性があるため、TF-IDF は一般的な単語を除外し、重要な単語を保持する傾向があります。コードは次のとおりです:

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)
ログイン後にコピー
5. ナイーブ ベイズ分類モジュールを使用します

一般的に使用されるテキスト分類方法には、kNN 最近傍法、ナイーブ ベイズ アルゴリズム、およびサポート ベクター マシン アルゴリズムが含まれます。最も単純で、分類精度は許容範囲内ですが、最速の方法です

ナイーブ ベイズ アルゴリズムは、短いテキストの分類に最も効果があり、精度が非常に高くなります

サポート ベクター マシン アルゴリズムの利点は、線形不可分の状況をサポートすることです。そして精度も最高です

上文代码中进行操作的都是训练集的数据,下面是测试集(抽取字训练集),训练步骤和训练集相同,首先是分词,之后生成词向量文件,直至生成词向量模型,不同的是,在训练词向量模型时需要加载训练集词袋,将测试集产生的词向量映射到训练集词袋的词典中,生成向量空间模型,代码如下:

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

mysqlは支払う必要がありますか mysqlは支払う必要がありますか Apr 08, 2025 pm 05:36 PM

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

hadidb:pythonの軽量で水平方向にスケーラブルなデータベース hadidb:pythonの軽量で水平方向にスケーラブルなデータベース Apr 08, 2025 pm 06:12 PM

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

MongoDBデータベースパスワードを表示するNAVICATの方法 MongoDBデータベースパスワードを表示するNAVICATの方法 Apr 08, 2025 pm 09:39 PM

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

mysqlはインターネットが必要ですか? mysqlはインターネットが必要ですか? Apr 08, 2025 pm 02:18 PM

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

MySQLを解く方法は、ローカルホストに接続できません MySQLを解く方法は、ローカルホストに接続できません Apr 08, 2025 pm 02:24 PM

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

MySQLワークベンチはMariadBに接続できますか MySQLワークベンチはMariadBに接続できますか Apr 08, 2025 pm 02:33 PM

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

高負荷アプリケーションのMySQLパフォーマンスを最適化する方法は? 高負荷アプリケーションのMySQLパフォーマンスを最適化する方法は? Apr 08, 2025 pm 06:03 PM

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

Amazon AthenaでAWS接着クローラーの使用方法 Amazon AthenaでAWS接着クローラーの使用方法 Apr 09, 2025 pm 03:09 PM

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

See all articles