在Python中选择彼此差异最大的字符串
好吧,这个问题可能有点奇怪,首先让我给你一个简短的背景 我正在使用,以便在给定一组可选短语的情况下生成大块文本。我在一个范围从0到10的循环中插入旋转,因此它创建了多个字符串,每个字符串都是不同的在Python中选择彼此差异最大的字符串,python,pandas,spintax,Python,Pandas,Spintax,好吧,这个问题可能有点奇怪,首先让我给你一个简短的背景 我正在使用,以便在给定一组可选短语的情况下生成大块文本。我在一个范围从0到10的循环中插入旋转,因此它创建了多个字符串,每个字符串都是不同的 for i in range(0, 10): L.append(spintax.spin( " ----<h1>{" +Title+ " - {køb online|sammenlign {priser|online supermarkederne}} v
for i in range(0, 10):
L.append(spintax.spin(
" ----<h1>{" +Title+ " - {køb online|sammenlign {priser|online supermarkederne}} via x.dk|Få din "+y+ "\
leveret til døren og spar penge via x.dk|Køb din "+y+ " online og spar penge via x.dk }\
\n \
----<h2>{{Få adgang til|vælg fra} {et stort|Danmarks største} {udvalg} af} " +y+ "<h2>\
\n \
{Når|Hvis} du {besøger|handler ind gennem|benytter|køber ind via|køber dine varer via}\
x.dk, {er det {vigtigt|væsentligt} at forstå|skal du huske|skal du vide}"))
L2.append(df['ID'][index])
df2 = pd.DataFrame(np.column_stack([L, L2]), columns=['Text' ,'ID'])
现在,每个Id有10个文本字符串。我需要把它们降到1,我的问题开始了。我想确保这些文本字符串在某种程度上彼此不同。从每个Id的这10个字符串中,我需要选择1个与其他Id的字符串不同的字符串
希望这有点道理
作为总结,如果您在途中迷路了:有没有办法比较字符串之间的相似性?比较文本字符串并选择其中差异最大的字符串的方法?在下面的数据中,索引0和2中的文本以及索引4和5中的文本在每个唯一Id中最为相似,因为它们包含彼此的文本。因此,每个Id中最不相似的是索引1和索引3
为了找到最不相似的文本,我们可以使用TF-IDF将每个文本编码为数字向量。然后,我们找到每组中每对行之间的欧几里德距离,将每行的距离相加,并假设最大平均值是最不相似的。最后,我们获取每组Id的最大平均值的索引
数据:
在:
输出:
所以这取决于你对最不同的定义。A和Z的区别比B大吗?或者你希望它是基于哪个词在其他词中没有的词最多?这也是解决问题的根本。您可以使用它,但由于您处理的是大量数据,因此这将成为一个优化问题,这可能很棘手。@MyNameIsCaleb是第一个选项。单词相似度应该很低,所以看起来不像是同一件事了。@0x5453我会研究一下,谢谢!不过,数据并没有那么大——该表大约有500行。另一方面,文本栏的内容非常大。哇,这个解决方案非常棒。非常非常感谢!
Index Text Id
0 <h1>Få din Mælk & Fløde leveret til 4169
døren og spar penge via...
1 <h1>Mælk & Fløde - køb online via x.dk 4169
....
12 <h1>Få din Yoghurt leveret til døren 4178
og spar penge via
....
| Index | Text | Id |
|-------|------------------------------------------------------------|------|
| 0 | Få din Mælk & Fløde leveret til døren og spar penge via... | 4169 |
| 1 | Mælk & Fløde - køb online via x.dk | 4169 |
| 2 | Fløde leveret til døren og spar penge via... | 4169 |
| 3 | Få din Mælk & Fløde leveret til døren og spar penge via... | 4170 |
| 4 | Mælk & Fløde - køb online via x.dk | 4170 |
| 5 | køb online via x.dk | 4170 |
from sklearn.feature_extraction.text import TfidfVectorizer
from scipy.spatial.distance import cdist
df = pd.read_clipboard()
df.columns = df.columns.str.strip()
v = TfidfVectorizer()
X = v.fit_transform(df['Text'])
df = df.join(pd.DataFrame(X.toarray()))
group = df.groupby('Id', as_index=False)
df = group.apply(lambda x : x.iloc[cdist(x.iloc[:,3:].values, x.iloc[:,3:].values).mean(axis=0).argmax()])
df[['Index', 'Text', 'Id']]
| | Index | Text | Id |
|---|-------|------------------------------------------------------------|------|
| 0 | 1 | Mælk & Fløde - køb online via x.dk | 4169 |
| 1 | 3 | Få din Mælk & Fløde leveret til døren og spar penge via... | 4170 |