我目前正在制作一个大的csv文件,我需要查找并打印选定行与其他行之间的相似性。例如,如果字符串为“Card”,第二个字符串为“Credit Card Debit Card”,则应返回2;或者如果第一个字符串为“Credit Card”,第二个字符串为“Credit Card Debit Card”,则应返回2它应该返回3,因为有3个单词与第一个字符串匹配.我尝试使用集合解决这个问题,但是由于集合是唯一的,并且在第一个例子中不包含重复项,所以它返回1,而不是2.因为在集合“CreditCardDebitCard”中是{“Credit”,“Card”,“Debit”}。有什么方法可以计算这个吗?相似度的公式是((numberOfSameWords)/whichStringisLonger)*100,如这张照片中所解释的:
我尝试了很多类似Jaccard Similarity的方法,但是它们都是使用集合的,并且返回错误的答案。谢谢你的帮助。我尝试运行的代码是:
def test(row1, row2):
return str(round(len(np.intersect1d(row1.split(), row2.split())) / max(len(row1.split()), len(row2.split()))*100, 2))
data = int(input("Which index should be tested:"))
for j in range(0,10):
print(test(dff['Product'].iloc[data], dff['Product'].iloc[j]))
我的 Dataframe 现在看起来像这样:
print(df.sample(10).to_dict("list"))
返回给我:
{'Product': ['Bank account or service', 'Credit card', 'Credit reporting', 'Credit reporting credit repair services or other personal consumer reports', 'Credit reporting', 'Mortgage', 'Debt collection', 'Mortgage', 'Mortgage', 'Credit reporting'], 'Issue': ['Deposits and withdrawals', 'Billing disputes', 'Incorrect information on credit report', "Problem with a credit reporting company's investigation into an existing problem", 'Incorrect information on credit report', 'Applying for a mortgage or refinancing an existing mortgage', 'Disclosure verification of debt', 'Loan servicing payments escrow account', 'Loan servicing payments escrow account', 'Incorrect information on credit report'], 'Company': ['CITIBANK NA', 'FIRST NATIONAL BANK OF OMAHA', 'EQUIFAX INC', 'Experian Information Solutions Inc', 'Experian Information Solutions Inc', 'BANK OF AMERICA NATIONAL ASSOCIATION', 'AllianceOne Recievables Management', 'SELECT PORTFOLIO SERVICING INC', 'OCWEN LOAN SERVICING LLC', 'Experian Information Solutions Inc'], 'State': ['CA', 'WA', 'FL', 'UT', 'MI', 'CA', 'WA', 'IL', 'TX', 'CA'], 'ZIP_code': ['92606', '98272', '329XX', '84321', '486XX', '94537', '984XX', '60473', '76247', '91401'], 'Complaint_ID': [90452, 2334443, 1347696, 2914771, 1788024, 2871939, 1236424, 1619712, 2421373, 1803691]}
3条答案
按热度按时间uqcuzwp81#
您可以尝试以下操作:
8e2ybdfx2#
您可以使用
numpy.intersect1d
来获取常用字,但第三行的%
是不同的。#输出:
#使用的输入:
#更新:
根据问题中的第二个给定 Dataframe ,您可以使用交叉连接(使用
pandas.DataFrame.merge
)将Product
列的每一行与同一列的其余行进行比较。试试看:
对于10行的 Dataframe /列,结果将具有100行加上一个相似性列。
bf1o4zei3#
您可以尝试:
请注意:
countCommonWords('a B c a','c b a')将返回3,
但是:
countCommonWords('c B a','a b c a')将返回4,这可能就是您的解决方案。
我们不知道您的搜索字符串是否包含重复的单词