Python SciKit Learn中的TFIDF矢量器仅返回5个结果

Python SciKit Learn中的TFIDF矢量器仅返回5个结果,python,pandas,dataframe,scikit-learn,tfidfvectorizer,Python,Pandas,Dataframe,Scikit Learn,Tfidfvectorizer,我目前正在使用SciKit Learn中的TFIDF矢量器。矢量器应该应用一个公式来检测数据帧中最频繁的词对(bigram) 但是,下面的代码部分仅返回五个bigram的频率分析,而数据集包含数千个bigram,应计算这些bigram的频率 有没有人有一个聪明的想法来摆脱我的错误,即将计算数量限制为5个响应?我一直在研究解决方案,但还没有找到正确的调整 相关代码部分如下所示: def get_top_n_bigram_Group2(corpus, n=None): # settings

我目前正在使用SciKit Learn中的TFIDF矢量器。矢量器应该应用一个公式来检测数据帧中最频繁的词对(bigram)

但是,下面的代码部分仅返回五个bigram的频率分析,而数据集包含数千个bigram,应计算这些bigram的频率

有没有人有一个聪明的想法来摆脱我的错误,即将计算数量限制为5个响应?我一直在研究解决方案,但还没有找到正确的调整

相关代码部分如下所示:

def get_top_n_bigram_Group2(corpus, n=None):

    # settings that you use for count vectorizer will go here
    tfidf_vectorizer=TfidfVectorizer(ngram_range=(2, 2), stop_words='english', use_idf=True).fit(corpus)

    # just send in all your docs here
    tfidf_vectorizer_vectors=tfidf_vectorizer.fit_transform(corpus)

    # get the first vector out (for the first document)
    first_vector_tfidfvectorizer=tfidf_vectorizer_vectors[0]

    # place tf-idf values in a pandas data frame
    df1 = pd.DataFrame(first_vector_tfidfvectorizer.T.todense(), index=tfidf_vectorizer.get_feature_names(), columns=["tfidf"])
    df2 = df1.sort_values(by=["tfidf"],ascending=False)

    return df2
输出代码如下所示:

for i in ['txt_pro','txt_con','txt_adviceMgmt','txt_main']:
    # Loop over the common words inside the JSON object
    common_words = get_top_n_bigram_Group2(df[i], 500)
    common_words.to_csv('output.csv')

为实现您的要求并考虑您的意见,建议的变更如下:


如果在
get\u top\u n\u bigram\u Group2()
中没有提供
my\u词汇表
参数,那么
CountVectorizer
将不受任何限制地计算所有bigram,并只返回前500个(或第二个参数中请求的任何数字)

请让我知道这是否是你要找的。 请注意,返回的不是频率,而是分数(或者如果您更喜欢“权重”)


如果您没有预定义的bigram列表,并且您正在寻找一种在所有可能的bigram中打分的方法,并且希望拒绝出现在所有文档中且信息能力很小的那些bigram(例如,bigram“it is”在文本中出现得非常频繁,但意义非常小),我会理解使用TFIDF的必要性.

您的问题中有许多问题需要澄清。1) 你是在寻找最常见的大人物吗?如果是,您可能需要CountVectorizer,而不是TFIDF。如果确实需要TFIDF,请忽略此问题。2) 为什么只对第一个向量起作用?这只表示输入数据的一行。3) 请明确说明您想要的输出是什么?目前,您的代码的输出是语料库第一个文档/行中包含的bigram及其TFIDF分数。感谢非常有用的输入。我计划对给定集合中的一些预定义的bigram进行科学的频率测量。在这方面,我读到TFIDF是最可行的方法。让我再看看你提到的向量点。理想情况下,输出将是一个完整的双随机码频率的科学列表(虽然我已经用一个单独的函数计算了每个双随机码的出现次数),并且可以选择只对预先选择的双随机码列表应用这样的频率计数。任何帮助都将不胜感激。我仍然不明白您为什么需要使用TFIDF。如果您需要计算预定义bigram的频率,可以使用带有预定义词汇表的CountVectorizer。请查看我的答案以获得建议。非常感谢您的帮助。我使用的是带有特定词汇表的CountVectorizer(工作良好)和TFIDF矢量器。原因是科学文献使用公式
wi,j=tfi,j×log(N/dfi)
确定频率,其中
wi,j
是文档
j
中单词
i
的权重,
tfi,j
是文档
j
中单词
i
的词频,
dfi
是术语
i
在整个语料库中的文档频率,
N
是语料库中的文档数量。术语频率逆文档频率(TF-IDF)专门解决了词袋方法的弱点,即普通词与高词频的干扰。TF是一个单词出现在文档中的频率,IDF表示语料库中包含某个单词的文本的比例。如果你说
CountVectorizer
在科学上足以进行分析,我会很乐意考虑这一点。我不是说你应该使用CountVectorizer而不是TfidfVectorizer。如果您有特定的词汇表,也可以将其与TfidfVectorizer一起使用。如果你能加强你的问题使事情更清楚,我也许能帮你更多。这是可以理解的。具体来说,我正在使用一个大型数据框架,其中包括员工在Glassdoor.com上对公司的正面和负面评论。在这种情况下,我想重点关注在各自的赞成/反对类别中某些重大事件的变化(科学)发生情况。希望这有助于澄清背景。。。
def get_top_n_bigram_Group2(corpus, n=None, my_vocabulary=None):

    # settings that you use for count vectorizer will go here
    count_vectorizer=CountVectorizer(ngram_range=(2, 2), 
                                     stop_words='english', 
                                     vocabulary=my_vocabulary,
                                     max_features=n)

    # just send in all your docs here
    count_vectorizer_vectors=count_vectorizer.fit_transform(corpus)

    # Create a list of (bigram, frequency) tuples sorted by their frequency
    sum_bigrams = count_vectorizer_vectors.sum(axis=0) 
    bigram_freq = [(bigram, sum_bigrams[0, idx]) for bigram, idx in count_vectorizer.vocabulary_.items()]
    
    # place bigrams and their frequencies in a pandas data frame
    df1 = pd.DataFrame(bigram_freq, columns=["bigram", "frequency"]).set_index("bigram")
    df1 = df1.sort_values(by=["frequency"],ascending=False)

    return df1

# a list of predefined bigrams
my_vocabulary = ['bigram 1', 'bigram 2', 'bigram 3']
for i in ['text']:
    # Loop over the common words inside the JSON object
    common_words = get_top_n_bigram_Group2(df[i], 500, my_vocabulary)
    common_words.to_csv('output.csv')