テキスト マイニングとは、未知の、理解可能な、最終的に使用可能な知識を大量のテキスト データから抽出し、その知識を使用して将来の参照のために情報をより適切に整理するプロセスを指します。つまり、非構造化テキストから知識を見つけるプロセスです。
現在、テキスト マイニングには 7 つの主要な領域があります:
· 検索と情報取得 IR
· テキスト クラスタリング: クラスタリング手法を使用して、単語、断片、段落、またはドキュメントをグループ化および分類します
· テキスト分類: フラグメント、段落、またはファイルをグループ化および分類し、データ マイニング分類方法の使用に基づいてインスタンスにラベルを付けるようにトレーニングします モデル
· ウェブ マイニング: データおよびテキスト マイニング、ネットワークのサイズと相互接続に特別な注意を払います
· 情報抽出 IE: 非構造化テキストから関連する事実と関係を特定して抽出する; 非構造化テキストまたは半構造化テキストから構造化情報を抽出する 構造化データを抽出するプロセス
· 自然言語処理 NLP: 本質的な構造と文法と意味論の観点から見た言語の意味
中国語 テキスト分類技術とプロセスには主に次のステップが含まれます:
1. 前処理: テキストのノイズ情報を除去します。 HTML タグ、テキスト形式の変換、文の境界の検出
2. 中国語の単語の分割: 中国語の単語の分割を使用します。テキストの分割とストップワードの削除
3. 単語ベクトル空間の構築: テキスト単語の頻度をカウントし、テキスト単語ベクトルを生成します。スペース
4. 重み付け戦略 - TF-IDF: TF-IDF を使用して特徴語を検出し、文書トピックの特徴を反映して抽出します
5. 分類語を使用して分類器をトレーニングします
6.分類結果
1. 前処理
a. 処理するテキストの範囲を選択します
b. 分類されたテキスト コーパスを確立します
·カテゴリに分類されたテキスト リソース
・テストセットコーパス
分類されるテキストコーパスは、トレーニングセットまたは外部ソースからのテキストコーパスの一部にすることができます
ライブラリを使用して 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 サイトの他の関連記事を参照してください。