Python Tf idf算法

时间:2018-03-14 12:34:22

标签: python tf-idf words word-embedding

我想在一组文件中找到最相关的词语。

我想在3个文档中调用Tf Idf算法并返回包含每个单词及其频率的csv文件。

在那之后,我将只采用数量较多的那些,我将使用它们。

我发现这个实现可以满足我的需要https://github.com/mccurdyc/tf-idf/

我使用subprocess库调用该jar。但是代码中存在一个很大的问题:它在分析单词时犯了很多错误。它混合了一些单词,它与'-(我认为)有问题。我在3本书(哈利波特)的文本中使用它,例如,我在csv文件中获得了hermiones, hermionell, riddlehermione, thinghermione而不仅仅是hermione的单词。

我做错了什么吗?你能给我一个Tf idf算法的工作实现吗?是否有一个python库可以做到这一点?

1 个答案:

答案 0 :(得分:4)

以下是使用scikit-learn的Tf-idf算法的实现。 在应用之前,您可以word_tokenize()stem发言。

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from nltk import word_tokenize
from nltk.stem.porter import PorterStemmer

def tokenize(text):
    tokens = word_tokenize(text)
    stems = []
    for item in tokens: stems.append(PorterStemmer().stem(item))
    return stems

# your corpus
text = ["This is your first text book", "This is the third text for analysis", "This is another text"]
# word tokenize and stem
text = [" ".join(tokenize(txt.lower())) for txt in text]
vectorizer = TfidfVectorizer()
matrix = vectorizer.fit_transform(text).todense()
# transform the matrix to a pandas df
matrix = pd.DataFrame(matrix, columns=vectorizer.get_feature_names())
# sum over each document (axis=0)
top_words = matrix.sum(axis=0).sort_values(ascending=False)