当所有句子的关键字都包含在字典中时,如何将句子与字典关联?
Posted
技术标签:
【中文标题】当所有句子的关键字都包含在字典中时,如何将句子与字典关联?【英文标题】:How can i associate a sentence to a dictionary when all the sentence's keywords are contained in the dictionary? 【发布时间】:2020-04-16 18:54:05 【问题描述】:我有一个这样的句子df:
df_sentences
Answers
0 Gracias por el tiempo dedicado a compartir un...
1 Nos es grato saber que han disfrutado durante...
2 Gracias por trasladarnos su amable opinión sob...
3 Nos complace saber que tanto nuestras instala...
4 Esperamos poder darle la bienvenida de nuevo e...
... ...
225239 Nos complace leer que le hayan gustado los se...
225240 Gracias de nuevo por ilustrar su experiencia,...
225241 Reciba un cordial saludo
225242 no podemos pedirle más al año nuevo, la valo...
225243 Confiamos en poder ofrecerles nuestros servici...
我还有另一个 df,其中包含每个句子的字典,在这个字典中,有句子的关键字。每个句子的每个字典都是这样的:
'sentiment': 'document': 'score': 0.977459, 'label': 'positive',
'language': 'es',
'keywords': ['text': 'hotel Occidental',
'sentiment': 'score': 0.977459, 'label': 'positive',
'relevance': 0.79789,
'count': 1,
'text': 'Playa de Palma',
'sentiment': 'score': 0.977459, 'label': 'positive',
'relevance': 0.640675,
'count': 1,
'text': 'Gracias',
'sentiment': 'score': 0.977459, 'label': 'positive',
'relevance': 0.490027,
'count': 1,
'text': 'buena valoración',
'sentiment': 'score': 0.977459, 'label': 'positive',
'relevance': 0.485875,
'count': 1,
'text': 'comentario',
'sentiment': 'score': 0.977459, 'label': 'positive',
'relevance': 0.287868,
'count': 1,
'text': 'experiencia',
'sentiment': 'score': 0.977459, 'label': 'positive',
'relevance': 0.279029,
'count': 1]
我已经提取了每个字典的所有关键字,并将它们存储到如下列表中:
df_dicts
Dicts Keywords
0 'sentiment': 'document': 'score': 0.977459,... [hotel Occidental, Playa de Palma, Gracias, bu...
1 'sentiment': 'document': 'score': 0.868795,... [grato saber, vacaciones, futuro]
2 'sentiment': 'document': 'score': 0.908815,... [amable opinión, Gracias, trasladarnos, experi...
3 'sentiment': 'document': 'score': 0.862444,... [parte del personal del hotel, instalaciones, ...
4 'sentiment': 'document': 'score': 0.977293,... [futuro cercano, bienvenida]
... ... ...
213821 'sentiment': 'document': 'score': 0.966099,... [servicios, hotel]
213822 'sentiment': 'document': 'score': 0.992032,... [futuro próximo, Gracias, experiencia, verlos]
213823 'sentiment': 'document': 'score': 0.750927,... [cordial saludo]
我对这些数据有疑问:
每个句子都有一个字典,问题是我的句子比字典多,所以我需要找出哪些句子与哪些字典匹配。我使用的方法是编写一个程序,循环遍历句子和字典,并为每个句子检查每个关键字列表。如果列表中的所有关键字都在句子中,则匹配,应返回True
,否则返回NO或False
。
我已经尝试过这个循环,但它非常缓慢和复杂:
#Match sentences based on their keywords
answer_sentences_list=[]
for i in range(len(df_sentences.Answers)):
if((i%10000)==0):
print(i)
match=False
for j in range(df_sentences.shape[0]):
counter=0
sentence_list=[]
for keyword in df_dicts.Keywords.iloc[j]:
if(keyword in df_sentences.Answers[i]):
counter=counter+1
if(len(df_dicts.Keywords.iloc[j])==counter):
sentence_list.append(df_sentences.Answers[i])
match=True
if(match):
answer_sentences_list.append(sentence_list)
else:
answer_sentences_list.append("NO")
有没有更好/更快的方法来做到这一点?在一小时内,它循环了超过 10000 个句子/字典,我有 200000 +。如果有人可以改进此代码以使其更快或提出不同/更好的方法来实现此目标,我将非常感激。
非常感谢您
编辑:
以下是每个 df 样本的链接,供那些想在这些上玩和测试的人使用:
df_dict
df_sentences
【问题讨论】:
【参考方案1】:不要以如下方式遍历列表:
for i in range(len(df_sentences.Answers)):
answer = df_sentences.Answers[i]
...
pythonic 方式:
for answers in df_sentences.Answers:
...
并且不要通过遍历所有单词来比较此处的单词集。您可以为此使用 set 对象:
if(set(keywords) == set(answers)):
...
还有更多。您可以事先找到答案和关键字的长度,并仅比较长度相同的集合。依此类推(例如,按 len 对列表进行排序,以便提前停止比较;您也可以为这些集合制作一些哈希码并仅比较具有相等 len 和哈希码的集合)。 所有这些都应该加快这个过程。
【讨论】:
以上是关于当所有句子的关键字都包含在字典中时,如何将句子与字典关联?的主要内容,如果未能解决你的问题,请参考以下文章