我正在尝试使用以下方法实现一个相似度函数:
- N-Gram
- TF-IDF
- 余弦相似度
概念:
words = [...]word = '...'similarity = predict(words,word)def predict(words,word): words_ngrams = create_ngrams(words,range=(2,4)) word_ngrams = create_ngrams(word,range=(2,4)) words_tokenizer = tfidf_tokenizer(words_ngrams) word_vec = words_tokenizer.transform(word) return cosine_similarity(word_ved,words_tokenizer)
我在网上搜索了一个简单且安全的实现方法,但没有找到使用已知Python包如sklearn、nltk、scipy等的实现,大多数都是使用“自制”的计算方法。
我试图避免手动编写每个步骤,我猜想对于“整个流程”应该有一个简单的解决方案。
任何帮助(和代码)都将不胜感激。谢谢:)
回答:
最终我找到了解决方法…
对于那些需要解决这个问题的朋友,这里是我编写的一个函数,可以处理这个问题…
'''### N-Gram & TD-IDF & 余弦相似度使用'from列'上的N-Gram与TF-IDF来预测'to列'。向数据框添加一个包含数值结果的'cosine_similarity'特征。'''def add_prediction_by_ngram_tfidf_cosine( from_column_name,ngram_range=(2,4) ): global df from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity vectorizer = TfidfVectorizer( analyzer='char',ngram_range=ngram_range ) vectorizer.fit(df.FromColumn) w = from_column_name vec_word = vectorizer.transform([w]) df['vec'] = df.FromColumn.apply(lambda x : vectorizer.transform([x])) df['cosine_similarity'] = df.vec.apply(lambda x : cosine_similarity(x,vec_word)[0][0]) df = df.drop(['vec'],axis=1)
注意:这还不是生产就绪的版本