Home page

Acknowledgement LF


Acknowledgement relations are signaled by words like OK, Right, Right then, Good, Fine, etc.. It's often difficult to determine whether the acknowledgment signals an understanding of what was said, an acceptance of what was said or an acceptance and a signal to change the topic of conversation or move on. It's also often difficult to determine what is being acknowledged.

LL (linguistic source -> linguistic target)

Rule(s):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def LF_Acknowledgement_LL_case1(row):
    l=0
    if (row.target_emitter in row.source_addressee.split(',') or row.source_addressee == 'All') and row.source_emitter != row.target_emitter:
        if any(x in row.target_text.lower() for x in acknowl+opinionWords+emojiManual) and row.target_surface_act == "Assertion" and row.distance==1:
            l=1
    return l

def LF_Acknowledgement_LL_case3(row):
    l=0
    if (row.target_emitter in row.source_addressee.split(',') or row.source_addressee == 'All') \
    and row.source_emitter != row.target_emitter and row.distance==1:
        if row.source_surface_act == "Assertion" \
        and any(x in row.target_text.lower() for x in ["hi", "hey", "hello"]):
            l=1
    return l

Application of rules to candidates:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#1 -- get dialogues
finals = []
dialogues = cands.dialogue_num.drop_duplicates()

for d in tqdm(dialogues):
    
    target_memo = []
 
    # 2 -- get segment list
    seg_list = get_seg_list(cands[cands.dialogue_num == d])

    # 3 -- create seg pairs list
    seg_pairs = []
    for i, s in enumerate(seg_list):
        for n in [j for j in reversed(range((i+1)-20, i+1)) if j>=0]:
            try:
                seg_pairs.append((seg_list[n], seg_list[i+1]))   
            except IndexError:
                pass
            
    # 4 -- for each pair, pull row and append rules

    for s in seg_pairs:
        row = cands[(cands.source_id == s[0]) & (cands.target_id == s[1])]
        if row.empty:
            continue
        else:
            r_index = row.index[0]
            row = row.iloc[0]
        
        # make sure that if any backwards links exist they are also 0
            
        backwards = cands[(cands.source_id == s[1]) & (cands.target_id == s[0])]
        if backwards.shape[0] > 0:
            b_index = backwards.index[0]
            finals.append((b_index, -1))
            
        
        #we only look at ling --> ling cases
        
        if row.source_type != 'Segment' or row.target_type != 'Segment':
            
            link = 0  
            
        else: 
            
            if LF_Acknowledgement_LL_case1(row) or LF_Acknowledgement_LL_case3(row):
                if row.target_id in target_memo:
                    link=0
                else:
                    link=1    
                    target_memo.append(row.target_id)
            else: 
                link = 0
   
                    
        finals.append((r_index, link))
                

NLL (non-linguistic source -> linguistic target)

Rule(s):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def LF_Acknowledgement_NL_L(row):
    #non-ling --> ling
    if ( ( itsXsTurnToBuildP(row.source_text) or satDownAtSeat(row.source_text) or wonthegame(row.source_text) or traded(row.source_text) or joinedTheGame(row.source_text) )
        and (any( x in row.target_text.lower() for x in acknowl+opinionWords+emojiManual+helloWords) ) and (row.source_emitter != row.target_emitter) and (row.distance <= 9)
        ):
            
            l=1
    else:
            l=0
    return l

Application of rules to candidates:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#1 -- get dialogues
finals = []
dialogues = cands.dialogue_num.drop_duplicates()

for d in tqdm(dialogues):
 
    # 2 -- get segment list
    seg_list = get_seg_list(cands[cands.dialogue_num == d])

    # 3 -- create seg pairs list
    seg_pairs = []
    for i, s in enumerate(seg_list):
        for n in [j for j in reversed(range((i+1)-20, i+1)) if j>=0]:
            try:
                seg_pairs.append((seg_list[n], seg_list[i+1]))   
            except IndexError:
                pass
            
    # 4 -- for each pair, pull row and append rules

    for s in seg_pairs:
        row = cands[(cands.source_id == s[0]) & (cands.target_id == s[1])]
        if row.empty:
            continue
        else:
            r_index = row.index[0]
            row = row.iloc[0]
        
        # make sure that if any backwards links exist they are also 0
            
        backwards = cands[(cands.source_id == s[1]) & (cands.target_id == s[0])]
        if backwards.shape[0] > 0:
            b_index = backwards.index[0]
            finals.append((b_index, -1))
            
        
        #we only look at ling --> ling cases
        
        if row.source_type != 'NonplayerSegment' or row.target_type != 'Segment':
            
            link = 0  
            
        else: 
        
            link_one = LF_Acknowledgement_NL_L(row)
            
            if link_one:
                
                link = 1
                
            else:
                
                link = 0
   
                    
        finals.append((r_index, link))