ホームページ  >  記事  >  バックエンド開発  >  Python を使用して小さなテキスト分類システムを実装する

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

高洛峰
高洛峰オリジナル
2017-03-27 15:02:454246ブラウズ

背景

テキスト マイニングとは、未知の、理解可能な、最終的に使用可能な知識を大量のテキスト データから抽出し、その知識を使用して将来の参照のために情報をより適切に整理するプロセスを指します。つまり、非構造化テキストから知識を見つけるプロセスです。

現在、テキスト マイニングには 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 までご連絡ください。