Return 来自两个可变长度字符串数组的相似矩阵(scipy 选项?)
Return Similarity Matrix From Two Variable-length Arrays of Strings (scipy option?)
假设我有两个数组:
import numpy as np
arr1 = np.array(['faucet', 'faucets', 'bath', 'parts', 'bathroom'])
arr2 = np.array(['faucett', 'faucetd', 'bth', 'kichen'])
我想计算 arr2
中的字符串与 arr1
中的字符串的相似度。
arr1
是一组拼写正确的单词。
arr2
是单词字典中无法识别的单词数组。
我想要 return 一个矩阵,然后将其转换为 pandas DataFrame。
我目前的解决方案():
from scipy.spatial.distance import pdist, squareform
from Levenshtein import ratio
arr3 = np.concatenate((arr1, arr2)).reshape(-1,1)
matrix = squareform(pdist(arr3, lambda x,y: ratio(x[0], y[0])))
df = pd.DataFrame(matrix, index=arr3.ravel(), columns=arr3.ravel())
输出:
faucet faucets bath parts bathroom faucett \
faucet 0.000000 0.923077 0.400000 0.363636 0.285714 0.923077
faucets 0.923077 0.000000 0.363636 0.500000 0.266667 0.857143
bath 0.400000 0.363636 0.000000 0.444444 0.666667 0.363636
parts 0.363636 0.500000 0.444444 0.000000 0.307692 0.333333
bathroom 0.285714 0.266667 0.666667 0.307692 0.000000 0.266667
faucett 0.923077 0.857143 0.363636 0.333333 0.266667 0.000000
faucetd 0.923077 0.857143 0.363636 0.333333 0.266667 0.857143
bth 0.222222 0.200000 0.857143 0.250000 0.545455 0.200000
kichen 0.333333 0.307692 0.200000 0.000000 0.142857 0.307692
faucetd bth kichen
faucet 0.923077 0.222222 0.333333
faucets 0.857143 0.200000 0.307692
bath 0.363636 0.857143 0.200000
parts 0.333333 0.250000 0.000000
bathroom 0.266667 0.545455 0.142857
faucett 0.857143 0.200000 0.307692
faucetd 0.000000 0.200000 0.307692
bth 0.200000 0.000000 0.222222
kichen 0.307692 0.222222 0.000000
这个解决方案的问题:
我浪费时间计算我已经知道拼写正确的单词的成对距离比。
我想要的是传递一个函数 arr1
和 arr2
(可以是不同的长度!)并输出一个具有比率的矩阵(不一定是正方形)。
结果看起来像这样(没有计算开销):
>>> df.drop(index=arr1, columns=arr2)
faucet faucets bath parts bathroom
faucett 0.923077 0.857143 0.363636 0.333333 0.266667
faucetd 0.923077 0.857143 0.363636 0.333333 0.266667
bth 0.222222 0.200000 0.857143 0.250000 0.545455
kichen 0.333333 0.307692 0.200000 0.000000 0.142857
我想你在找 cdist
:
import pandas as pd
import numpy as np
from scipy.spatial.distance import cdist
from Levenshtein import ratio
arr1 = np.array(['faucet', 'faucets', 'bath', 'parts', 'bathroom'])
arr2 = np.array(['faucett', 'faucetd', 'bth', 'kichen'])
matrix = cdist(arr2.reshape(-1, 1), arr1.reshape(-1, 1), lambda x, y: ratio(x[0], y[0]))
df = pd.DataFrame(data=matrix, index=arr2, columns=arr1)
结果:
faucet faucets bath parts bathroom
faucett 0.923077 0.857143 0.363636 0.333333 0.266667
faucetd 0.923077 0.857143 0.363636 0.333333 0.266667
bth 0.222222 0.200000 0.857143 0.250000 0.545455
kichen 0.333333 0.307692 0.200000 0.000000 0.142857
假设我有两个数组:
import numpy as np
arr1 = np.array(['faucet', 'faucets', 'bath', 'parts', 'bathroom'])
arr2 = np.array(['faucett', 'faucetd', 'bth', 'kichen'])
我想计算 arr2
中的字符串与 arr1
中的字符串的相似度。
arr1
是一组拼写正确的单词。
arr2
是单词字典中无法识别的单词数组。
我想要 return 一个矩阵,然后将其转换为 pandas DataFrame。
我目前的解决方案(
from scipy.spatial.distance import pdist, squareform
from Levenshtein import ratio
arr3 = np.concatenate((arr1, arr2)).reshape(-1,1)
matrix = squareform(pdist(arr3, lambda x,y: ratio(x[0], y[0])))
df = pd.DataFrame(matrix, index=arr3.ravel(), columns=arr3.ravel())
输出:
faucet faucets bath parts bathroom faucett \
faucet 0.000000 0.923077 0.400000 0.363636 0.285714 0.923077
faucets 0.923077 0.000000 0.363636 0.500000 0.266667 0.857143
bath 0.400000 0.363636 0.000000 0.444444 0.666667 0.363636
parts 0.363636 0.500000 0.444444 0.000000 0.307692 0.333333
bathroom 0.285714 0.266667 0.666667 0.307692 0.000000 0.266667
faucett 0.923077 0.857143 0.363636 0.333333 0.266667 0.000000
faucetd 0.923077 0.857143 0.363636 0.333333 0.266667 0.857143
bth 0.222222 0.200000 0.857143 0.250000 0.545455 0.200000
kichen 0.333333 0.307692 0.200000 0.000000 0.142857 0.307692
faucetd bth kichen
faucet 0.923077 0.222222 0.333333
faucets 0.857143 0.200000 0.307692
bath 0.363636 0.857143 0.200000
parts 0.333333 0.250000 0.000000
bathroom 0.266667 0.545455 0.142857
faucett 0.857143 0.200000 0.307692
faucetd 0.000000 0.200000 0.307692
bth 0.200000 0.000000 0.222222
kichen 0.307692 0.222222 0.000000
这个解决方案的问题: 我浪费时间计算我已经知道拼写正确的单词的成对距离比。
我想要的是传递一个函数 arr1
和 arr2
(可以是不同的长度!)并输出一个具有比率的矩阵(不一定是正方形)。
结果看起来像这样(没有计算开销):
>>> df.drop(index=arr1, columns=arr2)
faucet faucets bath parts bathroom
faucett 0.923077 0.857143 0.363636 0.333333 0.266667
faucetd 0.923077 0.857143 0.363636 0.333333 0.266667
bth 0.222222 0.200000 0.857143 0.250000 0.545455
kichen 0.333333 0.307692 0.200000 0.000000 0.142857
我想你在找 cdist
:
import pandas as pd
import numpy as np
from scipy.spatial.distance import cdist
from Levenshtein import ratio
arr1 = np.array(['faucet', 'faucets', 'bath', 'parts', 'bathroom'])
arr2 = np.array(['faucett', 'faucetd', 'bth', 'kichen'])
matrix = cdist(arr2.reshape(-1, 1), arr1.reshape(-1, 1), lambda x, y: ratio(x[0], y[0]))
df = pd.DataFrame(data=matrix, index=arr2, columns=arr1)
结果:
faucet faucets bath parts bathroom
faucett 0.923077 0.857143 0.363636 0.333333 0.266667
faucetd 0.923077 0.857143 0.363636 0.333333 0.266667
bth 0.222222 0.200000 0.857143 0.250000 0.545455
kichen 0.333333 0.307692 0.200000 0.000000 0.142857