분류 결과에 따라 TFIDF의 실현 텍스트 분류 및 비교 단어 설정 모델 및 단어 모델의 가방

[방법] 원리

TF-IDF는 단어 또는 코퍼스에 대한 파일 집합의 중요도를 평가하기위한 통계적 방법이다. 이 파일에 나타나는 횟수와 같은 단어의 중요성의 증가에 비례하지만, 주파수가 신체의 모양에 반비례로도 줄어 듭니다. 다양한 형태의 TF-IDF 가중치는 종종 학위 또는 평가의 관련 조치와 같은 검색 엔진 및 사용자 파일을 사용합니다.
TF-IDF의 주요 아이디어는 그 경우 단어 나 구가 주파수 TF의 기사에서 나타납니다 (용어 빈도, 단어 빈도), 높은 단어 빈도, 거의 다른 기사에서 단어 나 구가 매우있는 것으로 간주되지 않습니다 분류에 적합한 카테고리를 구분하는 좋은 능력. TF-IDF는 실제로 : TF * IDF. TF는 문서 (D)에 나타나는 항목의 빈도를 나타낸다. IDF 메인 아이디어 (문서 빈도, 역 문서 빈도 역)이다 문서 적은 엔트리 t, 즉 작은 N, IDF 더 포함한다면, 용어 t 카테고리를 구별하는 것이 능력을 갖는다. 문서의 클래스 번호가 문서 C에 포함되는 경우 용어 t는 m이고, t는 N = m + K, 시간을 포함하는 문서의 수는 모두 큰 m은 N과 같은 큰 경우 분명 t K이다 다른 유형의 문서의 수를 포함 작은 것 수득 IDF IDF 식의 값에 따라, 그 클래스 차별 능력 용어 t가 강하지 않은 것으로 나타났다. 용어가 자주 문서에서 클래스를 표시하지만 사실, 다음 항목이 텍스트 기능이 클래스의 좋은 대표 할 수 있고, 이러한 용어들은 높은 가중치 부여되어야하고, 선거로 기능 단어 텍스트 및 기타 유형의 문서 유형을 구분합니다.

텍스트 특징 추출은 매우 중요한 두 가지 모델이있다 : 설정 모델 단어 : 단어의 모음, 자연 요소의 각 세트는 각 단어는 하나 개의 단어 설정되어 있는지, 단 하나입니다. 즉 모델의 가방 : 단어가 둘 이상의 기회에 단어의 집합에 기초하여 문서에 나타나는 경우, 통계 주파수 (주파수)하는 사람들이 나타납니다.
모두 중요한 차이는 단어의 가방은 단어에서만 및없이 관심을뿐만 아니라, 몇 가지 단어 가방에 대해 우려 세트, 주파수의 크기에 기본 단어 증가하도록 설정되어 있습니다.
주머니 01 행렬로 단어 세트 단순히 단어 빈도 행렬 모델 모델 워드를 사용할 때, 사용 np.int64 ARR (> 0) 일 수있다.

[결과]

그림 삽입 설명 여기

[코드]

import nltk
from nltk.corpus import movie_reviews
from pylab import plot,show
from numpy import array
from numpy.random import rand
from scipy.cluster.vq import kmeans,vq,whiten
import numpy as np
import random
import collections

documents = [(' '.join(movie_reviews.words(fileid)), category) for category in movie_reviews.categories() for fileid in movie_reviews.fileids(category)]
#转化为词列表的影评,与标签,组成二元组
random.shuffle(documents)	
documents_words=[w for (w,t) in documents]

'''基于SKLearn的TFIDF实现'''
from sklearn import feature_extraction  
from sklearn.feature_extraction.text import TfidfTransformer  
from sklearn.feature_extraction.text import CountVectorizer  

'''TFIDF'''
vectorizer=CountVectorizer(min_df=100,stop_words='english')#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频  
transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值
tfidf=transformer.fit_transform(vectorizer.fit_transform(documents_words))#fit_transform计算tf-idf,fit_transform将文本转为词频矩阵  
word=vectorizer.get_feature_names()#获取词袋模型中的所有词语  
features=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
'''词袋模型'''
bag_of_word=features
'''词集模型'''
set_of_word=np.int64(features>0)#将词频矩阵转化为01矩阵

target=[c for (d,c) in documents]
train_set1=bag_of_word[:1500,:]
train_set2=set_of_word[:1500,:]
target_train=target[:1500]
test_set1=bag_of_word[1500:,:]#切片操作,第一维取1500往后所有,第二维取所有
test_set2=set_of_word[1500:,:]
target_test=target[1500:]

print('【使用词袋模型】')
from sklearn.svm import SVC
svclf = SVC(kernel ='linear',probability=True)
svclf.fit(train_set1, target_train)  
pred_svc = svclf.predict(test_set1)
print('SVM=',sum(pred_svc==target_test)/len(target_test))

from bio import kNN
from scipy import spatial
model = kNN.train(train_set1, target_train, 7)
dd=[kNN.classify(model, t, distance_fn=spatial.distance.cosine) for t in test_set1]
print('KNN_cos=',sum(np.array(dd)==np.array(target_test))/len(target_test))

from sklearn.neighbors import KNeighborsClassifier
knnclf = KNeighborsClassifier(n_neighbors=7)#default with k=5  
knnclf.fit(train_set1, target_train)  
pred_knn = knnclf.predict(test_set1);
print('KNN_eu=',sum(pred_knn==target_test)/len(target_test))

print('【使用词集模型】')
svclf.fit(train_set2, target_train)  
pred_svc2 = svclf.predict(test_set2)
print('SVM=',sum(pred_svc2==target_test)/len(target_test))

model2 = kNN.train(train_set2, target_train, 7)
dd2=[kNN.classify(model2, t, distance_fn=spatial.distance.cosine) for t in test_set2]
print('KNN_cos=',sum(np.array(dd2)==np.array(target_test))/len(target_test))

knnclf.fit(train_set2, target_train)  
pred_knn2 = knnclf.predict(test_set2);
print('KNN_eu=',sum(pred_knn2==target_test)/len(target_test))
게시 54 개 원래 기사 · 원 찬양 26 ·은 20000 +를 볼

추천

출처blog.csdn.net/weixin_43629813/article/details/103846646