学习 |使用 TF-IDF 进行特征提取
现在,您正在搜索 tf-idf,那么您可能熟悉特征提取及其是什么。 TF-IDF 代表词频 - 逆文档频率。它是用于信息检索的最重要技术之一,用于表示特定单词或短语对给定文档的重要性。举个例子,我们有一个字符串或词袋(BOW) ,我们必须从中提取信息,然后我们可以使用这种方法。
tf-idf 值与单词在文档中出现的次数成正比增加,但通常会被语料库中单词的频率所抵消,这有助于针对某些单词通常出现更频繁的事实进行调整.
TF-IDF 使用两种统计方法,一种是 Term Frequency,另一种是 Inverse Document Frequency。词频是指给定词 t 在文档 doc 中出现的总次数与(每个)文档中所有单词的总数之比,以及该单词提供多少信息的逆文档频率度量。它测量给定单词在整个文档中的权重。 IDF 显示给定单词在所有文档中的常见或罕见程度。
TF-IDF 可以计算为 tf * idf
Tf*Idf 不会将原始数据直接转换为有用的特征。首先,它将原始字符串或数据集转换为向量,每个单词都有自己的向量。然后我们将使用一种特殊的技术来检索适用于向量等的余弦相似度等特征。众所周知,我们不能直接将字符串传递给我们的模型。因此,tf*idf 为我们提供了整个文档的数值。
为了从单词文档中提取特征,我们导入 -
from sklearn.feature_extraction.text import TfidfVectorizer
输入 :
1st Sentence - "hello i am pulkit"
2nd Sentence - "your name is akshit"
代码:查找相似性度量的Python代码
# importing libraries
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.metrics import pairwise_distances
from sklearn.metrics.pairwise import euclidean_distances
from scipy.spatial import distance
import pandas as pd
import numpy as np
## Converting 3D array of array into 1D array
def arr_convert_1d(arr):
arr = np.array(arr)
arr = np.concatenate( arr, axis=0 )
arr = np.concatenate( arr, axis=0 )
return arr
## Cosine Similarity
cos = []
def cosine(trans):
cos.append(cosine_similarity(trans[0], trans[1]))
## Manhatten Distance
manhatten = []
def manhatten_distance(trans):
manhatten.append(pairwise_distances(trans[0], trans[1],
metric = 'manhattan'))
## Euclidean Distance
euclidean = []
def euclidean_function(vectors):
euc=euclidean_distances(vectors[0], vectors[1])
euclidean.append(euc)
# This Function finds the similarity between two
# sentences by using above functions.
## TF - IDF
def tfidf(str1, str2):
ques = []
# You have to provide the dataset. Link of the dataset
# is given in the end of this article.
# and if you are using a different dataset then adjust
# it according to your dataset's columns and rows
dataset = pd.read_csv('C:\\Users\\dell\\Desktop\\quora_duplicate_questions.tsv',
delimiter='\t',encoding='utf-8')
x = dataset.iloc[:, 1:5]
x = x.dropna(how = 'any')
for k in range(len(x)):
for j in [2, 3]:
ques.append(x.iloc[k, j])
vect = TfidfVectorizer()
# Fit the your whole dataset. After all, this'll
# produce the vectors which is based on words in corpus/dataset
vect.fit(ques)
corpus = [str1,str2]
trans = vect.transform(corpus)
euclidean_function(trans)
cosine(trans)
manhatten_distance(trans)
return convert()
def convert():
dataf = pd.DataFrame()
lis2 = arr_convert_1d(manhatten)
dataf['manhatten'] = lis2
lis2 = arr_convert_1d(cos)
dataf['cos_sim'] = lis2
lis2 = arr_convert_1d(euclidean)
dataf['euclidean'] = lis2
return dataf
newData = pd.DataFrame();
str1 = "hello i am pulkit"
str2 = "your name is akshit"
newData = tfidf(str1,str2);
print(newData);
输出 :
manhatten cos_sim euclidean
0 2.955813 0.0 1.414214
数据集: Google Drive 链接
注意:数据集很大,因此需要 30-40 秒才能产生输出,如果您要按原样运行,那么它将无法正常工作。仅当您在 IDE 中复制此代码并在 tfidf函数中提供您的数据集时,它才有效。