精华内容
下载资源
问答
  • 本文主要参考https://stackoverflow.com/questions/12118720/python-tf-idf-cosine-to-find-document-similaritStackOverflow的回答主要是使用sklearn的TfidfTransformercosine_similarity就是计算L2归一化的向量...

    本文主要参考https://stackoverflow.com/questions/12118720/python-tf-idf-cosine-to-find-document-similaritStackOverflow的回答

    主要是使用sklearn的TfidfTransformer

    cosine_similarity就是计算L2归一化的向量点乘。如果x,y是行向量,它们的cosine similarityk是:

    linear_kernel 是多项式核的特例,如果x,和y是列向量,他们的线性核为:

    fit &fit_tansform & transform

    fit是一个适配的过程,用于train,得到一个统一的转换的规则的模型;

    transform:将数据进行转换,比如测试数据按照训练数据同样的模型进行转换,得到特征向量;

    fit_tansform:将上述两个合并起来,fit to data,then transform it. 如果训练阶段用的是fit_transform,在测试阶段只需要transform就行

    也就是一般训练的时候用fit_transform(train_data)

    在测试的时候用transform(test_data)

    回答一

    如果你想提取count features并应用TF-IDFnormalizaition以及行基础的欧式距离,用一个操作就行:

    TFidfVectorizor

    >>> from sklearn.feature_extraction.text import TfidfVectorizer

    >>> from sklearn.datasets import fetch_20newsgroups

    >>> twenty = fetch_20newsgroups()

    >>> tfidf = TfidfVectorizer().fit_transform(twenty.data)

    >>> tfidf

    <11314x130088 sparse matrix of type 'numpy.float64'>'

    with 1787553 stored elements in Compressed Sparse Row format>

    现在要求一个文档(如第一句)同其他所有文档的距离,只需要计算第一个向量和其他所有向量的点乘,因为tfidf向量已经row-normalized

    cos距离并不考虑向量的大小(也就是绝对值),Row-normalised(行标准化)向量大小为1,所以Linear Kernel足够计算相似值。

    scipy sparse matrix查看第一个向量:

    >>> tfidf[0:1]

    <1x130088 sparse matrix of type 'numpy.float64'>'

    with 89 stored elements in Compressed Sparse Row format>

    scikit-learn已经提供了pairwise metrics,稀疏的不稀疏的矩阵表示。这里我们需要点乘操作,也叫linear kernel:

    >>> from sklearn.metrics.pairwise import linear_kernel

    >>> cosine_similarities = linear_kernel(tfidf[0:1], tfidf).flatten()

    >>> cosine_similarities

    array([ 1. , 0.04405952, 0.11016969, ..., 0.04433602,

    0.04457106, 0.03293218])

    这里插播一下,linear_kernel的输入是(NT)和(MT)的向量,输出(N*M)的向量

    因此,要找5个最接近的相关文档,只需要用argsort切片取就行了:

    >>> related_docs_indices = cosine_similarities.argsort()[:-5:-1]

    >>> related_docs_indices

    array([ 0, 958, 10576, 3277])

    >>> cosine_similarities[related_docs_indices]

    array([ 1. , 0.54967926, 0.32902194, 0.2825788 ])

    第一个结果用于检查,这是query本身,相似度为1

    在这个例子里,learn_kernel就相当于cos similarity,因为sklearn.feature_extraction.text.TfidfVectorizer本身得到的就是归一化后的向量,这样cosine_similarity就相当于linear_kernel

    回答2

    是个手动计算的方法

    循环计算test_data与train_data的特征间的cosine 距离

    首先用简单的lambda函数表示cosine距离的计算:

    cx = lambda a, b : round(np.inner(a, b)/(LA.norm(a)*LA.norm(b)), 3)

    然后就只要for循环就行

    for vector in trainVectorizerArray:

    print vector

    for testV in testVectorizerArray:

    print testV

    cosine = cx(vector, testV)

    print cosine

    回答3

    跟回答1一样,不过直接用cosine_similarity

    from sklearn.feature_extraction.text import CountVectorizer

    from sklearn.metrics.pairwise import cosine_similarity

    from sklearn.feature_extraction.text import TfidfVectorizer

    print "cosine scores ==> ",cosine_similarity(tfidf_matrix_train[0:1], tfidf_matrix_train) #here the first element of tfidf_matrix_train is matched with other elements

    展开全文
  • Python TFIDF计算文本相似度

    千次阅读 2020-02-02 22:25:28
    本文主要参考https://stackoverflow.com/questions/12118720/python-tf-idf-cosine-to-find-document-similaritStackOverflow的回答 主要是使用sklearn的TfidfTransformer cosine_similarity就是计算L2归一化的向量...

    本文主要参考https://stackoverflow.com/questions/12118720/python-tf-idf-cosine-to-find-document-similaritStackOverflow的回答
    主要是使用sklearn的TfidfTransformer

    cosine_similarity就是计算L2归一化的向量点乘。如果x,y是行向量,它们的cosine similarityk是:
    在这里插入图片描述
    linear_kernel 是多项式核的特例,如果x,和y是列向量,他们的线性核为:
    在这里插入图片描述

    fit &fit_tansform & transform

    • fit是一个适配的过程,用于train,得到一个统一的转换的规则的模型;
    • transform:将数据进行转换,比如测试数据按照训练数据同样的模型进行转换,得到特征向量;
    • fit_tansform:将上述两个合并起来,fit to data,then transform it. 如果训练阶段用的是fit_transform,在测试阶段只需要transform就行

    也就是一般训练的时候用fit_transform(train_data)
    在测试的时候用transform(test_data)

    回答一

    如果你想提取count features并应用TF-IDFnormalizaition以及行基础的欧式距离,用一个操作就行:
    TFidfVectorizor

    >>> from sklearn.feature_extraction.text import TfidfVectorizer
    >>> from sklearn.datasets import fetch_20newsgroups
    >>> twenty = fetch_20newsgroups()
    
    >>> tfidf = TfidfVectorizer().fit_transform(twenty.data)
    >>> tfidf
    <11314x130088 sparse matrix of type '<type 'numpy.float64'>'
        with 1787553 stored elements in Compressed Sparse Row format>
    

    现在要求一个文档(如第一句)同其他所有文档的距离,只需要计算第一个向量和其他所有向量的点乘,因为tfidf向量已经row-normalized
    cos距离并不考虑向量的大小(也就是绝对值),Row-normalised(行标准化)向量大小为1,所以Linear Kernel足够计算相似值。
    scipy sparse matrix查看第一个向量:

    >>> tfidf[0:1]
    <1x130088 sparse matrix of type '<type 'numpy.float64'>'
        with 89 stored elements in Compressed Sparse Row format>
    

    scikit-learn已经提供了pairwise metrics,稀疏的不稀疏的矩阵表示。这里我们需要点乘操作,也叫linear kernel:

    >>> from sklearn.metrics.pairwise import linear_kernel
    >>> cosine_similarities = linear_kernel(tfidf[0:1], tfidf).flatten()
    >>> cosine_similarities
    array([ 1.        ,  0.04405952,  0.11016969, ...,  0.04433602,
        0.04457106,  0.03293218])
    

    这里插播一下,linear_kernel的输入是(NT)和(MT)的向量,输出(N*M)的向量

    因此,要找5个最接近的相关文档,只需要用argsort切片取就行了:

    >>> related_docs_indices = cosine_similarities.argsort()[:-5:-1]
    >>> related_docs_indices
    array([    0,   958, 10576,  3277])
    >>> cosine_similarities[related_docs_indices]
    array([ 1.        ,  0.54967926,  0.32902194,  0.2825788 ])
    

    第一个结果用于检查,这是query本身,相似度为1
    在这个例子里,learn_kernel就相当于cos similarity,因为sklearn.feature_extraction.text.TfidfVectorizer本身得到的就是归一化后的向量,这样cosine_similarity就相当于linear_kernel

    回答2

    是个手动计算的方法
    循环计算test_data与train_data的特征间的cosine 距离
    首先用简单的lambda函数表示cosine距离的计算:

    cx = lambda a, b : round(np.inner(a, b)/(LA.norm(a)*LA.norm(b)), 3)
    

    然后就只要for循环就行

    for vector in trainVectorizerArray:
        print vector
        for testV in testVectorizerArray:
            print testV
            cosine = cx(vector, testV)
            print cosine
    

    回答3

    跟回答1一样,不过直接用cosine_similarity

    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.metrics.pairwise import cosine_similarity
    from sklearn.feature_extraction.text import TfidfVectorizer
    print "cosine scores ==> ",cosine_similarity(tfidf_matrix_train[0:1], tfidf_matrix_train)  #here the first element of tfidf_matrix_train is matched with other elements
    
    展开全文
  • vectorizer = CountVectorizer() #构建一个计算词频(TF)的玩意儿,当然这里面不足是可以做这些transformer = TfidfTransformer() #构建一个计算TF-IDF的玩意儿tfidf = transformer.fit_transform(vectorizer.fit_...

    vectorizer = CountVectorizer() #构建一个计算词频(TF)的玩意儿,当然这里面不足是可以做这些

    transformer = TfidfTransformer() #构建一个计算TF-IDF的玩意儿

    tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))

    #vectorizer.fit_transform(corpus)将文本corpus输入,得到词频矩阵

    #将这个矩阵作为输入,用transformer.fit_transform(词频矩阵)得到TF-IDF权重矩阵

    TfidfTransformer + CountVectorizer  =  TfidfVectorizer

    值得注意的是,CountVectorizer()和TfidfVectorizer()里面都有一个成员叫做vocabulary_(后面带一个下划线)

    这个成员的意义是词典索引,对应的是TF-IDF权重矩阵的列,只不过一个是私有成员,一个是外部输入,原则上应该保持一致。

    vectorizer = TfidfVectorizer(stop_words=stpwrdlst, sublinear_tf = True, max_df = 0.5)

    关于参数:

    input:string{‘filename‘, ‘file‘, ‘content‘}

    如果是‘filename‘,序列作为参数传递给拟合器,预计为文件名列表,这需要读取原始内容进行分析

    如果是‘file‘,序列项目必须有一个”read“的方法(类似文件的对象),被调用作为获取内存中的字节数

    否则,输入预计为序列串,或字节数据项都预计可直接进行分析。

    encoding:string, ‘utf-8’by default

    如果给出要解析的字节或文件,此编码将用于解码

    decode_error: {‘strict‘, ‘ignore‘, ‘replace‘}

    如果一个给出的字节序列包含的字符不是给定的编码,指示应该如何去做。默认情况下,它是‘strict‘,这意味着的UnicodeDecodeError将提高,其他值是‘ignore‘和‘replace‘

    strip_accents: {‘ascii‘, ‘unicode‘, None}

    在预处理步骤中去除编码规则(accents),”ASCII码“是一种快速的方法,仅适用于有一个直接的ASCII字符映射,"unicode"是一个稍慢一些的方法,None(默认)什么都不做

    analyzer:string,{‘word‘, ‘char‘} or callable

    定义特征为词(word)或n-gram字符,如果传递给它的调用被用于抽取未处理输入源文件的特征序列

    preprocessor:callable or None(default)

    当保留令牌和”n-gram“生成步骤时,覆盖预处理(字符串变换)的阶段

    tokenizer:callable or None(default)

    当保留预处理和n-gram生成步骤时,覆盖字符串令牌步骤

    ngram_range: tuple(min_n, max_n)

    要提取的n-gram的n-values的下限和上限范围,在min_n <= n <= max_n区间的n的全部值

    stop_words:string {‘english‘}, list, or None(default)

    如果未english,用于英语内建的停用词列表

    如果未list,该列表被假定为包含停用词,列表中的所有词都将从令牌中删除

    如果None,不使用停用词。max_df可以被设置为范围[0.7, 1.0)的值,基于内部预料词频来自动检测和过滤停用词

    lowercase:boolean, default True

    在令牌标记前转换所有的字符为小写

    token_pattern:string

    正则表达式显示了”token“的构成,仅当analyzer == ‘word’时才被使用。两个或多个字母数字字符的正则表达式(标点符号完全被忽略,始终被视为一个标记分隔符)。

    max_df: float in range [0.0, 1.0] or int, optional, 1.0 by default

    当构建词汇表时,严格忽略高于给出阈值的文档频率的词条,语料指定的停用词。如果是浮点值,该参数代表文档的比例,整型绝对计数值,如果词汇表不为None,此参数被忽略。

    min_df:float in range [0.0, 1.0] or int, optional, 1.0 by default

    当构建词汇表时,严格忽略低于给出阈值的文档频率的词条,语料指定的停用词。如果是浮点值,该参数代表文档的比例,整型绝对计数值,如果词汇表不为None,此参数被忽略。

    max_features: optional, None by default

    如果不为None,构建一个词汇表,仅考虑max_features--按语料词频排序,如果词汇表不为None,这个参数被忽略

    vocabulary:Mapping or iterable, optional

    也是一个映射(Map)(例如,字典),其中键是词条而值是在特征矩阵中索引,或词条中的迭代器。如果没有给出,词汇表被确定来自输入文件。在映射中索引不能有重复,并且不能在0到最大索引值之间有间断。

    binary:boolean, False by default

    如果未True,所有非零计数被设置为1,这对于离散概率模型是有用的,建立二元事件模型,而不是整型计数

    dtype:type, optional

    通过fit_transform()或transform()返回矩阵的类型

    norm:‘l1‘, ‘l2‘, or None,optional

    范数用于标准化词条向量。None为不归一化

    use_idf:boolean, optional

    启动inverse-document-frequency重新计算权重

    smooth_idf:boolean,optional

    通过加1到文档频率平滑idf权重,为防止除零,加入一个额外的文档

    sublinear_tf:boolean, optional

    应用线性缩放TF,例如,使用1+log(tf)覆盖tf

    展开全文
  • tfidf_vec = TfidfVectorizer() tfidf_matrix = tfidf_vec.fit_transform(corpus) print(tfidf_vec.get_feature_names()) print(tfidf_vec.vocabulary_) ['and', 'document', 'first', 'is', 'one', 'second', 'the...

    from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer, TfidfTransformer

    corpus = [

    'This is the first document.',

    'This is the second second document.',

    'And the third one.',

    'Is this the first document?',

    ]

    CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵

    get_feature_names()可看到所有文本的关键字

    vocabulary_可看到所有文本的关键字和其位置

    toarray()可看到词频矩阵的结果

    vectorizer = CountVectorizer()

    count = vectorizer.fit_transform(corpus)

    print(vectorizer.get_feature_names())

    print(vectorizer.vocabulary_)

    print(count.toarray())

    ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']

    {'this': 8, 'is': 3, 'the': 6, 'first': 2, 'document': 1, 'second': 5, 'and': 0, 'third': 7, 'one': 4}

    [[0 1 1 1 0 0 1 0 1]

    [0 1 0 1 0 2 1 0 1]

    [1 0 0 0 1 0 1 1 0]

    [0 1 1 1 0 0 1 0 1]]

    TfidfTransformer是统计CountVectorizer中每个词语的tf-idf权值

    transformer = TfidfTransformer()

    tfidf_matrix = transformer.fit_transform(count)

    print(tfidf_matrix.toarray())

    [[ 0. 0.43877674 0.54197657 0.43877674 0. 0.

    0.35872874 0. 0.43877674]

    [ 0. 0.27230147 0. 0.27230147 0. 0.85322574

    0.22262429 0. 0.27230147]

    [ 0.55280532 0. 0. 0. 0.55280532 0.

    0.28847675 0.55280532 0. ]

    [ 0. 0.43877674 0.54197657 0.43877674 0. 0.

    0.35872874 0. 0.43877674]]

    TfidfVectorizer可以把CountVectorizer, TfidfTransformer合并起来,直接生成tfidf值

    TfidfVectorizer的关键参数:

    max_df:这个给定特征可以应用在 tf-idf 矩阵中,用以描述单词在文档中的最高出现率。假设一个词(term)在 80% 的文档中都出现过了,那它也许(在剧情简介的语境里)只携带非常少信息。

    min_df:可以是一个整数(例如5)。意味着单词必须在 5 个以上的文档中出现才会被纳入考虑。设置为 0.2;即单词至少在 20% 的文档中出现 。

    ngram_range:这个参数将用来观察一元模型(unigrams),二元模型( bigrams) 和三元模型(trigrams)。参考n元模型(n-grams)。

    tfidf_vec = TfidfVectorizer()

    tfidf_matrix = tfidf_vec.fit_transform(corpus)

    print(tfidf_vec.get_feature_names())

    print(tfidf_vec.vocabulary_)

    ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']

    {'this': 8, 'is': 3, 'the': 6, 'first': 2, 'document': 1, 'second': 5, 'and': 0, 'third': 7, 'one': 4}

    print(tfidf_matrix.toarray())

    [[ 0. 0.43877674 0.54197657 0.43877674 0. 0.

    0.35872874 0. 0.43877674]

    [ 0. 0.27230147 0. 0.27230147 0. 0.85322574

    0.22262429 0. 0.27230147]

    [ 0.55280532 0. 0. 0. 0.55280532 0.

    0.28847675 0.55280532 0. ]

    [ 0. 0.43877674 0.54197657 0.43877674 0. 0.

    0.35872874 0. 0.43877674]]

    使用gensim的corpora和models也可以实现类似的功能,

    参考:

    展开全文
  • 本次将介绍特征工程的一些常见示例:表示分类数据的特征、表示文本的特征和表示图像的特征。另外,还会介绍提高模型复杂度的衍生特征和处理缺失数据的填充方法。这个过程通常被称为向量化,因为它把任意格式的数据...
  • from sklearn.feature_extraction.text import TfidfVectorizer tfidf2 = TfidfVectorizer() re = tfidf2.fit_transform(corpus) print(re) 由于第二种方法比较的简洁,因此在实际应用中推荐使用,一步到位完成向量...
  • continue from the previous example tf.cache()idf =IDF().fit(tf) tfidf=idf.transform(tf)#... continue from the previous example tf.cache()idf = IDF(minDocFreq=2).fit(tf) tfidf= idf.transform(tf) Word2...
  • Scikit Learn如何计算tfidf的详细信息是可用的here,下面是一个使用单词n-grams实现的示例。在from sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.metrics.pairwise import cosine_...
  • 导入python jieba,在cmd中执行 pip3 install jieba ,等待完成即可。 from sklearn.feature_extraction.text import CountVectorizer import jieba con1 = jieba.cut("佛系妇女唱跳软破") con2 = jieba.cut("铁血...
  • 最后是文本变量。很遗憾Titanic数据集中没有合适的文本变量。一般我们处理文本变量的方法是,合并所有的文本形成一个变量,然后调用Count Vectorizer或者TfidfVectorizer算法,将文本数据转换成数字。...
  • u)\b\w+\b",stop_words=None,ngram_range=(2,2),analyzer='word') dt_mat = cv.fit_transform(data.cleanText) tfidf_transformer = TfidfTransformer() tfidf_mat = tfidf_transformer.fit_transform(dt_mat) 然后...
  • 基于最新2.2.0版本翻译本节介绍和特征一起工作的算法,大致分为以下几类:提取:从原始数据提取特征转换:缩放,转换,或者修改特征选择:从一个大的特征集合里面选择一个子集局部敏感哈希(LSH):这类算法能将特征...
  • data = cv.fit_transform(["人生 苦短,我 喜欢 python", "人生漫长,不用 python"]) print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": countvec() ''' 结果: ['...
  • from sklearn.datasets import fetch_20newsgroupsfrom sklearn.cross_validation import train_test_splitfrom sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizerfrom sklearn.naive_baye....
  • /usr/bin/env pythonimport mathfrom operator import itemgetterdef freq(word, document):open (r'd:\fenci.txt')return document.split(None).count(word)def wordCount(document):open (r'd:\fenci.txt')retur.....
  • /usr/bin/env pythonimport mathfrom operator import itemgetterdef freq(word, document):open (r'd:\fenci.txt')return document.split(None).count(word)def wordCount(document):open (r'd:\fenci.txt')retur.....
  • I am implementing the tf-idf algorithm in a web application using Python, however it runs extremely slow. What I basically do is:1) Create 2 dictionaries:First dictionary: key (document id), value (li...
  • python算法 tfidf

    2019-09-29 14:46:24
    98 tfidf = tf*idf # 计算TF-IDF 99 outdic[str(i)] = tfidf 100 orderdic = sorted(outdic.items(), key=operator.itemgetter( 101 1), reverse=True) # 给字典排序 102 return orderdic 103 104 105 def ...
  • 本例来自mining social webfrom math import log# XXX: Enter in a query term from the corpus variableQUERY_TERMS = ['mr.', 'green']def tf(term, doc, normalize=True):doc = doc.lower().split()if normalize:...
  • python计算tfidf

    千次阅读 2016-08-16 21:28:43
    本例来自mining social web from math import log # XXX: Enter in a query term from the corpus variable QUERY_TERMS = ['mr.', 'green'] def tf(term, doc, normalize=True): doc = doc.lower().split()

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 384
精华内容 153
关键字:

pythontfidf

python 订阅