我正在考虑在一个NLP项目上工作,使用任何编程语言(尽管Python将是我的首选)。
我想要获取两个文档,并确定它们有多相似。
发布于 2014-06-10 05:14:23
与@larsman相同,但经过了一些预处理
import nltk, string
from sklearn.feature_extraction.text import TfidfVectorizer
nltk.download('punkt') # if necessary...
stemmer = nltk.stem.porter.PorterStemmer()
remove_punctuation_map = dict((ord(char), None) for char in string.punctuation)
def stem_tokens(tokens):
return [stemmer.stem(item) for item in tokens]
'''remove punctuation, lowercase, stem'''
def normalize(text):
return stem_tokens(nltk.word_tokenize(text.lower().translate(remove_punctuation_map)))
vectorizer = TfidfVectorizer(tokenizer=normalize, stop_words='english')
def cosine_sim(text1, text2):
tfidf = vectorizer.fit_transform([text1, text2])
return ((tfidf * tfidf.T).A)[0,1]
print cosine_sim('a little bird', 'a little bird')
print cosine_sim('a little bird', 'a little bird chirps')
print cosine_sim('a little bird', 'a big dog barks')
发布于 2017-05-22 06:35:00
这是一个老问题,但我发现使用Spacy可以很容易地做到这一点。一旦读取了文档,就可以使用简单的similarity
接口来查找文档向量之间的余弦相似度。
首先安装软件包并下载模型:
pip install spacy
python -m spacy download en_core_web_sm
然后像这样使用:
import spacy
nlp = spacy.load('en_core_web_sm')
doc1 = nlp(u'Hello hi there!')
doc2 = nlp(u'Hello hi there!')
doc3 = nlp(u'Hey whatsup?')
print (doc1.similarity(doc2)) # 0.999999954642
print (doc2.similarity(doc3)) # 0.699032527716
print (doc1.similarity(doc3)) # 0.699032527716
https://stackoverflow.com/questions/8897593
复制相似问题