【发布时间】:2021-04-14 11:49:01
【问题描述】:
我想获得我的数据框和基础之间的 Jaccard 相似度。问题是我需要 500 多行,我要么收到错误消息:"too many values to unpack", 'Series' object has no attribute 'iterrows'或函数将基数与整个数据帧进行比较。
备选方案A:
sentences = pd.Series(df.sentence)
sentences = sentences.str.replace('[^A-z ]','').str.replace(' +',' ').str.strip()
splitwords = [ nltk.word_tokenize( str(sentence) ) for sentence in sentences ]
print(splitwords)
sentence = df.sentence
def Jaccard_Similarity(base, sentence):
for i, row in sentence.iterrows():
a = set(word for word in base)
b = set(word for word in df.sentence())
c = a.intersection(b)
return(float(len(c)) / (len(a) + len(b) - len(c)), a, b)
Jaccard_Similarity(base, sentence)
备选方案 B:
df = df.apply(lambda row: nltk.word_tokenize(row['sentence']), axis=1)
print(df)
def Jaccard_Similarity(bas, df):
for row in df.iterrows(df):
a = set(word for word in base)
b = set(word for word in df)
c = a.intersection(b)
return(float(len(c)) / (len(a) + len(b) - len(c)), a, b)
Jaccard_Similarity(base, df)
数据:
base = ['Tom', 'eats', 'apple']
df = (["Tom eats an apple"],
["Tom eats a pineapple"],
["Eva eats an apple"],
["Eva eats a pineapple"],
columns = 'sentence')
编辑:
base = set(base.lower().split())
df = set(df.lower().split())
def Jaccard_Similarity(base, df):
intersection = base.intersection(df)
union = base.union(df)
return float(len(intersection)) / len(union)
【问题讨论】:
-
仅供参考:如果您打算使用
'[^A-z ]'删除除 ASCII 字母和空格以外的所有字符,您应该知道[A-z]matches more than just letters。你需要[^a-zA-Z ] -
是的,理想情况下,它也会在开头删除一些对成功分类没有帮助的数字。