TF-IDF算法,tfidf算法介绍及实现
TFIDF简介本文中提到的所有例子都是下面的例子:语料库=[ I , a , e],[ I , a , c],[ I , a , b]] TFIDF称为词频——逆文档频率。
所以如果这个令牌出现的频率很高的话,它会更重要,这很好理解。那么这个令牌的频率就叫做TF。
但问题来了。“的”、“了”、“马”这几个词也在文中频繁出现,那么它们也很重要吗?当然不是,因为这些词会出现在每一个文档中,所以没那么重要。“的”出现在每一个范畴,所以我不能用“的”作为我分类的重要指标,所以有
尽量只在少数文献中出现过,这样会比较有特色吧?于是逆文档频率指数就应运而生了,公式是:log(所有文档/有这个词的文档),这个也比较好理解。
分别解释:
文本频率是出现在我的统计语料库中的词的数量与所有词的总数的比率。例如,在上面的例子中,有五个单词(I,a,b,c,e)。
所有词的总数为5,其中“C”这个词出现一次,那么“I”的文本频率为1/5,以此类推。
文档的逆频率是所有文档的数量与某个单词的文档数量之比的对数。例如,在上面的示例中,文档总数是3,第二个带有“C”的文档出现了,因此“C”的
文档的逆频率索引是log(3/1)。在实践中,我们将添加一个平滑因子来防止统计值为0。
我们知道文本频率和逆文档频率指数,所以我们把这两个结果相乘,就是这个词的权重。例如,“c”的TFIDF值是1/5 * log(3/1)
我们对每个单词进行这样的计算,最后得到一个矩阵,其维数为样本数*唯一令牌总数。在示例中,样本数是3,唯一令牌的总数是5,因此我们将得到一个3*5的矩阵。如果这个文档中没有这样的单词,我们可以将值赋为0。
以下是上述词汇统计的矩阵:
()
统计:{I: 3, A: 3, E: 1, C: 1, B: 1}令牌数:{I: 0, a: 1, e: 2, c: 3,B: 4}TFIDF矩阵[[0 . 60 . 60 . 41972246 0 . 0][0 . 60 . 60 . 41972246 0 . 70][0 . 60 . 60 . 0 . 41972246]]tfi df实现只讲不练假风格这里有一个简单的
完成码
#!/usr/优雅的花卷/env python #编码:utf-8 作者:江@网址:https://www .github。com @ software:py charm @ file:tfi df。py @ time:2019/2/2 12:33 将数组导入为npclass TFIDF(对象): 手写一个倒排文档频率统计类,只写最简单的一个实现 def __init__(self,corpus): 初始化self.vob:词汇个数统计,字典格式self.word_id:词汇编码身份证,字典格式self.smooth_idf:平滑系数,关于平滑不多解释了:参数语料库:输入的语料 自我。word _ id={ } self。VOB={自我}。语料库=语料库自我。smooth _ IDF=0.01 def fit _ transform(self,corpus):pass def get _ VOB _ fre(self): 计算文本特特征的出现次数,也就是文本频率术语频率,但是没有除代币总数,因为后面优雅的花卷数数计算不支持浮动:返回:修改self.vob也就是修改词频统计字典 # 统计各词出现个数self .语料库中单一_语料库的id=0:if is instance(single _ corpus,list):pass if is instance(single _ corpus,str):single _ corpus=single _ corpus。剥离( n ).对单一_语料库中的单词进行拆分():如果单词不在自我。VOB:自我。VOB[word]=1 self。word _ id[word]=id id=1 else:self。VOB[word]=1 #生成矩阵X=np.zeros((len(self.corpus),len(self。VOB)))对于我在范围(len(self。语料库)):if是实例(self。corpus[I],str):single _ corpus=self。文集[I].条带( n ).split()else:single _ corpus=self。范围内j的corpus[I](len(single _ corpus)):feature=single _ corpus[j]feature _ id=self。word _ id[feature]X[I,feature _ id]=self。VOB[功能]返回X . astype(int)#需要转化成int def get_tf_idf(self): 计算综合资料的文件(集成数据文件)并生成最后的倒排文档频率矩阵:return:“”X=self。get _ VOB _ fre()n _ samples,n _ features=X . shape df=[]for I in range(n _ features): 这里是统计每个特征的非0的数量,也就是逆文档频率指数的分式中的分母,是为了计算idf df.append(n_samples - np .优雅的花卷count(X[:i])[0]) df=np.array(df) #必要时执行综合资料的文件(intergrated Data File)平滑df=int(self。smooth _ IDF)n _ samples=int(self。smooth _ IDF)IDF=NP。log(n _ samples/df)1 #核心公式#打印(自我。VOB)#打印(自我。word _ id)返回X * IDF/len(self。VOB)if _ _ name _ _= _ _ main _ _ :corpus=[[我, a , e],[我, a , c],[我, a , b ]]test=tfi df(corpus)# print(test。get _ VOB _ fre())打印(测试。get _ TF _ IDF())