当字典中包含所有句子的关键字时,如何将句子与字典相关联?

时间:2019-12-26 14:47:57

标签: python python-3.x pandas loops dictionary

我有这样的句子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 个答案:

答案 0 :(得分: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和哈希码相等的集合)。 所有这些都可以加快这一过程。