From af386efbbe603c0a5cbe38e76edb036fabfb5c08 Mon Sep 17 00:00:00 2001 From: Xinlan Emily Hu Date: Thu, 29 May 2025 14:34:32 -0400 Subject: [PATCH 01/16] log features that are not yet tested --- tests/test_feature_metrics.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/tests/test_feature_metrics.py b/tests/test_feature_metrics.py index 53a9e7c9..a741368b 100644 --- a/tests/test_feature_metrics.py +++ b/tests/test_feature_metrics.py @@ -41,14 +41,23 @@ num_tested_chat = test_chat_df['expected_column'].nunique() + test_chat_complex_df['feature'].nunique() + test_forward_flow_df['feature'].nunique() test_chat = test_chat_df['expected_column'].unique().tolist() + test_chat_complex_df['feature'].unique().tolist() + \ test_forward_flow_df['feature'].unique().tolist() + ["named_entities"] + ["time_diff"] -tested_chat = len(set(test_chat)) -num_tested_conv = len(set(test_conv_df['expected_column'].unique().tolist() + test_conv_complex_df['feature'].unique().tolist())) +num_tested_chat = len(set(test_chat)) +test_conv = test_conv_df['expected_column'].unique().tolist() + test_conv_complex_df['feature'].unique().tolist() +num_tested_conv = len(set(test_conv)) tested_features = {} with open('test.log', 'w') as f: - f.write(f'Tested {tested_chat} features out of {num_features_chat} chat level features: {tested_chat/num_features_chat * 100:.2f}% Coverage!\n') + f.write(f'Tested {num_tested_chat} features out of {num_features_chat} chat level features: {num_tested_chat/num_features_chat * 100:.2f}% Coverage!\n') + + if(num_tested_chat < num_features_chat): + untested_chat_features = set(itertools.chain(*chat_features)).difference(set(test_chat)) + f.write(f"Currently untested chat features: {untested_chat_features}\n") + f.write(f'Tested {num_tested_conv} features out of {num_features_conv} conv level features: {num_tested_conv/num_features_conv * 100:.2f}% Coverage!\n') - pass + + if(num_tested_conv < num_features_conv): + untested_conv_features = set(itertools.chain(*conversation_features)).difference(set(test_chat)) + f.write(f"Currently untested chat features: {untested_conv_features}\n") # ---- MAIN TESTS ------ From a60720cc85ed0818a3034f20be08f92670eb15ea Mon Sep 17 00:00:00 2001 From: sundy1994 Date: Fri, 6 Jun 2025 10:40:46 -0700 Subject: [PATCH 02/16] Drop unhashable columns from orig_data; Use print instead of warnings.warn for warning message --- src/team_comm_tools/feature_builder.py | 1 + src/team_comm_tools/utils/preprocess.py | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/team_comm_tools/feature_builder.py b/src/team_comm_tools/feature_builder.py index 759bfbda..02c40ba9 100644 --- a/src/team_comm_tools/feature_builder.py +++ b/src/team_comm_tools/feature_builder.py @@ -577,6 +577,7 @@ def preprocess_chat_data(self) -> None: # create the appropriate grouping variables and assert the columns are present self.chat_data = preprocess_conversation_columns(self.chat_data, self.column_names, self.grouping_keys, self.cumulative_grouping, self.within_task) self.chat_data = remove_unhashable_cols(self.chat_data, self.column_names) + self.orig_data = remove_unhashable_cols(self.orig_data, self.column_names, warning=False) # remove unhashable columns from the original data too to avoid issues with drop_duplicates # save original column with no preprocessing self.chat_data[self.message_col + "_original"] = self.chat_data[self.message_col] diff --git a/src/team_comm_tools/utils/preprocess.py b/src/team_comm_tools/utils/preprocess.py index 18a31b1d..82a63726 100644 --- a/src/team_comm_tools/utils/preprocess.py +++ b/src/team_comm_tools/utils/preprocess.py @@ -38,7 +38,7 @@ def preprocess_conversation_columns(df: pd.DataFrame, column_names: dict, groupi df = df[df.columns.tolist()[-1:] + df.columns.tolist()[0:-1]] # make the new column first return df -def remove_unhashable_cols(df: pd.DataFrame, column_names: dict) -> pd.DataFrame: +def remove_unhashable_cols(df: pd.DataFrame, column_names: dict, warning: bool=True) -> pd.DataFrame: """ If a required column contains unhashable types, raise an error. Otherwise, remove those columns from the DataFrame and print a warning message. @@ -81,8 +81,9 @@ def is_unhashable(obj): if col in column_names.values(): raise ValueError(error_message) else: - warnings.warn(f"WARNING: {error_message}. Removing '{col}' from the DataFrame.") removable_cols.append(col) + if warning: + print(f"WARNING: {error_message}. Removing '{col}' from the DataFrame.") if removable_cols: df = df.drop(columns=removable_cols) return df From 3cadd01958e4e94c3081e4bc59eb360ab5c5da95 Mon Sep 17 00:00:00 2001 From: sundy1994 Date: Mon, 9 Jun 2025 14:54:33 -0700 Subject: [PATCH 03/16] Fixes #359 --- src/team_comm_tools/feature_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/team_comm_tools/feature_builder.py b/src/team_comm_tools/feature_builder.py index 02c40ba9..8daafe58 100644 --- a/src/team_comm_tools/feature_builder.py +++ b/src/team_comm_tools/feature_builder.py @@ -152,7 +152,7 @@ def __init__( raise TypeError(f"Expected a Pandas DataFrame as input_df, but got {type(df).__name__})") print("Initializing Featurization...") - + input_df = input_df.reset_index(drop=True) # reset index to avoid issues with indexing later on ###### Set all parameters ###### assert(all(0 <= x <= 1 for x in analyze_first_pct)) # first, type check that this is a list of numbers between 0 and 1 From 995c78ba6f2cce84eafd9b357ed4df4b1e2e23a8 Mon Sep 17 00:00:00 2001 From: sundy1994 Date: Thu, 12 Jun 2025 16:18:35 -0700 Subject: [PATCH 04/16] Enhance emoji detection by utilizing a predefined emoji list and updating related tests --- src/team_comm_tools/features/reddit_tags.py | 9 ++- src/team_comm_tools/utils/preprocess.py | 21 ++++--- tests/data/cleaned_data/test_chat_level.csv | 61 +++++++++++++++++++++ 3 files changed, 81 insertions(+), 10 deletions(-) diff --git a/src/team_comm_tools/features/reddit_tags.py b/src/team_comm_tools/features/reddit_tags.py index 8a191bad..eee272e3 100644 --- a/src/team_comm_tools/features/reddit_tags.py +++ b/src/team_comm_tools/features/reddit_tags.py @@ -1,7 +1,7 @@ import numpy as np import string import re - +from team_comm_tools.utils.preprocess import EMOJIS def count_all_caps(text): """ @@ -191,6 +191,9 @@ def count_emojis(text): Returns: int: The number of emojis in the input text. """ - emoji_pattern = r'[:;]-?\)+' - emojis = re.findall(emoji_pattern, text) + # emoji_pattern = r'[:;]-?\)+' + emoji_list = sorted(EMOJIS, key=len, reverse=True) + emoji_pattern = "|".join(re.escape(e) for e in emoji_list) + compiled_pattern = re.compile(emoji_pattern) + emojis = re.findall(compiled_pattern, text) return len(emojis) diff --git a/src/team_comm_tools/utils/preprocess.py b/src/team_comm_tools/utils/preprocess.py index 82a63726..0234eba8 100644 --- a/src/team_comm_tools/utils/preprocess.py +++ b/src/team_comm_tools/utils/preprocess.py @@ -1,7 +1,16 @@ import re import pandas as pd -import warnings - +# import warnings + +EMOJIS = { + "(:", "(;", "):", "/:", ":(", ":)", ":/", ";)", # 8 emojis from LIWC 2017 + ";(", # variants + ":-)", ":-(", ":-/", ";-)", # with noses + ":D", ":P", ":p", ":-D", ":-P", ":-p", # big grin & tongue out + ":O", ":-O", ":o", ":-o", # shock + "XD", "xD", "xd", # laughing variants + "<3", " pd.DataFrame: @@ -112,13 +121,10 @@ def preprocess_text(text: str) -> str: :return: The processed text containing only alphanumeric characters and spaces in lowercase. :rtype: str """ - emojis_to_preserve = { - "(:", "(;", "):", "/:", ":(", ":)", ":/", ";)" - } emoji_placeholders = {} # Replace each emoji with a unique placeholder - for i, emoji in enumerate(emojis_to_preserve): + for i, emoji in enumerate(EMOJIS): placeholder = f"EMOJI_{i}" emoji_placeholders[placeholder] = emoji text = text.replace(emoji, placeholder) @@ -126,7 +132,8 @@ def preprocess_text(text: str) -> str: # Clean the text by removing unwanted characters, except placeholders text = re.sub(r"[^a-zA-Z0-9 EMOJI_]+", '', text) # Restore the preserved emojis by replacing placeholders back to original emojis - for placeholder, emoji in emoji_placeholders.items(): + for placeholder in sorted(emoji_placeholders.keys(), key=len, reverse=True): + emoji = emoji_placeholders[placeholder] text = text.replace(placeholder, emoji) return text.lower() diff --git a/tests/data/cleaned_data/test_chat_level.csv b/tests/data/cleaned_data/test_chat_level.csv index fb8dc8e0..115e32c2 100644 --- a/tests/data/cleaned_data/test_chat_level.csv +++ b/tests/data/cleaned_data/test_chat_level.csv @@ -1332,3 +1332,64 @@ K,1,This is the same text.,positivity_zscore_conversation, 10_mix,first_person,"belief% sed— forgot{ euismod£ dolor/ couldn't¥ ipsum^ amet— affectation] Lorem> ipsum} drank^ Lorem) sed' forever[ amet/ mailed? euismod< sed? mightve[ dolor[ sed; affect' dolor> sed\ consistently' Lorem| euismod: may: tempor, colon( ipsum# xanax¥ dolor] cruel, amet... think– dolor< tempor, strikingly% euismod< cocks£ ipsum~ insides! ipsum. aren't- Lorem. sandy% adipiscing... consectetur) illuminating+ amet# steadiness= euismod¥ sed( except~ consectetur' tempor) most} adipiscing? here's"" tempor' dolor# understand; sed{ ipsum",first_person_lexical_wordcount,0 10_mix,nltk_english_stopwords,"belief% sed— forgot{ euismod£ dolor/ couldn't¥ ipsum^ amet— affectation] Lorem> ipsum} drank^ Lorem) sed' forever[ amet/ mailed? euismod< sed? mightve[ dolor[ sed; affect' dolor> sed\ consistently' Lorem| euismod: may: tempor, colon( ipsum# xanax¥ dolor] cruel, amet... think– dolor< tempor, strikingly% euismod< cocks£ ipsum~ insides! ipsum. aren't- Lorem. sandy% adipiscing... consectetur) illuminating+ amet# steadiness= euismod¥ sed( except~ consectetur' tempor) most} adipiscing? here's"" tempor' dolor# understand; sed{ ipsum",nltk_english_stopwords_lexical_wordcount,5 10_mix,hedge_words,"belief% sed— forgot{ euismod£ dolor/ couldn't¥ ipsum^ amet— affectation] Lorem> ipsum} drank^ Lorem) sed' forever[ amet/ mailed? euismod< sed? mightve[ dolor[ sed; affect' dolor> sed\ consistently' Lorem| euismod: may: tempor, colon( ipsum# xanax¥ dolor] cruel, amet... think– dolor< tempor, strikingly% euismod< cocks£ ipsum~ insides! ipsum. aren't- Lorem. sandy% adipiscing... consectetur) illuminating+ amet# steadiness= euismod¥ sed( except~ consectetur' tempor) most} adipiscing? here's"" tempor' dolor# understand; sed{ ipsum",hedge_words_lexical_wordcount,0 +emoji_test,emoji_user_a,Hello :),num_emoji,1 +emoji_test,emoji_user_b,Nice to see you :-)),num_emoji,1 +emoji_test,emoji_user_a,Hey there ;-) How are you? :),num_emoji,2 +emoji_test,emoji_user_b,No emoji here.,num_emoji,0 +emoji_test,emoji_user_a,;) :) :-))),num_emoji,3 +emoji_test,emoji_user_b,Mixed emotions: :-( ;( :( ,num_emoji,3 +emoji_test,emoji_user_a,Too many smiles :) :) :),num_emoji,3 +emoji_test,emoji_user_b,Tricky one: :-)-),num_emoji,1 +emoji_test,emoji_user_a,Extra characters :-))abc:-),num_emoji,2 +emoji_test,emoji_user_b,Combo ;-):-);-),num_emoji,3 +emoji_test,emoji_user_a,Sad day :(,num_emoji,1 +emoji_test,emoji_user_b,Confused face :/,num_emoji,1 +emoji_test,emoji_user_a,Double smiles :) :),num_emoji,2 +emoji_test,emoji_user_b,This is fine :D,num_emoji,1 +emoji_test,emoji_user_a,Edge case :-):-):-D,num_emoji,3 +emoji_test,emoji_user_b,Broken smile :-))abc:-),num_emoji,2 +emoji_test,emoji_user_a,Mixed (: ;),num_emoji,2 +emoji_test,emoji_user_b,Only symbols $%&!,num_emoji,0 +emoji_test,emoji_user_a,Nested :)hello:),num_emoji,2 +emoji_test,emoji_user_b,Sad then happy :( :),num_emoji,2 +emoji_test,emoji_user_a,No spaces:;-):),num_emoji,2 +emoji_test,emoji_user_b,Triple threat :):):),num_emoji,3 +emoji_test,emoji_user_a,Reverse smile ): (:,num_emoji,2 +emoji_test,emoji_user_b,"Hey! I'm doing great :-), thanks for asking. How about you? ;)",num_emoji,2 +emoji_test,emoji_user_a,Ugh... today was rough :( Everything just kept going wrong :-(,num_emoji,2 +emoji_test,emoji_user_b,LOL! That was hilarious :D:D:D!! Can't stop laughing!,num_emoji,3 +emoji_test,emoji_user_a,Okay... so he said 'I'll be there :)' — and then never showed up.,num_emoji,1 +emoji_test,emoji_user_b,"Meeting recaD: +- Client happy :) +- Budget approved ;) +- Launch on track :-D",num_emoji,3 +emoji_test,emoji_user_a,"Meeting recap: +- Client happy :) +- Budget approved ;) +- Launch on track :-D",num_emoji,3 +emoji_test,emoji_user_b,Mixed signals: first he smiled :) then frowned :( then smiled again :)),num_emoji,3 +emoji_test,emoji_user_a,Edge-case test —;-):-(;-))... any of these match?,num_emoji,3 +emoji_test,emoji_user_b,"Email thread: +> Sure, that works for me :) +> Thanks! :-) +> See you then ;)",num_emoji,3 +emoji_test,emoji_user_a,Total chaos!!! :(( :(( :(( — but at least coffee :-),num_emoji,4 +emoji_test,emoji_user_b,"He walked in and said, 'Good morning :-)' — like nothing happened!",num_emoji,1 +emoji_test,emoji_user_a,Haha :D that was funny!,num_emoji,1 +emoji_test,emoji_user_b,You got me :-P,num_emoji,1 +emoji_test,emoji_user_a,Just kidding :p :P,num_emoji,2 +emoji_test,emoji_user_b,All the reactions: :D :-D :P :-P,num_emoji,4 +emoji_test,emoji_user_a,Lowercase alert :-p :p,num_emoji,2 +emoji_test,emoji_user_b,No way! :O,num_emoji,1 +emoji_test,emoji_user_a,You're kidding :-O,num_emoji,1 +emoji_test,emoji_user_b,Mixed shock faces: :o :-o,num_emoji,2 +emoji_test,emoji_user_a,Wow :O :o :-O :-o,num_emoji,4 +emoji_test,emoji_user_b,OMG XD that cracked me up,num_emoji,1 +emoji_test,emoji_user_a,xD lol,num_emoji,1 +emoji_test,emoji_user_b,xd XD xD,num_emoji,3 +emoji_test,emoji_user_a,Try this combo: xdxd,num_emoji,2 +emoji_test,emoji_user_b,Real XDPro was here,num_emoji,1 +emoji_test,emoji_user_a,I love this <3,num_emoji,1 +emoji_test,emoji_user_b,Broken heart Date: Thu, 12 Jun 2025 18:10:13 -0700 Subject: [PATCH 05/16] use original message column for emoji counting to include edge cases like "XD" and ":D" --- src/team_comm_tools/utils/calculate_chat_level_features.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/team_comm_tools/utils/calculate_chat_level_features.py b/src/team_comm_tools/utils/calculate_chat_level_features.py index 052662a2..051544b7 100644 --- a/src/team_comm_tools/utils/calculate_chat_level_features.py +++ b/src/team_comm_tools/utils/calculate_chat_level_features.py @@ -470,7 +470,8 @@ def get_reddit_features(self) -> None: count_ellipses) self.chat_data["num_parentheses"] = self.chat_data["message_lower_with_punc"].apply( count_parentheses) - self.chat_data["num_emoji"] = self.chat_data["message_lower_with_punc"].apply( + self.chat_data["num_emoji"] = self.chat_data[self.message_col + + "_original"].apply( count_emojis) def get_named_entity(self) -> None: From 227931a30c8392c1392effe3d03073964e63b0a5 Mon Sep 17 00:00:00 2001 From: sundy1994 Date: Mon, 16 Jun 2025 19:00:22 -0700 Subject: [PATCH 06/16] Add politeness-related test cases --- tests/data/cleaned_data/test_chat_level.csv | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/data/cleaned_data/test_chat_level.csv b/tests/data/cleaned_data/test_chat_level.csv index 115e32c2..b8055262 100644 --- a/tests/data/cleaned_data/test_chat_level.csv +++ b/tests/data/cleaned_data/test_chat_level.csv @@ -1393,3 +1393,24 @@ emoji_test,emoji_user_a,I love this <3,num_emoji,1 emoji_test,emoji_user_b,Broken heart Date: Tue, 17 Jun 2025 11:13:12 -0700 Subject: [PATCH 07/16] Add receptiveness-yeomans related test cases --- tests/data/cleaned_data/test_chat_level.csv | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/data/cleaned_data/test_chat_level.csv b/tests/data/cleaned_data/test_chat_level.csv index b8055262..6688f9c7 100644 --- a/tests/data/cleaned_data/test_chat_level.csv +++ b/tests/data/cleaned_data/test_chat_level.csv @@ -1414,3 +1414,15 @@ convokit_test,convokit_user_b,You've reverted yourself to the previous version., convokit_test,convokit_user_a,I suggest we start with the basics.,hedges_politeness_convokit,1 convokit_test,convokit_user_b,"In fact you did link, and it was a mistake.",factuality_politeness_convokit,1 convokit_test,convokit_user_a,"We could meet tomorrow, or maybe not.",hashedge_politeness_convokit,1 +yeomans_test,yeomans_user_a,What the fuck are you doing?,Swearing_receptiveness_yeomans,1 +yeomans_test,yeomans_user_b,"Don’t worry, it's no big deal.",Reassurance_receptiveness_yeomans,1 +yeomans_test,yeomans_user_a,"This is, um, you know, a complicated scenario",Filler_Pause_receptiveness_yeomans,1 +yeomans_test,yeomans_user_b,Please let me know if you have any questions.,Let_Me_Know_receptiveness_yeomans,1 +yeomans_test,yeomans_user_a,"If you'd like, you could review this.",Give_Agency_receptiveness_yeomans,1 +yeomans_test,yeomans_user_b,"Honestly, I don't know",Truth_Intensifier_receptiveness_yeomans,1 +yeomans_test,yeomans_user_a,"Do me a favor, can you review this by tomorrow?",Ask_Agency_receptiveness_yeomans,1 +yeomans_test,yeomans_user_b,Send me the file.,Bare_Command_receptiveness_yeomans,1 +yeomans_test,yeomans_user_a,Bye I'll see you tomorrow,Goodbye_receptiveness_yeomans,1 +yeomans_test,yeomans_user_b,By the way how do you call this?,By_The_Way_receptiveness_yeomans,1 +yeomans_test,yeomans_user_a,"Dear Mr. Smith, thank you for your feedback.",Formal_Title_receptiveness_yeomans,1 +yeomans_test,yeomans_user_b,Dude that was dope,Informal_Title_receptiveness_yeomans,1 From 859f0e151023acf0151f3983fc4f24b9e3576776 Mon Sep 17 00:00:00 2001 From: sundy1994 Date: Tue, 17 Jun 2025 14:46:31 -0700 Subject: [PATCH 08/16] Add missing column "num_line_breaks"; Improve feature counting method; Add tests for 'num_named_entity' --- src/team_comm_tools/feature_dict.py | 1 + tests/test_feature_metrics.py | 38 +++++++++++++++++------------ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/team_comm_tools/feature_dict.py b/src/team_comm_tools/feature_dict.py index 63100e68..69885759 100644 --- a/src/team_comm_tools/feature_dict.py +++ b/src/team_comm_tools/feature_dict.py @@ -480,6 +480,7 @@ "num_emphasis", "num_bullet_points", "num_numbered_points", + "num_line_breaks", "num_quotes", "num_block_quote_responses", "num_ellipses", diff --git a/tests/test_feature_metrics.py b/tests/test_feature_metrics.py index a741368b..c15b724a 100644 --- a/tests/test_feature_metrics.py +++ b/tests/test_feature_metrics.py @@ -26,21 +26,28 @@ "./output/conv/test_conv_level_conv_complex_ts.csv") test_forward_flow_df = pd.read_csv("./output/chat/test_forward_flow_chat.csv") test_ner = pd.read_csv('./output/chat/test_named_entity_chat_level.csv') - +test_positivity_chat_df = pd.read_csv( + "./output/chat/test_positivity_chat_level.csv") +info_exchange_zscore_chat_df = pd.read_csv( + "./output/chat/info_exchange_zscore_chats.csv") +time_diff_chat_df = pd.read_csv( + './output/chat/test_time_pairs_dt_level_chat.csv') # Import the Feature Dictionary -chat_features = [feature_dict[feature]["columns"] - for feature in feature_dict.keys() if feature_dict[feature]["level"] == "Chat"] -conversation_features = [feature_dict[feature]["columns"] for feature in feature_dict.keys( -) if feature_dict[feature]["level"] == "Conversation"] - -num_features_chat = len(list(itertools.chain(*chat_features))) -num_features_conv = len(list(itertools.chain(*conversation_features))) +chat_features, conversation_features = [], [] +for feature in feature_dict.keys(): + if feature_dict[feature]["level"] == "Chat": + chat_features.extend(feature_dict[feature]["columns"]) + elif feature_dict[feature]["level"] == "Conversation": + conversation_features.extend(feature_dict[feature]["columns"]) +num_features_chat = len(chat_features) +num_features_conv = len(conversation_features) # Print the test coverage -num_tested_chat = test_chat_df['expected_column'].nunique() + test_chat_complex_df['feature'].nunique() + test_forward_flow_df['feature'].nunique() test_chat = test_chat_df['expected_column'].unique().tolist() + test_chat_complex_df['feature'].unique().tolist() + \ - test_forward_flow_df['feature'].unique().tolist() + ["named_entities"] + ["time_diff"] + test_forward_flow_df['feature'].unique().tolist() + test_positivity_chat_df['expected_column'].unique().tolist() + \ + info_exchange_zscore_chat_df['expected_column'].unique().tolist() + time_diff_chat_df['expected_column'].unique().tolist() + \ + ["named_entities"] + ["num_named_entity"] # These 2 are tested in test_named_entity_recognition() num_tested_chat = len(set(test_chat)) test_conv = test_conv_df['expected_column'].unique().tolist() + test_conv_complex_df['feature'].unique().tolist() num_tested_conv = len(set(test_conv)) @@ -50,13 +57,13 @@ f.write(f'Tested {num_tested_chat} features out of {num_features_chat} chat level features: {num_tested_chat/num_features_chat * 100:.2f}% Coverage!\n') if(num_tested_chat < num_features_chat): - untested_chat_features = set(itertools.chain(*chat_features)).difference(set(test_chat)) + untested_chat_features = set(chat_features).difference(set(test_chat)) f.write(f"Currently untested chat features: {untested_chat_features}\n") f.write(f'Tested {num_tested_conv} features out of {num_features_conv} conv level features: {num_tested_conv/num_features_conv * 100:.2f}% Coverage!\n') if(num_tested_conv < num_features_conv): - untested_conv_features = set(itertools.chain(*conversation_features)).difference(set(test_chat)) + untested_conv_features = set(conversation_features).difference(set(test_chat)) f.write(f"Currently untested chat features: {untested_conv_features}\n") # ---- MAIN TESTS ------ @@ -119,6 +126,7 @@ def test_named_entity_recognition(row): file.write(f"Actual value: {actual}\n") else: expected = row[1]['expected_value'].split(',') + num_named_entity = row[1]['num_named_entity'] parsed_actual = row[1]['named_entities'].replace( " ", "").replace("(", "").replace(")", "").split(',') actual = parsed_actual[0::2] @@ -128,7 +136,7 @@ def test_named_entity_recognition(row): actual.pop() try: - assert len(expected) == len(actual) + assert len(expected) == len(actual) == num_named_entity for named_entity in expected: assert named_entity.lower().strip() in actual tested_features["Named Entity Recognition"]['passed'] += 1 @@ -139,8 +147,8 @@ def test_named_entity_recognition(row): file.write("------TEST FAILED------\n") file.write( f"Testing NER for message: {row[1]['message_original']}\n") - file.write(f"Expected value: {expected}\n") - file.write(f"Actual value: {actual}\n") + file.write(f"Expected value: {expected}; Expected num: {len(expected)}\n") + file.write(f"Actual value: {actual}; Actual num: {len(actual)}; Num counted: {num_named_entity}\n") # we don't raise an AssertionError here because NER isn't a perfect feature From a0ccdcc26b9a57007f88fcc0656b87953ba72214 Mon Sep 17 00:00:00 2001 From: sundy1994 Date: Mon, 23 Jun 2025 15:30:19 -0700 Subject: [PATCH 09/16] Refactor bert generation to optimize RAM usage --- src/team_comm_tools/utils/check_embeddings.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/team_comm_tools/utils/check_embeddings.py b/src/team_comm_tools/utils/check_embeddings.py index f0b364c4..b3de8761 100644 --- a/src/team_comm_tools/utils/check_embeddings.py +++ b/src/team_comm_tools/utils/check_embeddings.py @@ -402,16 +402,21 @@ def generate_bert(chat_data, output_path, message_col, batch_size=64): print(f"Generating RoBERTa sentiments...") messages = chat_data[message_col].tolist() - batch_sentiments_df = pd.DataFrame() + # batch_sentiments_df = pd.DataFrame() + Path(output_path).parent.mkdir(parents=True, exist_ok=True) + first = True for i in tqdm(range(0, len(messages), batch_size)): batch = messages[i:i + batch_size] batch_df = get_sentiment(batch) - batch_sentiments_df = pd.concat([batch_sentiments_df, batch_df], ignore_index=True) + batch_df.to_csv(output_path, mode='a', header=first, index=False) + first = False + # batch_sentiments_df = pd.concat([batch_sentiments_df, batch_df], ignore_index=True) + # batch_sentiments_df = pd.concat(batch_sentiments_lst, ignore_index=True) # Create directories along the path if they don't exist - Path(output_path).parent.mkdir(parents=True, exist_ok=True) - batch_sentiments_df.to_csv(output_path, index=False) + + # batch_sentiments_df.to_csv(output_path, index=False) def get_sentiment(texts): """ @@ -432,7 +437,8 @@ def get_sentiment(texts): return pd.DataFrame(np.nan, index=texts_series.index, columns=['positive_bert', 'negative_bert', 'neutral_bert']) encoded = tokenizer(non_null_non_empty_texts, padding=True, truncation=True, max_length=512, return_tensors='pt') - output = model_bert(**encoded) + with torch.no_grad(): + output = model_bert(**encoded) scores = output[0].detach().numpy() scores = softmax(scores, axis=1) From 7222a360f3e374aaaa28e99e3e58131d3918a0ed Mon Sep 17 00:00:00 2001 From: sundy1994 Date: Tue, 24 Jun 2025 16:04:42 -0700 Subject: [PATCH 10/16] Add GPU support for embeddings --- src/team_comm_tools/feature_builder.py | 8 ++++-- src/team_comm_tools/utils/check_embeddings.py | 25 ++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/team_comm_tools/feature_builder.py b/src/team_comm_tools/feature_builder.py index 8daafe58..fe433b08 100644 --- a/src/team_comm_tools/feature_builder.py +++ b/src/team_comm_tools/feature_builder.py @@ -111,6 +111,8 @@ class FeatureBuilder: :param user_columns: Specifies which columns (at the utterance/chat level) to aggregate for the speaker/user level. Defaults to all numeric columns. :type user_columns: list, optional + :param use_gpu: Specifies whether to use GPU for vert/bert model. Defaults to False. + :type use_gpu: bool, optional :return: The FeatureBuilder writes the generated features to files in the specified paths. The progress will be printed in the terminal, indicating completion with "All Done!". :rtype: None @@ -144,7 +146,8 @@ def __init__( convo_columns: list = None, user_aggregation = True, user_methods: list = ['mean', 'max', 'min', 'stdev'], - user_columns: list = None + user_columns: list = None, + use_gpu: bool = False ) -> None: # Some error catching @@ -180,6 +183,7 @@ def __init__( self.user_aggregation = user_aggregation self.user_methods = user_methods self.user_columns = user_columns + self.use_gpu = use_gpu # Defining input and output paths. self.chat_data = input_df.copy() self.orig_data = input_df.copy() @@ -392,7 +396,7 @@ def __init__( self.vect_path = vector_directory + "sentence/" + ("turns" if self.turns else "chats") + "/" + base_file_name self.bert_path = vector_directory + "sentiment/" + ("turns" if self.turns else "chats") + "/" + base_file_name - check_embeddings(self.chat_data, self.vect_path, self.bert_path, need_sentence, need_sentiment, self.regenerate_vectors, message_col = self.vector_colname) + check_embeddings(self.chat_data, self.vect_path, self.bert_path, need_sentence, need_sentiment, self.regenerate_vectors, self.use_gpu, message_col = self.vector_colname) if(need_sentence): self.vect_data = pd.read_csv(self.vect_path, encoding='mac_roman') diff --git a/src/team_comm_tools/utils/check_embeddings.py b/src/team_comm_tools/utils/check_embeddings.py index b3de8761..388dc718 100644 --- a/src/team_comm_tools/utils/check_embeddings.py +++ b/src/team_comm_tools/utils/check_embeddings.py @@ -17,7 +17,6 @@ logging.set_verbosity(40) # only log errors -model_vect = SentenceTransformer('all-MiniLM-L6-v2') MODEL = f"cardiffnlp/twitter-roberta-base-sentiment-latest" tokenizer = AutoTokenizer.from_pretrained(MODEL) model_bert = AutoModelForSequenceClassification.from_pretrained(MODEL) @@ -28,7 +27,7 @@ # Check if embeddings exist def check_embeddings(chat_data: pd.DataFrame, vect_path: str, bert_path: str, need_sentence: bool, - need_sentiment: bool, regenerate_vectors: bool, message_col: str = "message"): + need_sentiment: bool, regenerate_vectors: bool, use_gpu: bool, message_col: str = "message"): """ Check if embeddings and required lexicons exist, and generate them if they don't. @@ -47,14 +46,25 @@ def check_embeddings(chat_data: pd.DataFrame, vect_path: str, bert_path: str, ne :type need_sentiment: bool :param regenerate_vectors: If true, will regenerate vector data even if it already exists :type regenerate_vectors: bool, optional + :param use_gpu: If true, will use GPU for embeddings if available; otherwise, will use CPU. + :type use_gpu: bool :param message_col: A string representing the column name that should be selected as the message. Defaults to "message". :type message_col: str, optional :return: None :rtype: None """ + device = "cpu" + if use_gpu: + if torch.cuda.is_available(): + print("Using GPU for embeddings.") + device = "cuda" + model_bert.to(device) + else: + print("GPU not available, using CPU for embeddings.") + if (regenerate_vectors or (not os.path.isfile(vect_path))) and need_sentence: - generate_vect(chat_data, vect_path, message_col) + generate_vect(chat_data, vect_path, message_col, device) if (regenerate_vectors or (not os.path.isfile(bert_path))) and need_sentiment: generate_bert(chat_data, bert_path, message_col) @@ -63,10 +73,10 @@ def check_embeddings(chat_data: pd.DataFrame, vect_path: str, bert_path: str, ne # check whether the given vector and bert data matches length of chat data if len(vector_df) != len(chat_data): print("ERROR: The length of the vector data does not match the length of the chat data. Regenerating...") - generate_vect(chat_data, vect_path, message_col) + generate_vect(chat_data, vect_path, message_col, device) except FileNotFoundError: # It's OK if we don't have the path, if the sentence vectors are not necessary if need_sentence: - generate_vect(chat_data, vect_path, message_col) + generate_vect(chat_data, vect_path, message_col, device) try: bert_df = pd.read_csv(bert_path) @@ -348,7 +358,7 @@ def get_nan_vector(): with open(nan_vector_file_path, "r") as f: return str_to_vec(f.read()) -def generate_vect(chat_data, output_path, message_col, batch_size = 64): +def generate_vect(chat_data, output_path, message_col, device, batch_size=64): """ Generates sentence vectors for the given chat data and saves them to a CSV file. @@ -358,6 +368,8 @@ def generate_vect(chat_data, output_path, message_col, batch_size = 64): :type output_path: str :param message_col: A string representing the column name that should be selected as the message. Defaults to "message". :type message_col: str, optional + :param device: A string representing the device to use for computation, either "cpu" or "cuda". + :type device: str :param batch_size: The size of each batch for processing sentiment analysis. Defaults to 64. :type batch_size: int :raises FileNotFoundError: If the output path is invalid. @@ -365,6 +377,7 @@ def generate_vect(chat_data, output_path, message_col, batch_size = 64): :rtype: None """ print(f"Generating SBERT sentence vectors...") + model_vect = SentenceTransformer('all-MiniLM-L6-v2', device=device) nan_vector = get_nan_vector() empty_to_nan = [text if text and text.strip() else None for text in chat_data[message_col].tolist()] From 43a335171609a5bc5a2b7e16f6a0b7ae0c480f6d Mon Sep 17 00:00:00 2001 From: sundy1994 Date: Tue, 24 Jun 2025 16:19:51 -0700 Subject: [PATCH 11/16] update function signatures and ensure device compatibility --- src/team_comm_tools/utils/check_embeddings.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/team_comm_tools/utils/check_embeddings.py b/src/team_comm_tools/utils/check_embeddings.py index 388dc718..45a10376 100644 --- a/src/team_comm_tools/utils/check_embeddings.py +++ b/src/team_comm_tools/utils/check_embeddings.py @@ -19,7 +19,6 @@ MODEL = f"cardiffnlp/twitter-roberta-base-sentiment-latest" tokenizer = AutoTokenizer.from_pretrained(MODEL) -model_bert = AutoModelForSequenceClassification.from_pretrained(MODEL) os.environ["TOKENIZERS_PARALLELISM"] = "false" EMOJIS_TO_PRESERVE = { "(:", "(;", "):", "/:", ":(", ":)", ":/", ";)" @@ -59,14 +58,13 @@ def check_embeddings(chat_data: pd.DataFrame, vect_path: str, bert_path: str, ne if torch.cuda.is_available(): print("Using GPU for embeddings.") device = "cuda" - model_bert.to(device) else: print("GPU not available, using CPU for embeddings.") if (regenerate_vectors or (not os.path.isfile(vect_path))) and need_sentence: generate_vect(chat_data, vect_path, message_col, device) if (regenerate_vectors or (not os.path.isfile(bert_path))) and need_sentiment: - generate_bert(chat_data, bert_path, message_col) + generate_bert(chat_data, bert_path, message_col, device) try: vector_df = pd.read_csv(vect_path) @@ -82,10 +80,10 @@ def check_embeddings(chat_data: pd.DataFrame, vect_path: str, bert_path: str, ne bert_df = pd.read_csv(bert_path) if len(bert_df) != len(chat_data): print("ERROR: The length of the sentiment data does not match the length of the chat data. Regenerating...") - generate_bert(chat_data, bert_path, message_col) + generate_bert(chat_data, bert_path, message_col, device) except FileNotFoundError: if need_sentiment: # It's OK if we don't have the path, if the sentiment features are not necessary - generate_bert(chat_data, bert_path, message_col) + generate_bert(chat_data, bert_path, message_col, device) # Get the lexicon pickle(s) if they don't exist current_script_directory = Path(__file__).resolve().parent @@ -396,7 +394,7 @@ def generate_vect(chat_data, output_path, message_col, device, batch_size=64): Path(output_path).parent.mkdir(parents=True, exist_ok=True) embedding_df.to_csv(output_path, index=False) -def generate_bert(chat_data, output_path, message_col, batch_size=64): +def generate_bert(chat_data, output_path, message_col, device, batch_size=64): """ Generates RoBERTa sentiment scores for the given chat data and saves them to a CSV file. @@ -413,7 +411,8 @@ def generate_bert(chat_data, output_path, message_col, batch_size=64): :rtype: None """ print(f"Generating RoBERTa sentiments...") - + model_bert = AutoModelForSequenceClassification.from_pretrained(MODEL) + model_bert.to(device) messages = chat_data[message_col].tolist() # batch_sentiments_df = pd.DataFrame() Path(output_path).parent.mkdir(parents=True, exist_ok=True) @@ -421,7 +420,7 @@ def generate_bert(chat_data, output_path, message_col, batch_size=64): first = True for i in tqdm(range(0, len(messages), batch_size)): batch = messages[i:i + batch_size] - batch_df = get_sentiment(batch) + batch_df = get_sentiment(batch, model_bert, device) batch_df.to_csv(output_path, mode='a', header=first, index=False) first = False # batch_sentiments_df = pd.concat([batch_sentiments_df, batch_df], ignore_index=True) @@ -431,7 +430,7 @@ def generate_bert(chat_data, output_path, message_col, batch_size=64): # batch_sentiments_df.to_csv(output_path, index=False) -def get_sentiment(texts): +def get_sentiment(texts, model_bert, device): """ Analyzes the sentiment of the given list of texts using a BERT model and returns a DataFrame with scores for positive, negative, and neutral sentiments. @@ -450,6 +449,7 @@ def get_sentiment(texts): return pd.DataFrame(np.nan, index=texts_series.index, columns=['positive_bert', 'negative_bert', 'neutral_bert']) encoded = tokenizer(non_null_non_empty_texts, padding=True, truncation=True, max_length=512, return_tensors='pt') + encoded = {k: v.to(device) for k, v in encoded.items()} with torch.no_grad(): output = model_bert(**encoded) From c71951ee25981d005bc190b88515bb3d9e95f674 Mon Sep 17 00:00:00 2001 From: sundy1994 Date: Tue, 24 Jun 2025 16:40:15 -0700 Subject: [PATCH 12/16] Fix tensor device handling in sentiment analysis to ensure compatibility with CPU --- src/team_comm_tools/utils/check_embeddings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/team_comm_tools/utils/check_embeddings.py b/src/team_comm_tools/utils/check_embeddings.py index 45a10376..a82f8169 100644 --- a/src/team_comm_tools/utils/check_embeddings.py +++ b/src/team_comm_tools/utils/check_embeddings.py @@ -453,7 +453,7 @@ def get_sentiment(texts, model_bert, device): with torch.no_grad(): output = model_bert(**encoded) - scores = output[0].detach().numpy() + scores = output[0].detach().cpu().numpy() scores = softmax(scores, axis=1) sent_dict = { From 810a2c0ec2dfed20519d95363a280bd49007f54e Mon Sep 17 00:00:00 2001 From: Xinlan Emily Hu Date: Tue, 24 Jun 2025 22:18:26 -0400 Subject: [PATCH 13/16] bump pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 71e84434..07bd0f7f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta" [project] name = "team_comm_tools" -version = "0.1.7" +version = "0.1.8" requires-python = ">= 3.10" dependencies = [ "chardet>=3.0.4", From e0135600e00eb23bd58da514598ca8eaf9859ff3 Mon Sep 17 00:00:00 2001 From: sundy1994 Date: Wed, 25 Jun 2025 11:11:48 -0700 Subject: [PATCH 14/16] fix file overwritten issue --- src/team_comm_tools/utils/check_embeddings.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/team_comm_tools/utils/check_embeddings.py b/src/team_comm_tools/utils/check_embeddings.py index a82f8169..1baf5af0 100644 --- a/src/team_comm_tools/utils/check_embeddings.py +++ b/src/team_comm_tools/utils/check_embeddings.py @@ -414,21 +414,23 @@ def generate_bert(chat_data, output_path, message_col, device, batch_size=64): model_bert = AutoModelForSequenceClassification.from_pretrained(MODEL) model_bert.to(device) messages = chat_data[message_col].tolist() - # batch_sentiments_df = pd.DataFrame() + batch_sentiments_df = pd.DataFrame() Path(output_path).parent.mkdir(parents=True, exist_ok=True) - first = True + # first = True + batch_sentiments_lst = [] for i in tqdm(range(0, len(messages), batch_size)): batch = messages[i:i + batch_size] batch_df = get_sentiment(batch, model_bert, device) - batch_df.to_csv(output_path, mode='a', header=first, index=False) - first = False + # batch_df.to_csv(output_path, mode='a', header=first, index=False) + # first = False # batch_sentiments_df = pd.concat([batch_sentiments_df, batch_df], ignore_index=True) + batch_sentiments_lst.append(batch_df) - # batch_sentiments_df = pd.concat(batch_sentiments_lst, ignore_index=True) + batch_sentiments_df = pd.concat(batch_sentiments_lst, ignore_index=True) # Create directories along the path if they don't exist - # batch_sentiments_df.to_csv(output_path, index=False) + batch_sentiments_df.to_csv(output_path, index=False) def get_sentiment(texts, model_bert, device): """ From f6ee3c111409449c382759d48e01cb0723cf392b Mon Sep 17 00:00:00 2001 From: sundy1994 Date: Wed, 25 Jun 2025 15:58:54 -0700 Subject: [PATCH 15/16] Clean up and update test data --- src/team_comm_tools/features/reddit_tags.py | 2 -- src/team_comm_tools/utils/check_embeddings.py | 10 +++---- tests/data/cleaned_data/test_chat_level.csv | 26 +++++++++++++++++++ 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/team_comm_tools/features/reddit_tags.py b/src/team_comm_tools/features/reddit_tags.py index eee272e3..44f9cbbe 100644 --- a/src/team_comm_tools/features/reddit_tags.py +++ b/src/team_comm_tools/features/reddit_tags.py @@ -1,4 +1,3 @@ -import numpy as np import string import re from team_comm_tools.utils.preprocess import EMOJIS @@ -191,7 +190,6 @@ def count_emojis(text): Returns: int: The number of emojis in the input text. """ - # emoji_pattern = r'[:;]-?\)+' emoji_list = sorted(EMOJIS, key=len, reverse=True) emoji_pattern = "|".join(re.escape(e) for e in emoji_list) compiled_pattern = re.compile(emoji_pattern) diff --git a/src/team_comm_tools/utils/check_embeddings.py b/src/team_comm_tools/utils/check_embeddings.py index 1baf5af0..e5c6eba7 100644 --- a/src/team_comm_tools/utils/check_embeddings.py +++ b/src/team_comm_tools/utils/check_embeddings.py @@ -80,6 +80,7 @@ def check_embeddings(chat_data: pd.DataFrame, vect_path: str, bert_path: str, ne bert_df = pd.read_csv(bert_path) if len(bert_df) != len(chat_data): print("ERROR: The length of the sentiment data does not match the length of the chat data. Regenerating...") + # delete the file generate_bert(chat_data, bert_path, message_col, device) except FileNotFoundError: if need_sentiment: # It's OK if we don't have the path, if the sentiment features are not necessary @@ -415,21 +416,16 @@ def generate_bert(chat_data, output_path, message_col, device, batch_size=64): model_bert.to(device) messages = chat_data[message_col].tolist() batch_sentiments_df = pd.DataFrame() - Path(output_path).parent.mkdir(parents=True, exist_ok=True) - # first = True batch_sentiments_lst = [] for i in tqdm(range(0, len(messages), batch_size)): batch = messages[i:i + batch_size] batch_df = get_sentiment(batch, model_bert, device) - # batch_df.to_csv(output_path, mode='a', header=first, index=False) - # first = False - # batch_sentiments_df = pd.concat([batch_sentiments_df, batch_df], ignore_index=True) batch_sentiments_lst.append(batch_df) - batch_sentiments_df = pd.concat(batch_sentiments_lst, ignore_index=True) - # Create directories along the path if they don't exist + # Create directories along the path if they don't exist + Path(output_path).parent.mkdir(parents=True, exist_ok=True) batch_sentiments_df.to_csv(output_path, index=False) def get_sentiment(texts, model_bert, device): diff --git a/tests/data/cleaned_data/test_chat_level.csv b/tests/data/cleaned_data/test_chat_level.csv index 6688f9c7..a463c715 100644 --- a/tests/data/cleaned_data/test_chat_level.csv +++ b/tests/data/cleaned_data/test_chat_level.csv @@ -1426,3 +1426,29 @@ yeomans_test,yeomans_user_a,Bye I'll see you tomorrow,Goodbye_receptiveness_yeom yeomans_test,yeomans_user_b,By the way how do you call this?,By_The_Way_receptiveness_yeomans,1 yeomans_test,yeomans_user_a,"Dear Mr. Smith, thank you for your feedback.",Formal_Title_receptiveness_yeomans,1 yeomans_test,yeomans_user_b,Dude that was dope,Informal_Title_receptiveness_yeomans,1 +yeomans_test,yeomans_user_a,"Do me a favour, can you upload it for me? Just allow me to finish another task.",Ask_Agency_receptiveness_yeomans,2 +yeomans_test,yeomans_user_b,"You idiot, what the fuck is going on? That's absurd.",Negative_Emotion_receptiveness_yeomans,3 +yeomans_test,yeomans_user_a,"You simply just need to wait, it's only 5 minutes.",Adverb_Limiter_receptiveness_yeomans,3 +yeomans_test,yeomans_user_b,Send me the file. Fix this bug. Write a summary.,Bare_Command_receptiveness_yeomans,3 +yeomans_test,yeomans_user_a,"I feel like we could approach this differently. In my opinion, that solution might be risky.",Subjectivity_receptiveness_yeomans,2 +yeomans_test,yeomans_user_b,Explain it. Why we want that?,Reasoning_receptiveness_yeomans,2 +yeomans_test,yeomans_user_a,Why did you do it that way? Where did you go?,WH_Questions_receptiveness_yeomans,2 +yeomans_test,yeomans_user_b,I guess they almost complete it.,Hedges_receptiveness_yeomans,2 +yeomans_test,yeomans_user_a,"Ma'am, no my lady, do you know Mr. Smith?",Formal_Title_receptiveness_yeomans,2 +yeomans_test,yeomans_user_b,"I agree, this is correct",Agreement_receptiveness_yeomans,2 +yeomans_test,yeomans_user_a,This is for you. Why you don't understand it's for you?,For_You_receptiveness_yeomans,2 +yeomans_test,yeomans_user_b,"Thank you, I'm really grateful",Gratitude_receptiveness_yeomans,3 +yeomans_test,yeomans_user_a,We here you. We totally understand,Acknowledgement_receptiveness_yeomans,2 +yeomans_test,yeomans_user_b,"Shit. You dumb asshole, what the hell? Who's that bastard? Suck my dick.",Swearing_receptiveness_yeomans,7 +yeomans_test,yeomans_user_a,"Hey hello good morning, oh actually good evening.",Hello_receptiveness_yeomans,4 +yeomans_test,yeomans_user_b,Are you sure? Is this the guy? Did he lie to you?,YesNo_Questions_receptiveness_yeomans,3 +yeomans_test,yeomans_user_a,I'm sorry I sincerely apologize.,Apology_receptiveness_yeomans,2 +yeomans_test,yeomans_user_b,Wow! Amazing! Perfect!,Affirmation_receptiveness_yeomans,3 +yeomans_test,yeomans_user_a,I love you. My friend,First_Person_Single_receptiveness_yeomans,2 +yeomans_test,yeomans_user_b,This is for me? How can you say it's for me? It's not for me!,For_Me_receptiveness_yeomans,3 +yeomans_test,yeomans_user_a,"Honestly, It's actually really important",Truth_Intensifier_receptiveness_yeomans,3 +yeomans_test,yeomans_user_b,"So, what's the deal? And, what did they offer?",Conjunction_Start_receptiveness_yeomans,2 +yeomans_test,yeomans_user_a,Could you please help? Would you mind pause?,Could_You_receptiveness_yeomans,2 +yeomans_test,yeomans_user_b,It's a bad idea. I hate this terrible suggestion.,Disagreement_receptiveness_yeomans,2 +yeomans_test,yeomans_user_a,"Bud, that's so weird bro",Informal_Title_receptiveness_yeomans,2 +yeomans_test,yeomans_user_b,You can take your time. I'll let you work,Give_Agency_receptiveness_yeomans,2 From 92353099c1402be76212252cd1782aa137b1887e Mon Sep 17 00:00:00 2001 From: Xinlan Emily Hu Date: Thu, 26 Jun 2025 18:08:13 -0400 Subject: [PATCH 16/16] update documentation with new gpu parameter --- docs/build/doctrees/environment.pickle | Bin 337433 -> 337013 bytes docs/build/doctrees/examples.doctree | Bin 172295 -> 173763 bytes docs/build/doctrees/feature_builder.doctree | Bin 112054 -> 119110 bytes .../features/temporal_features.doctree | Bin 22179 -> 19345 bytes .../calculate_chat_level_features.doctree | Bin 92190 -> 92082 bytes .../doctrees/utils/check_embeddings.doctree | Bin 74331 -> 77292 bytes docs/build/doctrees/utils/preprocess.doctree | Bin 68620 -> 62296 bytes docs/build/html/_sources/examples.rst.txt | 10 +++++-- docs/build/html/examples.html | 8 ++++-- docs/build/html/feature_builder.html | 25 +++++++++++++++++- .../html/features/temporal_features.html | 16 ----------- docs/build/html/genindex.html | 17 +++++++----- docs/build/html/objects.inv | Bin 4497 -> 4482 bytes docs/build/html/searchindex.js | 2 +- .../utils/calculate_chat_level_features.html | 3 +-- docs/build/html/utils/check_embeddings.html | 10 ++++--- docs/build/html/utils/preprocess.html | 23 +--------------- docs/source/basics.rst | 8 +++--- docs/source/examples.rst | 10 +++++-- 19 files changed, 71 insertions(+), 61 deletions(-) diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle index f68cc983e82a5f18c29a79ba06154301bb9b9386..987467481b42702bbc3fa5a9670ef127a48f7724 100644 GIT binary patch literal 337013 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ⅇHOJ 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 PZ$pcg5ETmBnH>B7RK#o= literal 337433 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�Lv*f-oIfmVP9=L$@u%xI+dd7k}Pa%c#qZNdnd zbAgO*q9H=ZC$voM>u!2hCw9tD)s8yrIfLQS986Jx=|kX>HJpg-t2K8;$ZBM)0&QTU z9~Z8Y!*C+hBzT_a8|I0SaaI4i1|tI*P(3^h4A= zPz!)NX_yKMvyf3QSPHAAIpTNg%T_5+VR|OYvuqr`YnLJkeZ3kCD3lN^ubE`i5$Ij+N9AXUMcsmygG{grCDHSk?I0|qfk ziRoM)lT`q#LOOy=x@)T~6_*Ef^Fb&=uQSg7v-{%BlkJz1*pClVv`oguBTSD*{+HWN zx@qRL127@pw;pG4?mK86+_&Wi95>>oFtByk?wy+kwz{a`Odd-Yhy!sd1Q<^`HwIHD z0Rr26)CD3}?eMj6n6L;#5vWtkMV@MtaWi9(*@95jpw@v=!!%^@gy=V!#SxF-^5?!~ zx8oiRwo)K#uCzY~g~Ktc)-l0tXz(-)K%{XIhCSol*VHWYm~VZI&LKiaw%GYRj*zDZ zHHbG*flsq9yM=(^KZ_H^QCQ%tjA1&8(&3?Gy}W$eJ1t z(;%F3Fnn;->?R|^Fu;qWBBVWe3*f9-G|rGE1N#49|G*r(iqdP{Q{b8n2W+*{TkG)F zOrm*uVU2YGicBw@j2Bip?9^K@ePjhb;xck47|`3#AWJNaI|ZV5Ps5jwbLhKVhf^!* zgR}8LCKnRT>77602OMDIhx_PrPvCRR`yoDb12p>3@9-h^8KP@?r?;K~m(b?cmx1)_ z*x=RzGL*!hkhlYO{e2L9aw(EzW%98w`rLYa&Veqit)9MhBEIEVViUMYAN_s3a9vQu z)){^7Ied;eD%W$PXV5493!h+`u6x1)P4vOP;De5fO4>0U(E)wnzwrSlq$FKliQbQ6 z@!a>F`bY1dg7;Y{@Hkca)GB<+X~YD@75e-Ve4drhFSybN=i!5_O4Y*<`p9&A#ECL3 z!Yh4c0lvbd<_10Vfob@FV^VIXZHH0%++uvrDTn*HhN}A%s^JXV4C)@Fb3c4wGyTL1 z_-3NXn-0cv0vCO0HS*=?!~MBNv_PLYHZ|4hF^1hf$8 ztG~t1_!gxxq|xV}$LAf-?YTs3+%fc=Vme z@f{~bx>-ipN1s`U%=iX<8w1hhKJ@8dH5Houw2heP^DB|MuP)u~UHa@FkhVW3b@-n? z9Ye~e`)R%z>Y(o(hwu6JDKx>3^tI*q+PQw8bNNu;h9Q0bB`ln;&Ry@bt^@kg)A*7D z@ZI`z0W$0`ppP#@9v$@6G*@lUf+N}294>aL{a(<{6TP}@5CQOLHaKIL7b!a;|~HE{YpGS zV50BFBSaheRrrHALf?Zwhz|6xWT{$LE% zufrpZjQaI>gz-;*CH`P+({I2dj9U7Q_=7P?e-$2KywOwmgAqi(34bss=xO{x_pT4( z5&CRBgGcC&^(_9No7ENkL2s!K;Sst+eHeex)9EVypbOJA{6W8@>-d8%M<2l-^d))@ zkI-A_dHg}Apcn85>$`5?4_0Blh(B06_5FB+wNNkN5!N=nj6Ybx^a>tfHPWm2gOx@f z#Urd5`T;ybtJe?04-9RnXJTvDS|Qm-7e#XND?nZb9RFC>cvGXZ zCh?w~qQQ9)5?Ab)=_ISLFB8{*&#!2p#irRK8+L97`!!rGR@*VzT+;9sod#dqG1c>Z z=tjjC8rdpWvUqtqrBmB+an)Q*I&{fuCycgqStU+gt-B7Z{-6^bCRhrkfs?Xrs7m_T;Ynt0d#2-OqT=s9x<0> z;HeQ6(=b z^Ug~{8P~ff+3&(IOB%*FGSKVYrzw>oLI7N15=T{$624bQX`WW7TNtUHV$OpX$VhYQ zAPz>M&~TP5^xf89U0|=`DJ!`lT$4BgkIsTlNvo3xmoqITbL%x&4@!H_VMZfN#>YiO zi`+}V>7X~xKO$qO>J+vAh&k7uj0g&ZWx?u+kO~18n5XO&=2deB_J9JrL|4SmkH
{+WexBUJ*f1Wu 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 z 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 CnTh!T diff --git a/docs/build/doctrees/feature_builder.doctree b/docs/build/doctrees/feature_builder.doctree index 320c024d9fc7260289e424a0e7fb097bfa614bdd..b5b51b9c67742e8912a8c066a40494825a427d4a 100644 GIT binary patch literal 119110 zcmeHw378#6b*^M-w2W3u-tgKUW9te=GqN!RgiSD#H*Cws$k>ihu6pk6nR{Dz^XqLJ|m&yxL2ccWZ;T z*9nJj7;b&(@U~$kTHSXK1>Hfv<_)7IkfYXUw(5PaGu#Is*JJ*$*$So@ffb?KpYufV z##nU1)Ra@5_1tjK_o_1kDDCxk3>z!=4Wn^44ExQQK?rqYUCWyF0O&?5Yb`ejAQ66# zb=)@nwW>boi9crC+JU||OY^{wW_=iKVAX76)eHyG%Fvy|Lc_**w7k{qc*CofMk{(Q zv>+TdmPMQ1VbKA~!{cg<*0_PgH*K2m> zrb9@q*1GL>HSBg68mps~fmaKg-A*j###mzoilhP`$HHdV z@}y7E$&Anox%`}Vw?2S8SOiKe-{T!dna3HIs2N`|B)!>i8c%MV-B{L`*xfj5_h80t zYy`PCHUX6r;QuGV|4)JcpSo{2Xq?&D3fa%2*&F9H&bn$j@V+D(Yj*11VTnD;c_yW3 zC5XD;Bz;(kmiOFd9~h+#c&4L>Xc(PDzid-KG*;{mhc2@9Ou-gyMdKo>t6YedtgHy2 z|3HY**2}1NK8Gr&Qz7c-G&?GHTZhq^3SU#nvO^P_OQPjqWwn&(Dj?PM_@x>&L0QpI zq&zpRTE1jSvX)A-(;I}<`s@zp*LrTJ?gmq}Zr_`l?SrOI?Q%o+GW<2^90WD%_N(<~ zpZu8L;RIpdx!Bn-kgLAp?lB14U-QI-$sAZYuyDu_mx@7mcvmtb+l^jo6a-))};+?Lp6T4?rW7oIJVH ztQ|m*ft-LOiByzT4~|tvr1K&S(!~ zDZu^iEGS^JgFUf*>KT(x-<$K`lN)+fs$Ckfw?WI|&(+yJbZf8g^(d%%^;AF6o^Le| z)j*30X1e|PDykJ%x-B3M?6Pjvotpy|NS|K3r$1ob+^x2~u+gncV%pO7+zu4m(smD% z|1`;8L0I<=ZUL2{1Q^i;doMaCgb`tfvxOkpmS;^m7jb;420gb1<{f8owmj=ufca$b*&dCN5<@Xw zH01F@1}aKOu6LV7bk$*}2l(C?%y`)_zWQ*xwS%++91>6; zz?Xv_8M0=f>QIpy7tXqBDH%T3(vAa{ z3%wHVW`UoyQLTXsGyOrxHp-T5C0YZ+$umr zV8o{^uO=+3{H{-qNt|0XS@8N+6R)d~SIX!rtS+0!w`h6XM0fF+#$JXtMx^*nN)65#&VQysBd0Dqf7EpGXk6 z_mOPei@Zm@Mi1XHu$&0=(yfI%q&1cINyVyk2yLd3!AivPBR2k!)OhZ1&_bhoNd;IN21l> z0kAMUo_OG4H@YSBJE$wQ8wb|!gM`16inl+R5*h3JY~P2E)PDp7{{UorUo6`SkLdD( zJ*L;9S2n68dEci$#9iQ@43kKPUeGqp-wcI->CePW>lN5P*G&A&DY=0LbK-eQ>_5d! zT&u^NxDeVh08%QaAMn=1I!nF@QC(`TFhgM*j|y$|amp^Cs-y~oO8R41BCUn~C6I2X zh`i0Y05A zX5xB`VZ?Jy;xEj^^(MiHm%^C8HCK3aG3KvG7bHV{b8qDe^oQp5nFQ*0pe)DeEI@hG zNZ-E|KC6QcM-*F~SbLmt#56YHRdN$nZJ{=^h1-xw5Vmuwu{QtBYJ>9Og0`~^Trhs= z?6P6*IE5Og$>5+A7St(mx9Zy51XSmK&1 zJi1u2k92_*me>mPMdtRI1ZssPM~w81SYq3RHyNwQ@J=XkKY=C7aaNm~68%Hi%sY*> zl)(_n!opyPep$%^LqtK|@HB=OORqRvV2CJ~jUiGVfgx8K<&l9QmqH;M47t%vT#q4)crJ!`X5xC4XT(ck z$RTruM;Ai^(gju+Vk^+sncHU)s1=61%}C#fA+}9;pRtMz457peV8{c;TFPJuWuXj) zoSMBEB?TKBl)M}&Qt1L7{@U2o40!lF6taPbN6f_a@W6=Y!ov^E#P!yofEOy~fp#_&2Ybb*bwE8mWa8}NCv=l@fpDMsXLi0tmxoT{422AXQ zLN+kbHWSyw1S6gc6E89o*Q+!mUJ@o=Wv=ol!^9EN3sx{;E7NzG8)%ZL6-?Y`q;G@? z+a^3{tRe#@DDfmrjP1p3pWKMpU&3&{V63MMSWqU)fW>Cb*3=Y0jFC)nd+1-HJ>N05 zCj$t+359Hc;HPHddLUrLbAe#Rm~rsdD=i}~0RisorP9&(3*@5^)+y#H%K-tYql~|B z0&ruw5^F2d3(O5P$^4@B0R)t|0t95&b8I;DFQE%BG}coF2q+U} zfM6TW6j*OZPeH_HO>y3C?KdHXfl&$>@No+ivVo76n~Ce;gAvb#kJp)r>s6f*7w}PF z7stKk3QK`U>0KOeBVAzSMA!=SqvrOR1ZssH4;kqjvBS0re`l;B13M`3Bz9~{9|GY9 zrTZl8>0gW-ltC5BUKv!W@Z%|Yr&dycvOZaoH(gB@&0ey?IF{=-YWxgjWdkGY&BXOE z!ieX>$mwR{daY-~OToyLxx%9hBToWmEL{*=fnH&5pGlxrF!BN;eItz6Hlc2;A_GP! zaTP|mA;l-exGinklKv#@sc+<<42)3r%D~9!rXy`B=vX7==50-+iAKKC*vJgu;|?ff z0~&8O6W4o_A`3N-%IT;b6Ljr&L!Sot2d0{x=7eI|igfyUR3^o^il z+k_t&tH=NiN<0Y~tKoDaIYSz6?~+o4_57EyzA_L&nJEJi7sTgPtP28RwM zRW$#kl_flmO;E@NJf3JKt_KfBJQqAJFca77IwLN?<3v2ilR7)hr1}HC+c9fL`YtmM zM;A|?O?xF*a5tHm)(egimrfkKnCsTk7fXu>vu5J@F1O`8G!r*+p6*MS5rhNd67MfF zlP}eqtdcVGT4|B*jYYm!V*9tuY#T+MmWp!b;vHtUNYCM5Qwu95D(;5L#-6E47c#yZP*K$Ib+ZzbK$K76-XcrWoS9fW=P z49xmuCf+t(mwUgBWq) zl@{8)^LBHUlHJMYc+JNm%kSQKE9nKRsMc1dA2B!3BvUK%{j`z3(R^*2@MU8a8Msb~ zC!^ZT-8!_!hYb$~4l!-F^cYNxGt5m8I<=wUy{6%0!udIy-gkSbQ%8yJIZXZyS^%yzf%!qW_x47H9OINBS>+Fg|1^t{;pU z@!Y}q6=vf4frAkjgRyjTM#g?xDTff-o6MD$8kWmmtdV((!5c_7S&i1VLjRz--6o-1 zjn*GG(l?sBZ4*9gtRiEyro@w@weeKoSB{GLivAe zY+D9q{16J+Oe-HZZW@>yddy(Nb1`G1nYdnk8F7Ib%iuakDk04b8-5d_nlM*b3MWYQ zW#$~u1ZFH3vTX%=k-2>)fm-3gbB*+kcwpOvn~YUt-~lC`#DisUzb7{w@>{6Etg((V zXh0b#g9f=bkfwlPQ~J(Q-cH>o(d?HPo1Fm^FM>igK=CRwaXnBl;<-TaJ7(f~y=KG( zP%JO9@AiG>Doa5HWuOdJyodCHmG59H(@&ZkXp*TFR{V{Tz7Z>IoA6J@Dl)Kw5>H}9 zPQ3UdV?AZ?f-+GCFQ(z%_9FKYr{Lr4Tml?TEOH8P8DC>`6!fbNE1-}KxSV1pt_K%J zJQrNfGZWVv0wZ1$T%K;O@+gDLg`^j(z{OUk*P9z?lBpHA>^IUkf{SevI>st8z=aYo z1THT&)>8&tC=+GC}pGlxr81h{seIth0 zHsRlmRb*fYC7#5P?$l=xHF%gVK;VYdu=(CW*e$4PjmC;g;B3NDUM<>Mfs`68O? z7@L{_4W~mP%en0-BYmSjuv!vx+spAe2i`FHhiJ=1=DJGEY*QA>blX#DcNBaGBGs$w z5@dM8l~f^t8;laj=*{Pm-prrru9=DJfu0f11^Qde#Pztuhzp=EwCwzHbCso_zWlQD zOGqzRVZE(P?>0BkBvUJ_f3K0g(Y9@y@TbNqGO(T!Ph$O9d(CgXaMQ}oCyecrM&8Pd z5|r^WaC0if3Ec}aS(w7|@`f`^;i;mT|7dJx2Bv%s3fVZ1-!~K2V+tdlizz=d6W8lM zBVH0y)~_>p4)RMYM`J6?IB;V*8Ez}nin)O%nOb4W(~R_um}1+6UB)UhFohCNVv2Eb z?0RD@Wzd1LPzD`NB$rsKZ&js$VWXOjV?+9bfQJLdc4olC92By2Am@$rjS9hPv3DTv zFxOSWfut;y>9Y$-XN>AUu9d0q?o1|%uDr+C{EV)A3+c*y@A3U+;(DZK#B-7UBWB`y zRAR(SBK^bWDvz@F_-WD$R^FqnOuuDrph>1yNdIp}`bNXHZNl>P#?jc=gam5jdWGzb zoZNiE*ftq?D>FV&sg%K*ClHjdavmvma4(THJDDij_+(=nGXP}^6tZz0pJ67h2NXs; z7f>!Y6W41FBVH0vZZ=nWlmX=i(hF9AVk^_Y+(45|tpMevM*2oTv2DU@j8$Z~j+A%- z*YR#+EoGpAvQP#Z&~;2dKbmqKSF&u}#fbkFVDQJrR%L*}hoF!R82p8qxE>4`@mw(Y zD>HGu;xghA7!=tk@eOm8<-nly1!ez8dcg_|Y-ReWxq&8`T7kjZ4W^;r2nM!IIMrB1 z1{hG{NifLSC{Z!iQw9zw6V`BG&KNxb-kA=YRea_O-eYF(uEL*ieJ?&T)p$R=P{*F) zM}+6%w$Vom6Pe`j$8!T&);uM9DC0|gBY>zO)p%d#BW52PxyD@f8Zr%D76QF5@q#o zf}dPnZn_%Ya@y1IoaBSdPBU;qNX6GL9j`M7b_##HA#9R#>jAvmPQGFYum%5ueNchp zcIx=nJ$d4iJT^*`__OZ8IL`5n#@eV?D!49eny6^PS|xg=j2Iu4dV{Tqu!jI_28B4 z&}kt*!4&gmZrVMfTpzjp&A*UrQnCVUnbO5R_MzvGL6QC9O{OM$;(yLF!=fAc(+qOBEIP@W2Cr(ED z4FSmDrCz-sR3r!yf3}c_AEF}uB>V?N3%Axg6>0d#Wclp^G5oVjdzM5SIlErF*KmVoATzvH zmKxWLWTIgF8%kwKCqQ1GLSuV`GXB2_ZnA@W<=aJjr;F$AVyU>azB(8R^+ zl(UPzHVY$p*O{1_=Cr~5rYD${`Ja(Eiqa2AGwVu!5TZM4W70CRH4x>&tn4%>q_Hwg zHd&efPcpk=!{BxZOyGTI!PJEcAv06Vg3c#QWoMNw$p3fXgqVcl0B2ax(}1@BUr^>w z|55mtSd9O3_|>?F+e$2xgsr4RqOlcCo;@S#%OkhHC8;rw+0a$3eD@xHd|gW>3}O;N6T;rVRu{Xc;ZJa6p&ILSkicR zmXr<~eb3`QXVSJP;i(B4KPon*a>&6y{lv0R-vfozm)X=Dk#1__!sG?9soNDo*@lAs z$ZYC1!c=zFQEcjEKs(2#VwogtDkTz)O=`pQ}l`AW=tLOAVakKkv zS*ewWeuV{ImmH{S7|m7&Ax?;NYTnjuBz|LWlRLHGAhAq{gU9JG#%&TtvONumjxjui zm3FTWK4YupbRn|sH|ul|B&Lscs~y+U?}Z{S^dUiRj>bH~GXJEI5iraAL(%~$%f#db zvCPjXgtE;|vdm8rrn0k+Vwn#E?HtRDWs?}(_)}Ji$qQnY zrxap}jh81vA=B*2C{}qY(9W^SSSAUpOo>Eem6|+(VwFcl(S%Z{99h}q&lcP!e=B8^ zI2)2C(EYc-R zWoI45B4>eijzz{YNmyh`BpQp<YR)V z3q9>#IPZ|UD$OZxYSQUIM5?KB#+&cLY7eduvFZZi1{3=9SbTk}*7;4nUd!fmQt6_n zey5O~Fynm_>8X_QVzRyQN=JjXNAwTD)*mROvTagwbKghU%Fa59`F;p!=a?^*N^;)n zxJiejDgG1<{L3;8WO9#}quIP-Vy0{rS8iUfND#IEU76bdb`iz&+WIG5XuChI|uW344ma54i?wvae}WxkVe=rC1}H{oh4t*1Kyv<^JX5O0SIxt}3}H22L{Dwpl*Gksgpxv*wNOYiZH~zc zgt6x;q|9tF7iog9m7R4IjNJmXb1;@lC5f?1D;(Z7Aww@mG=MHKHXw&GRME~RlAwA197Uwq3&%#?PDqwOlYid4R= z!0t&oy-*zNUe6!jI#i17B1o zmhg2&nFcbcj}Biqm#O^)izwc`w&GRcE2VK7_|oKQEC_sQ4HK}7r7Mu7vS9^TC*%md zIAq-+9^i!Ov7-!Haou{@QeHY|z@?-L=z47-HD;byL?oK>yfAq|pzECqp=>;oJg>JC zrn0k+0$uL{+BwigWnu|kA1%{BCiT&w>)|rBKeUMA{k*MsRp?4-oCdlydHh9%uGl~o z@KPDE0go5rS;sg6O&k&jZ2bCxD*O$TtZA<5L`V~ zA!KHXxr8SZrn0k+f~%(k?HpXCGO@(f3(7Q*Nqux&-C3sgXD_07FSQk~imNG&)8MKm z&jZ=GIx=cJa{FEF0B%B9EaZ@EH`Ow@uq8$g`Rw$r1%n&tfQ2C@JiDf~Hb!{a3LJ4C z`Ug-M;UK~smUVnp5LP4BqYFJ^Mc+$2o}RNUHeRKMeXy{`1NS8K@x~B1;e{*Nu$lw= zs^BIO_H`Z>spYBPDd)=B@lLn1jqHD&By$JkS^#pg3&tP93M>f0k~iE%;vDei<10|e zW?8)Xgzfu^^Fk(AKq9oj3~m{Ca6~!h5bSn^2!g|xLpCe`u6Mf!a8bU~4IO^~yKU(k>*KD& zHV<71VZqEG1mq21OA&lWSZ}z!p4UN0_TW6d2eHKNYxi8bLp_>{z>G`yvoH#D4`DUk zjyGOm&$x3|wmOIK`idIdZH3GJ>~bp@AwuskJ#|61L2V;@d7Vq!y(R=Wt}};QpDKap z?HK1i!CW(J3}&X_Wxweg-7pNcUG2_H6TRFPy1@Y)VMtkE_>v%iNGWiSJj3)$M09rlHN-R;@hBnkm{%xQi~bP?f5CiwnsY`0GcJX)EfK- z01dwZDcW8X#5pn+FDPL1ptYn#z;+nQAc)Q(Olsx!@?&9q5sg&kZso}QI~g0y!$=`V zCVB@`SR9GX-U}J~0?B)Uku(_8;A%K@KDr(Fv)6CJMLyJtVH2ZdEA#|XpBS&e0L_j{ zi#Ts9xfTl?3p}q02YzgaNLey`u)+cEgz6%v99R*_Y0u93-R7jb-l?}u1 zCv0VB9VH6`w z5lk0CGc;ZZ!bUJ(VTvl7R;c&JoK7hmzD1wvz?~~$pWc62t1COCff-(IRELX!!Eu;}&DFK;94slpf%W**d2;n7rkbKRF3&*#IL!s zBRF}p==jyhy&U{>Hv%M}Ctl>30KOzzZl8LF7VE|Z2OQ?)Bq6ciD5TqLf6vQ^#6Y={ zb1|4~k8sOCFq}8?TQK!I3ZZO}!oFd6b{AnPJL@QTb~n(@!LwK+rq~O=BYCPuLj6x z6tbr@Hwns|6Rx1TPePJ^RY+f%5j{*KnKB|wwl^Yrw3N9A>N(SYQAlOmhGa(HAZ%r4 z9mR~k4YYI2h)TuME%rE8-otD}Dps7! z1TTNVg{1@mvT#I}nZ|3d=`3_x&0EQnC?p8#4LY@OK>zN0ZMZrXF3Ylnv$J!#=jdjU zQ}oT{h18yb-APlDx|Ee@n*tScGgkA?pJ|!jx|!LSb|+xrh!cEql4Wm z%GCa{MHKHHw&GR6E~RrCu+!uTVz4`kRxPYf<;V&VpPeKB;)r-ByMwURJXEWaTd3gX z!TvnFga%JL;FAx^BoVp)nmrIj^04`DSOLT5pt^@T&ed1mxD(z+f{j;%6unEkG6g9L z(vdA!?3BJX=sC^69EUn%9wF|J6jFBva`zK)r$7#q?Lp3PlKu+{p={ie9FB(xQ`uQZ zfw(UM?Hq`sGO>iXZ2$nJqSPvy-ruoplt1 zx&mnDAQY8~B|`mbnFcbskB(5?GPSoBQM|XRb8sVb+jBc` zPAaT>2gxIqxbK`ImioS?2C?>T!Qxvcoh@zmF!@iD{6)xZ*{21wb%_RWAX8F>*nh8( zIx`S^I}v-z$-?9UAclMKIe+SH%?~J~vXM!0v+gHsWoI1)#6AkNb3lwr#S+B6Sf+tY z?xTa)H_Fuh^+go#H*LkMf>=uDG$5wQ^V>(!i1Abum@znSlkiUAU0}-b&t{xTOd8U` zsD*K=j9X#i+j6?8I40gpA%$;rw!y?WFZ0gghnuEx3l`l0P4JL|XS@_=0gHI3haFqx zyRS`9$avvU!=R9-3TdBqY7)M(fkg7>PKH7ne-4uu2nx3=q|9tFe{LILD?95bPxQrQ3{xpi+RY-ML11wvqWJ_YCTp^bR}kVO?yCueN?a^iCK_EUGtGf3nJ5H3c3Ki>vQ1ucz?MQGjRS_s1whLbi=L{GGPA`T zu#*W}*;z*cttzC{%8hi%2HLSIVfG|;EX^ODEfZiNM^+*v_gkkc2%y}bPZ5Y@TfK)b0;mKH2f zKp+W@9TadbzwQRIQyo@7!|56L2VNXz|}dJU=L;stlmMOT?1` zC`>K@P^N%#`RPeg*{CA{)KVz4So=R$0PP%rqEfL0sME_dkjZ^?fZA53_9rc(c&BZ} zs{&L?=QIGN$+K%gOiq}QT7?zLe5)wRn5ll0UMKTm_>aj7&|vPTS>H*rnyKDPv))6p z`tN}M@RR!VP0@<~9w{wadA&y-wu&K#|1D(IFQk0$ruBER&_v^$##vWE>-;~J>SS-5 z-XtYO@4`bKm%&9ca022vgJuiPc{_*t%@7uMaZ?FD6j2x3O#pFcn=Sax?wtX5v4%I8 z)g9bh2j?7+BJ53u9W6mH&aWhc4L9y2dGYhJq zYp6mx;e5~IN}5O$ih56>)-grB8w=Sh>T*1jOZiY>9khae6b#*G&Cm$GIIA^hu=^nC z8S}8r`uqJBSs5Uq@Cx;}SvB5D6>bmy=j_I^#>DQ%S-W9U>7pcrH8$eJfS!2eI(H;h)o(dvHF3x@k3!;R6!xX4*08#=0dpIT+BQ(?cWGZbm26yTwAds~Om z1?G%X8uG)&irwMR1<-Ch6P9;UO?hFmDV2uH6Qao^8#?O1{I+K~u?kiicgLkSYnfRI zg4rHvzX>({u~AJcjrTNu-;>4MxTA3=Ht;Rbz#qnCqqj}p05g`s^kJ_tnBL_D2f}V| zdXML}o$Kfk5$77Xehd(HI)ub3z-+r3!fT4bbkMJ*(p1s+=6B$=#PnS<*g36!&llbh z#-gR5O&^G5c3g$Mgqo#Lyru6?wA4TD3{X%?Y)Q1X?gcft1c(l!Zy3hZ3qi$ZBq`~9 zwx!BY(Regk3D*x1Y>bw5XZ#`g8oK>CFB~#th}J+BHaymbN21jrN(f5^EpO;w1EvZ-eu;^p|S|ooVa22gjW*_R!;EtjHJS6_aWNy9n4N*M%8xwIO zq3Pda764w(^MMfWe(r50+??yL?7(GsaQy?^m`BbuVbF*U&Q1WTtKraQi*XU`bX&Cn zykrf>p25?hckGdCbJ*=Tv(#4#=!Ofh@x>r5AmU{l$XA0AGerRs*a=k6y5cxU@? zQwUtJ%kFQa$K3*aFt*loTjRh&AFe;d>w57R9-%`gGs*dQrWF-X3-743LE0;IwW2A0 z4X$S4MiFgPTgzR#^+_p61otQevyl;1k6ns}T#(hMOBY6*!V=W>36N905n&1bRoI5J zu3DB?8mCc*p_!L__#Hh%;^Iba@)jhm^3szzcEKV|WDYtFf23pe$?|J^F&9K#LiDrO7X3 z^p&P=jK0#@`OrolDpuqmjc;qu1jWkq{LRtVs<`Yi=4|PtF;es;TI!#QjV8qW^Y|v-D^gE?o89h!fhR=%6pgcZ(m59#> z!ef+m@UdY{8bw@1BlKZc+z384v9OD$O9Yz=L9>dnunV~$Vb>Zd?2?G8TnflC1W)^s z6B;~8sR=@XEY*NLpZAGFBIf+rMSq5d`-B@3RoCGru- zT!;lveC*a2s`y_9R`tP?|2=TF$anwy`0G)~>Hi@9^+Wh|#Qzcb_y3ZA|CRjvWAg9+ zBme#z{=48o&Qs__Z1YyH$ih<23e;3gbcBFLoh^@P8p4>>aV9=MNGZboIQcBF$C4q- z=D2M1#$##0NNV{=fr@CKe=at4)IjCJSYF3Opt2p!r6pHXp1xIxw>l&L-WbzuA`f=)gcu}wK#7hczt1VT$ zc#jKgJBfpeVugf#?qiH`oHhGyWJsAfmaP$F{VPJ&iJ;&o8J>4~jb<|5MI>EXgB?(B z&XPBA!||{WCw1ucH$AUkgQ+ri4t5x^d%DQmhRs>J2!lI~Xutq_jOqip0TDNV_E~rc z3q6VR(`wY{T!y=jTJ!YLM5Y1o@E1I%6}WJ(A#6vYt3%^3E!dpvkO#K9gAguYq`RJC z75Q)5exdEH658$`z(O>rkW_22f{NP9)q1{g(PBWh<7}w!)mAxZQmvy zdkWk_iN3x^UlqZdmH2`X-%}_sd;Th3lpElZ}$FzZL>$h{fO$L9(Eu_KtWVMkYYx zBwV67&#roDvEnwRpOQ-|o6?N(L29GS0X9J*`U-`px%1hw3UWf0RW2S)7D5Nrwh5Tf zxo32Sz<)9FPGcsilS{=+|OiI#lQ(?16o~| zK2mgDJO#iJ0Fi+zBAz-T&k@O8O2D59%Os2HAAvt z`;UOejkLp5W7?OIo-r#N>+hWwS=oFB3a?Oqo9&p*XYf&ydwS+VY(9f~vHC(4Dpc(b zQ@TisLZ|Z?w?U)mdKRC<^-k0hMRGm8ySS~ z@>HxwuwcetT_HlJLKJf!b_FU8F(qPr7lk3WF^}k|_r=04Flq80CJXJRLE=?<E^g%h*2GV z9LmW@A?C3O6LiRPc=Ax5nBz)`nbuKC&P#!vl$;fTNON3TX$aB#uL2P*_#BrWndltX zxxl|>j!R!8YmQ5sTiSELJ02|THK+rYb6mf4H4MA-Y#_nR^z%~u>>#XRAB1Oj>D?Le z+H&dgLffXSwGBI&&NDn-h9&5YC$r|MCr91nWD`EXN-r{@gO_DT@X4M*A11zVq6|%$ z4tH@M9fg`iZ(dxYH~ovS5S=xW#I?AyM$aq6C<~x=VS}`{LY{vkFI``UkHN8% zzFD0Q*VvFDSeZI9x){aWkl8}=V3SKTP)IYmgvqk+sg60x$tB?cY>$)y|3wO+q!TNT zM2HP+V(BnpDm$w@XcgR~>)!^n<%uQ4c4cBImPuk_DJ2rk#F8e@7F*>I7N}AYLto~+ zt>ag7WG2mfpbc2Y!B>&23o@N_ACQt&D!Y4;Rc5Xq!b0}udeTnq7|4C!tj|L9pD4s6 zn}T?d2+7*Dx7vdGH%8--V>zsyWs6vHmm~uj) z(tg!TW$8Py!aZ#Hn^u!>{($O%*hsYa%m-oiyZC9 z-U_(q0p35vD~DjS#UYQcW8*FAxW~K?!9TkWebSlfLeLVI##@Wx3pnGz^RZ<@;L&d~ z!SS)n>}#QK$4hwlD*Ce4ALDu$Zf1n&Xv2SoNFPef2bLFa1CoHNU3$ks`uZj%|g@P zTtd_RyRZbH{1&g%VcFL3GuypIU?=Ha$GHVfA79%L%EgD= zAh_An8Iz zR~8U1yir2L3r}F`1T3^sZJ8LvGiM?uxHhgx0$QoLK#N@}pDiRc7Snzj3l)fIh3}T$ zHt`RI7+_NdUnSjU?qL=}BCnPq99Q(?yalu(a&2`J@J1X;pYk?J$TP#f(thUI?`WuB;sK3od$)*hMQ2Nnah)o%A zf0esk$wC$XOlXzq)D3>8QwF>67ddr9em!xG2Db`|_R6w>S}z+~B>P-nuEy9$<@-Xi-qg_Ies*uH{)C2VD99U)@y ze+snaB}N=~lz4$kCE3X1CgYu%_*2Mz!?{UWWpj;T25TUbyAnkuYh1-)hP#0xLDcS) zsr?KnWbzbb@%n2Zv;7*bKLOdT#0x`WV%tVa=QP_kG|H|#zKn4;N^r%$%(!-!kTfkc%wqf%oYRF*Aup~vyK91Zvxsma7Lw)#O}<| z;(cWr$mDJms~8-ZgCG(_uYase?GG%Xc>l~+yy|F?(m4(0X!2~AMhiPL6T(x;Ss}@M zj_^_=g_$aQrSh*W#ve9IiSDlDEajikp=u!>Jy~{M5)!hF69vFL^Ceiw=$R)XLgSIt z6ACfFCi{ z_vetFF)JMF?_aja%K96HSE#?ucFZRGd8Evza?FL;WIvy}(if^whuyG05FL6t**_1B zqLcmP*JC%?|4Vq!VyQ!0&{z!EYC&!BRdX|42vWkfzswrJaXV?-@`5<}8EoGE7`J5T zo4*l#lW@jo_U3pz z=O6En6L<5{9>r;TdZe;GfH%kIAY&7r{cJUFCHD)9txBgPR~ZD;(uCi?DE*k)MHDxW z>(T1C#S)nxC}hm)z;+Q~-E_V-F$bB)k`QvtQk*2Qv~-JU^iefbWoZRn9Fgedu@!Hw z+8?tOCrM;BkHnUL6xB!=yV`Vt%9+!O6aF_*CFmN8WL2fsP%JiNonJ_-Jcz(TrGkib z(D0l>3~-+v3YmsTDMp(jSkn-uxIXv}Q<-(MI2p zh0cMpz|te)HX|PE@3uu&7Neo?EMqj<-)7ZdF&ei-K5Ux{u^5dzEc!wf|7F0cX+su% zr!m^Q@fX>UMSeYYG1^72(Y%W90*hl@MYdy|pBJd5sE-h>Jy~@zQ^XA++op6w`S7Is zBryMfLRXay-aZH3f%T=riryR*M!BcD%A;vSZZ^W`Ww{!D>P9%URn% z@QG;czUO-(EIvze-31bbH&D6*9+dGLndvpaUD!#b?1!s$+r1XtA{$JN-{_HDak!ra zh71U_X+Vyb=sSCEyq0arf^|*UvIT3mJ$oXM0ySOS;~ zLClFL3>w5p%C=ZR%teJn&%EqsV4+f8b~=c;rVsdl(EoNtZ}6UbQFuVIaF- z3TMZ!4B_YzTouyy=%IVE+69+Nz?xFut>K#;&Mdz9LRUv5hx>$sTT#yLs(uI+yum!b!0_F^Xk%MiZfsv$c zixn7MUPxlhbKix9N_p<-!04tz3@}Ie1}J12bELosd9`$uFCkeMG%y+zY8?}A9}ATd zZ+>9(o7N01Y+!`rtP&Xg1|;QmBJ1y$TV!Q{5elzRf18bx1xDNw^)Ze*s>o?Gis=aR>26F{o3Wp8Rhx-l=)qZ3}1o{&GwSa8~DB$myPZ{mi(qnsi@J@x`dpm z)Wp*dy07AG0^Qf`k&-Ip{QX!~+E_{dHo$kFkO`PrMAN|cFTZJ#H~BVz=sy3Sk-JgD z!L?5^sgev$GNLcq-GZxt9Sh;{_b;{55RmLY3?dpi98`DZW@#!72`8Zi>E*3Vqvl~@ z#S&!1E110dL5)6-nqc`t!0*0*pI9f?0=j(l15Sat4lc)BhOhMDQV6cJkZa=LG0cN* zYe06^!G!}gx8uyfvW(k@W9;J|965t4=U|Bif(j396HdJ2pRjfUHPv|0V9*TRnHF3- z2A@f`dUJNx>*Ha0Ala%7T4bA?cyse{z^QhwA!Lqx*@?(o2vgZvMZG)ML{d7Rvy7d@yJ7voK4T<-WcA_V~|}WYktgWu~GB=KuXr7 z?0!X7nc2M;3)!2U@i5)T3o*b#yN?h7n0aNP9rC)sVl8l(?rViw$He=0Sg4eE^F#R` zSu-Ttv3~@L*$1_QFsg7-z%#6tGHeDe#?7rV6I2R{n#a)>VjCi`1puLZqwS8>=n-B9>!s1=X#PU6>hQQ(W9V)X!GQaU`kkPjXcF=ZZl=Su}@ZrWQmIZ@37}T8mqP3AQ*ab`{|Rd_?fc)l9+Y!s|@Rn z^U@NmG@cus#OBJj%?z5YI;`o@%jAZQGd%99RN_qha4WlUZWwJ)X4;?`r|cUxPTe~6THKC+O696SXfuD&dgWQogUsc^p8L@8*78;WNofy9r85J zfD9(pj8+72lX(rE&N?SLA?&-IfX0kfIC(V(r?vthQi;aGZs@j#S1pOgc^E`5U1wGt1+}+r^J6g>yI`8&@(rS!}$xJ8wv4&O%&zN=&z@Ovn&q2Qhf2|9< zwd#ypJAhxI;xXW`KR=8%&33yXpf}tw8h^ZMX|yf?NdsDz)P{60PTvFhRIR&Bt_b<696#F5on2r5Y>Em0XGREE(R$`^%%e?O>Sw4Txx zJn+(|CqF2Kqm9@G(6yieB5FaKhS9o~+nF1{9Y`SYI{bZ{*BM5e`(CZvuUG3{4>Sd; zfr|k_4l7_(o`q(DM4ENbRd2R=80Mp+_3j|-!j(!qDLM|!AX--+z{Gg0f*@Fu&;;%4 z!#g%ea05vp%8lJGl6rwRsCTP}+o)0-!O~#ys!}Z2C3Dd%h&YXL-C)W zqQ|3sf#!7P;9Z_pv)v4b*KFJpt?zj~0UFqtwU~mNu&Zbs(J75E>;*ffry)6*>dl9Z zZfC07pPL>=Ct^;*0OYK~`v%ZGA#}$oNZ)qu_6tFt>-)1cg*>JR^5=2#xGIh+3m08Y zHN9|_)Byl6-3Z$)sBAS%V1X6Y!^ZHcRnZxslWkbQVCEU4UNz{Uh8&4D2J_&I9j-Q- zbBz}KAM|&5tBb0?HfXzGXtxZ&t^*L%X7V@vv)byyY#0^o8S(NvwKtG55h0X5Fz7)Q z>w&wl8G`&N4jcjP>DHQ^SE1UVMg>SmSbnN}x0C8Lti|JP#~1 zJTHVwPOL$$168l>Hd|HLRe(TC*ghU9W0#WyJA}Xy@Vhz(hr0(e(JBfjV85V>aKSvh zHv)=BoiU;~#{*NKS|Q*o(16h|6_-7EU#?Rq=5BP>5f@HXpd_OX1Y=RURdd?$RVJLlWV+}ubLN8`) zY{VR!pr+@N$z*vnkH(q-jH<&sac~)LOhhk!EEiSSP7`PZnGJ5-+?esddpbzrhxpI3 zGvS|A_|N*Y;GfO-&q{ncel7lk@96sY*e-dI$H!-T$o0HF-r-A5`TKYk068t<~Ar6`+s3S)GZlN+mHoF?zE@YL9gXpB*1OPrWs`nNrL>J^~7eKaw+ zs|{WP3Y`hXx0}EzdkphHcyw01&Ue|v?Cs>_k|n{6d7gw#sceO;#u#jjIS5Om{=Y9W9JOf!~+4NufK)Ti`K*vA&{_!-ZqF3G>5~;cpb-1Hq21O%V-SBhExLycpFl0zPf{?xN2l8or4soM8E?ce6jo zSYK5?!rqFpngXfT6E)p4kHoZTQxP?~uA+OO-K5+6<8H62yRWXMZgyQkMV9}lRWmKa zimfe-{(!n=`QMGPN^6I*FJi3uwU?2#eYK5fjW^v7Iqo;9PmcdT)VPNMc7KgFvnwK| z+~(gO)9~6K8ySm?wRV5iEt2|LU)OT>T8uS(?)}Uy4!6&U6>ie3xOwB*{upb{yqDNu zaVmO{Jk>weihm-RVbc`IwARo6rL~|Yj^A1jUN$_|Dt)#qKQJ4*!zgRs0yhHW*;jxI z`dhmfh-Cq1!2%zd#blw7o}Xh$sJZCIZ_ zFgvmo&sZH2E@yQ%aEl~3Y?=aY>-5e}R>p%}*!oyrUJsYBb%f6c6RpiFi*uhw3;w(D zXP$pDZT=Yv@mJwi#p)>)nH66ldy52WG=``dHU$q=QqvTI{a`C#CofzrVNXiAoE@{l zJ}O~jW5WKYf_=t>eJ(ugqXIS>BiPu?T3kns0sH+{zz!_g0HxM}WtmoET0hn;j-p4$ zLO~qG0u)%M16e_~OXDQlm&X}wm&Ju;yTB@4OtzZpJouZu)WYBRB}FUJ=M#9X{@a2y@1dS%>U9A9p)vB)$ zbe~5DvbcCNNIJ%2kfcC7#Wo+a6k@n93euT3UWQ3dd?-wO`SD@Hq$760)Nqqkx!21E zC?n{jWN4E0_0AY8<9RQ;RvjK@*v`G)fo&^$O)^7cl%_gbqt+b8-;(-Z3`WO0&r;9S z{{!jZkC(CgY;@ER9mxzEJ0B|)W^Q2iJrW*sjpn0ht%q$S^bt9)%ydsV@TthgsqSW!ao0a%$w(qSldvAS=Jf--CKGu>pB@LiPM^C3d=^kMikWIXq8 z4vY&r&=y4qHY2wzqXvtcX5_I}F>+VKT4W^txdE(8qM5Z^i9)8>m?gP;qDWd$WDR;& zhe(gaup#2YE;>ZmRmz6T%HEtJ*+#{TR7XdIEPF>ev22xWNMZ<+QkKgq*|r3KPj3mP ztfWNeDQn>NWyr<5+xxIZHZB5^3v5g-)+)sHA;i8X!y^uuTmYx(g zGyuD((8vR215JmN;$>y(@F2ri$!KgVK#fa7W%OG6f>K3N)cpZW0KACQe-;wq!=MskPT=T!{n`CCN@^t~ z*yxP*+WaE6Qo&ws!1k>Q54+Z2gf&PbP-|mkuQI*cFzwyv#I#@pfs!P#+4;#1Y79#5 zX$2)`j#W!aPL1fnzPC|wPEvx6rX=UHE-cO^gQSxy6eQjRSJ)syGc;(yhHzt3bbKl` z2JUZLf!qE0JgiJleLjR;=`usR%w@&@BL#;;w#dF&fgWjq_T3U5bQyNhkg2dIH8Q7ag&dKtHb9E+qpkDur2sNV-z3QG=8~A;0{TBYbywO z^VCYreZHIFMw|y8JQ*y&MX7=iY;;iL%R-z7Viz?JEI;G64m{II&jnM%Ms^W)(LsW9 zL1l@d3xgJ%3u+hREt?B(r4tuIJZO?8g!N4`u+o>GD$=u`u4vKYXfDXl&`YuOZ_02k zXs}W*S;58(6Pyid%-ijleY?VAt~Y5pq%AS@5uzneAI2G>os_>haUe)RgA_5?3^`kY zmEPdxF~__Vo_k5A!BxNO%er(nGm5J-MGR(?%I~s5BR1B(vz`?;eHWY+b`BdXF6^R% zg;r2Zl9(TZ`WS61@U6_=-rA)sOGVML!#I&F!K$NgR=cSqO zC^jZ1^IO9S?+Z|aX=Mk_idfq;iW2>P33v&E6b5NF1+la=HA74bRZCxbTG%iF?4rUX z50nkGZBkOE4i6&JT{|pYv$c)*&o7obyhEHg5duQHRDysXi-bGH9fU&W$5zp^r!6$d znE7aOZ#L6L&{Rp#)DS`PmGDA!8v&D{#o@tE4Kak1Mr8!8n-pzVhqoHGy*r%P7Q~=6 z$}CgU__Ant23xZ_Pfl}Oo%xFwXp;kMLdm<-}Fy_{6tMLaX@byAm~^jhMAzBaF`9C+osUC@uNDwKl=UXlvEvVMBW zakGM@-tKO+qg*9XMhCf(pc5rkda;+E9*Bu)MrWwS#a&*r4ld>IcZNj%);f%U-=@K3 zgeimn{szcor@Qcv)8Ir$x*aho^|N$-s0-Y{*Q7y)HE4J)|7|+-(hIpPHXYZWaVao9 zD%syDT|B?jwrfwPLy`xNjIBr-U02}WNvo>6@Ml~_3a)Xd;{R#5in}|8AAAJT+wH+K zfgJvNXYjQ5@1?#y(|J_}bYuHsc)Sl^h<(r*68L~WL5FUP+{tC_Q_3Yi?^p36`|~cq zHDdnX40u`I!kFjdWYNnBJjP2#LV(Cf=CRK}yH1yqNxeM2ZG#(1AweAqPS1}dFUy93 zL0j=^GJg&Bn{pd2+7IEySum7ex)Cm7*Q8U}XNrfH;~ypgM_`N_j_@4`MY27h8@b5|I z)dL~b7if3KqzPkxH?aS!|;kpCl&XFLOwPZ zdhzP15Q8GRJ{2SAo^)KrR3A7nZ-&;zHCh)f8XQ*bu22vq z1afr-Ki)MckRCpT6*+9H?%=|znCOGQ5(#Ry5L5)xq!e*o$j1JdZT*X&5E9fOLlJyh zF-n3AMJqXs&EQ`agBw$ZA%HOw8wtR$+kyZthPlF;j?8=MLMIY{58Ch}S6~#+%vvYP`1D2PFFx9tCfY9o`lRPwS&b?J9j- zC#cl=XiIyfk0TkRkF?<=z9Z!EE86;zw!RK-oyM*C{wDEzM*Mywe!msJ{}jJx>6gBA z86^@weJdmdbo3IKs0v3{KD8&@44KyE^IJu~TT`rsCY z(mnG$p(M6s%n(Wpo_8#i(S0CO3T1dEuk8al?e)@YF zy`2O0qZF>C+Oa*1=4*t90<2OiC$Q2XVAVIyjga(!oLUD0Fa+wuBDE*3Z&G$so8tsDtB! zU;(&8I_T);i*A5re9&N+i^t=8Ucx+X71H2%t);h`dWVzV(yQS&IKDo8 zHS|We2uv^NJ%@3CFIchB?-S|UoBeJ%?SCDgp!zt{`!@P9zdamB`}S`S(F(mI$A;!r z&$;==VQ`(iO)dD%Zkym&yKRDBg*HvWP+ zv`RL2i8#{9CYturBMSVV@p}eB7g2LRqemrj&1}30nQO$>&&oAWZseMVa##&nI@h=% zYa6DT@qmXY&8*L|suS|q3t3iqUWRpSdI}vWb>*?w=m?!(((6+8q2R65iYts?;>`{Y zQ{T(7vS$`zAO7jD@v|trP)z2UXQ?IheB^ZS3EB*1ssD_@?B6z=({O6K;Zq2sf0A zmT)wjl0>(O27KA_=4E2~Vk8`wopoXFPv>QJF}k*pU3$ywwA!wv>%t|MH%7s&NG&c_ z+$68o$>p|ekzBCR$%Vdb{zJA*F4K{Hom^(4A2YdlY2Th)&Uz=^y_%O72UUJzgIMuhi#mVi?ycK?_?o*GE?S8lXv|o{1j@$embK)1{ zxF3ix#?-PXTcnm_BOod}3~}EobP8;f9qcg)R_B&sYFFhJpX66fco$}=fy|=p&_HGp zJt~o0d^tL~h^?QIT;30kVS3*I%OOYSl}t7$hj$nU-?-3~68jCb85Fxnz+-bRG$wJu zXkK#*mLz-`6daTcYRQP?+jRA@>+|F*ec?uB~d%pm#MfE!Q43|T&Vi!sf`n}AD^q_+8WnRy* zY55hjX=+($>U*2p@0_?5;S%Q&^}6MmK@FN|mWeugWSUWeidMVoUGR4jsTR~LYF7zr zuHaM`>jAV!GlNV|NKly`EvPGKOUw+!*3S@B8Gmvz+#6KYja4ukJRwz$^zis8@DCUI zQ>wa)HtnjKDQIeWhCJ1CUL_sbk}*S7!|}XhRr#kup;Xlh4_`42isS&_%O_3)4?jH( zI{Fk~49^kD^9AL_^QXf~ynj_qo2J92j-hLCWIuW_E?Ui;36JtSX2MIdr!J+Nr6Us9 z>d-~absz@n`-F?G>ZSi4>iv^CxJ0~WO>Xfoi1@HsFczyUej46Q0@79XBaf)E*qDpo z?5szY*>CXC$TC~f6%m-lVg>EntL#U32zir#sSukhO`vIWSt?5%&d8;89o8WiOHq+G zC)a^-QNqz2mGF-|{Kb3V2D}-ggnuB#q(26DPr_-Lkq4@w3QCvNKmp{^v+SV0mH!nY zu}Zh3uwUi!=`}DN&l(=C&lT!*n80ls>3g6&nWncl1czX@bWpK<$*TdaG{T)qe&ZmO^ny+0bRV;HlSWst5}V^gopwFMSwV;;43ZJS31MP5&C0tzz8WpLk60DYSuZC75 zXpbsEhulyl=s?d_46SD1eaK26w*J>jQ2qe?U$6-D4nPInv|3er$jd(rz;PEbCZ|!W zY138%V3TC&*nrL~r==x@r@iOZfrnZ$Xw-rEc;0axC|U?PvJSlM*zu`7=+Ujcu25nob@ zZ_}ntitJ-SQj5be_<$&|PjYs(WXzD^c0BJ`hF?Dd`BH{I=JAYG;FH5K4|lJ`8S11} zI2==eQC2&Y=L_p`-6|Z8=7%ObkFJ0xNsy8Gk^sCC1=-;-_%=ZuF$IaQTg&9tS|cg> ze8Fm{$AgAOlIc>Z5yNgv8e#nf79FWZN6>%5$SKHmp>?Es%%ZS1HDrM)n%)<+Et2)6r{FS zWorj7Sq>Sfm-9N61 zU+yB>q-;K*O`B}s1W{Gi;xgY~^Uo_@ueM~%P|Y4Z?^rcE*6a1~=mLIXeQ-TIk+3Jy z2O}MQ3NQx$%gXhIWrN>~;3qJ6Rk*JOZk`JMxZ8^{2-6yC+ zri`X-fPvDGmQi*A|8fJ2#Dj*6vglGNqu7w)7G-p$fTd-01@(3$qnpHaT1LMvu*v9( z0-KCV(dv0JnqqT&w-d+WMZkiBW_8EZQ8b!qrlb26G^L|I+L7KZk!l^4s$Hd{Si!2U zJTH@~sPZf?5IP!x3*ES_b@U=_2_1>8|4~OcD_ZkV9(yH*AA1?sm?z>FSb?@yc5UJi z|0(iE2c&M_2>KIS&iwH)`(O(@T(B+a6_}0xW=G*R>oqtTQF<7SRb=?zA)5#BXG$P? z;@An}=u4Q%^iPKPslz;R9+w;w=u?x7iagP^BCp~X6&*M{45|FR{jhZmenaJ_Z@0vU zD1Q1{#ZN2kep-(A)8e66tn|}cdOy9&_tU#OKfU1d)B6TLy_E3Nh|^EQQa=?vKUGFQ z3EBT@{r#^od8dQW@BaZ% CA;%~H diff --git a/docs/build/doctrees/features/temporal_features.doctree b/docs/build/doctrees/features/temporal_features.doctree index d2688009b313078072f20463be33cb7da204a4e6..dfc89c91a9992c70baa3198d3ce495cdbedb490f 100644 GIT binary patch delta 4116 zcmb7HX-rgC6!zX(VA!`Af!PEqpezonRVgTfEF-89>IRYlhCW_Jfq}Lf5vhrVW-8D# zw*E1xHnGuI8%o-y#@II2CTg@x+9pkG1#A6b+N4ceQ^BR@zGW8Kh97g!yZ7AXeCM8f z&NuJAPln$ns)MSdhpi*3PbsX5=!MOS<13LQ#C7iVtAD-uOEBDA5#em`{x zy1))mw;MXb%<$M00?7t*`J_|RX>aMWbs`WK-;Gn8!8qV(w>P!6v^Kf=otpN&E8F%o zcki;hxCv(<_L_Ft91d4?HUqpMKnc^2(5)PKw4Eer8V55=U_Y7bo>0Ds( zdFr#6Bjx!TvoTu!E(X1olDcO0rHcRtnr=$kOYQi_s=Oq3-a8y7eijS-$sL zKPS{;7&K^UF%^)a_@vB6ieb#0E!vIepUZ0%E;1tc zLC7h3{u~;aq>;=xP9aifVrKel$H$eqoxJS|n8P%vfI z(QRj=uQQUTXN`j1#B{!uxf!lE}O*3 z8`tvEW7V;ZXML>JX%3mG1op=7kaFbB_(YN`pBBVRiPEBE6+YF%4xO_o;Hwza=aUL~ z7Y#3Qfpsvv%*_Sze6yt$xAv-nViY`G2+<5y8&I&?fa0oQGqJ$?A!?;P0C!{1rv}B=`dsBYbJmlk2kiZWmk;U2w&J7u=TjaJ%5v z>@K+Dj|b!w391ST=3OAU9heARmlZNi14-9p34Z7LSGBxD|E?Pl|PX$ z++@P2;)+eE-9*d?PtV#I_u+MNt-kj(IxDrMFolcN+l0%T&M zb5D_pNi+uBTmg3u-kZIWWtR`nC5t?JQ& zjkgskg=~ve*f^XT_J5f%E(iYI!6hIeK|Pe#RMHRBFkEvsfKe0VFQe79wd8+X CN?-2) literal 22179 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 z

r=n;KjcB|^Dr_+=6D3kABXB8?fSPT*#U>oGN3Q)o%kSFf3#8L8+Z@*#K>7Xl-3 zFQ*e|0A|O*jEC!>0%vG+J|9Ur%$V$xMGFk`vj=mE(_-VuUJKlx$brgGR9VC}= zoi(?+y&m%0h*ER_lq#7eSOk&1jdfPv^S3ev zqcY?Qu~j7UBSR~?eKO9M31zigky+d4N0@Vsa#Zq}$eaMbP(`E*F#!%_;1JjDM1IPX z=oD1TM-EP09MdTy<+C9_l`Ew{s3=Bjt@L4vAcTaMAfKkf=(qI&n(@~0$K$h9EV7A! zNW9qhjJuIfQoKhxkq2%tewLHG@P3u&u< z{+)L)PGqyd)G88sVtZ%9xFW8%i#zb*kcdSmNdi8fRbU~}dEA$bW>rWzDj_?S&_zR+ zEg^7;QYd_T%e7NXh{9V7g(>xHuEp8ptD@4WT>B#YLUY`0#kS%%nCV4klz{TCh5Q)y z>gm!I)Cx1{^oQN3{AH-Z^WkM!1f+_CZAos*Q?ArgsWHtJA4`jc8Xq&ArXA=6n{BE! Qr<1*pO(QL0f~~dx0}{(8>Hq)$ diff --git a/docs/build/doctrees/utils/calculate_chat_level_features.doctree b/docs/build/doctrees/utils/calculate_chat_level_features.doctree index 4bd1d9abe5536f6acba3fcda489503eb15daa015..3ffb735bb5c94d50f721b494e1d412abd28c6e34 100644 GIT binary patch delta 149 zcmbPtfpyb))`l&NdW?)U+w~b4nfSTGJxdf4i;GKhQ;VlN3oxqK=qQwDWF}`QWELwV zXQU=)r=}=m<|(A5CYF>IrN$?fX6B@%7U>mK>P^XDkDZcX&=ZYh!c_rA4Gm&V*d8Is Hcq|M6%osE* delta 274 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 MttCS3^4XmHe^hy7KmY&$ literal 74331 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 diff --git a/docs/build/doctrees/utils/preprocess.doctree b/docs/build/doctrees/utils/preprocess.doctree index 8f297d7a7b27492cb4946994573b9f56680137b6..fe5a32cc36a79d421e8f8371b59404ab433e96da 100644 GIT binary patch literal 62296 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 Kij&i3{{I3zF_u{X literal 68620 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 QwVG*?T@Wgib7|rK0=BRzC;$Ke diff --git a/docs/build/html/_sources/examples.rst.txt b/docs/build/html/_sources/examples.rst.txt index e349c7d4..bab74995 100644 --- a/docs/build/html/_sources/examples.rst.txt +++ b/docs/build/html/_sources/examples.rst.txt @@ -91,10 +91,10 @@ Now we are ready to call the FeatureBuilder on our data. All we need to do is de speaker_id_col = "speaker_nickname", message_col = "message", timestamp_col = "timestamp", - grouping_keys = ["batch_num", "round_num"], + grouping_keys = ["batch_num", "round_num"], # NOTE: This example demonstrates grouping. Use conversation_id_col if you have a single conversation identifier. vector_directory = "./vector_data/", output_file_base = "jury_output", - turns = True + turns = True # NOTE: This defaults to False. Decide whether you want to combine successive 'utterances' by the same person as a 'turn.' ) jury_feature_builder.featurize() @@ -219,6 +219,12 @@ Regenerating Vector Cache * By default, **we assume that, if your output file is named the same, that the underlying vectors are the same**. If this isn't true, you should set **regenerate_vectors = True** in order to clear out the cache and re-generate the RoBERTa and SBERT outputs. + +Generating Vectors using GPU +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +By default, we use the CPU to generate sentence vectors and cached RoBERTa sentimets. To override this feature and use a GPU when available (which will speed up the computation of the vectors), turn ``use_gpu`` to True. + + Custom Features ~~~~~~~~~~~~~~~~~ diff --git a/docs/build/html/examples.html b/docs/build/html/examples.html index 075879bf..e1936257 100644 --- a/docs/build/html/examples.html +++ b/docs/build/html/examples.html @@ -158,10 +158,10 @@

Configuring the FeatureBuilderspeaker_id_col = "speaker_nickname", message_col = "message", timestamp_col = "timestamp", - grouping_keys = ["batch_num", "round_num"], + grouping_keys = ["batch_num", "round_num"], # NOTE: This example demonstrates grouping. Use conversation_id_col if you have a single conversation identifier. vector_directory = "./vector_data/", output_file_base = "jury_output", - turns = True + turns = True # NOTE: This defaults to False. Decide whether you want to combine successive 'utterances' by the same person as a 'turn.' ) jury_feature_builder.featurize() @@ -302,6 +302,10 @@
Regenerating Vector Cache +
Generating Vectors using GPU
+

By default, we use the CPU to generate sentence vectors and cached RoBERTa sentimets. To override this feature and use a GPU when available (which will speed up the computation of the vectors), turn use_gpu to True.

+
Custom Features
@@ -98,7 +99,7 @@

feature_builder module

-class feature_builder.FeatureBuilder(input_df: DataFrame, vector_directory: str = './vector_data/', output_file_base: str = 'output', output_file_path_chat_level: str = None, output_file_path_user_level: str = None, output_file_path_conv_level: str = None, custom_features: list = [], analyze_first_pct: list = [1.0], turns: bool = False, conversation_id_col: str = 'conversation_num', speaker_id_col: str = 'speaker_nickname', message_col: str = 'message', timestamp_col: str | tuple[str, str] = 'timestamp', timestamp_unit='ms', grouping_keys: list = [], cumulative_grouping=False, within_task=False, ner_training_df: DataFrame = None, ner_cutoff: int = 0.9, regenerate_vectors: bool = False, compute_vectors_from_preprocessed: bool = False, custom_liwc_dictionary_path: str = '', convo_aggregation=True, convo_methods: list = ['mean', 'max', 'min', 'stdev'], convo_columns: list = None, user_aggregation=True, user_methods: list = ['mean', 'max', 'min', 'stdev'], user_columns: list = None)
+class feature_builder.FeatureBuilder(input_df: DataFrame, vector_directory: str = './vector_data/', output_file_base: str = 'output', output_file_path_chat_level: str = None, output_file_path_user_level: str = None, output_file_path_conv_level: str = None, custom_features: list = [], analyze_first_pct: list = [1.0], turns: bool = False, conversation_id_col: str = 'conversation_num', speaker_id_col: str = 'speaker_nickname', message_col: str = 'message', timestamp_col: str | tuple[str, str] = 'timestamp', timestamp_unit='ms', grouping_keys: list = [], cumulative_grouping=False, within_task=False, ner_training_df: DataFrame = None, ner_cutoff: int = 0.9, regenerate_vectors: bool = False, compute_vectors_from_preprocessed: bool = False, custom_liwc_dictionary_path: str = '', convo_aggregation=True, convo_methods: list = ['mean', 'max', 'min', 'stdev'], convo_columns: list = None, user_aggregation=True, user_methods: list = ['mean', 'max', 'min', 'stdev'], user_columns: list = None, use_gpu: bool = False)

Bases: object

The FeatureBuilder is the main engine that reads in the user’s inputs and specifications and generates conversational features. The FeatureBuilder separately calls the classes @@ -163,6 +164,7 @@ Defaults to [‘mean’, ‘max’, ‘min’, ‘stdev’].

  • user_columns (list, optional) – Specifies which columns (at the utterance/chat level) to aggregate for the speaker/user level. Defaults to all numeric columns.

  • +
  • use_gpu (bool, optional) – Specifies whether to use GPU for vert/bert model. Defaults to False.

  • Returns:
    @@ -350,6 +352,27 @@ +
    +
    +verify_timestamp_format(timestamp_col) None
    +

    Verifies that a column in a DataFrame is composed of values that can be parsed +either as datetime or as numeric values suitable for time difference calculations.

    +
    +
    Parameters:
    +

    timestamp_col (str) – The name of the column to verify

    +
    +
    Returns:
    +

    None

    +
    +
    Return type:
    +

    None

    +
    +
    Raises:
    +

    ValueError – If the column contains values that cannot be parsed as datetime or numeric.

    +
    +
    +
    + diff --git a/docs/build/html/features/temporal_features.html b/docs/build/html/features/temporal_features.html index d2f6d850..0e073f57 100644 --- a/docs/build/html/features/temporal_features.html +++ b/docs/build/html/features/temporal_features.html @@ -60,7 +60,6 @@
  • politeness_features module
  • hedge module
  • temporal_features module @@ -111,21 +110,6 @@

    temporal_features module

    -
    -
    -features.temporal_features.coerce_to_date_or_number(value)
    -

    Helper function in which we check that the timestamp column contains either a datetime value or a number -that can be interpreted as a time elapsed; otherwise, sets it equal to none.

    -
    -
    Parameters:
    -

    value – The value to check; type can be anything

    -
    -
    Returns:
    -

    Either the value itself (if it is a valid timestamp value) or None otherwise

    -
    -
    -
    -
    features.temporal_features.get_time_diff(df, on_column, conversation_id_col, timestamp_unit)
    diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index f5b21ec3..4c705366 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -96,6 +96,7 @@

    Index

    | S | T | U + | V | W @@ -106,8 +107,6 @@

    A

  • @@ -169,8 +168,6 @@

    C

  • classify_text_dalechall() (in module features.readability)
  • clean_text() (in module features.politeness_v2_helper) -
  • -
  • coerce_to_date_or_number() (in module features.temporal_features)
  • commit_data() (in module features.politeness_v2_helper)
  • @@ -186,10 +183,10 @@

    C

  • conjection_seperator() (in module features.politeness_v2_helper)
  • - - + +

    V

    + + +
    +

    W

    @@ -159,7 +160,7 @@
    -utils.check_embeddings.generate_bert(chat_data, output_path, message_col, batch_size=64)
    +utils.check_embeddings.generate_bert(chat_data, output_path, message_col, device, batch_size=64)

    Generates RoBERTa sentiment scores for the given chat data and saves them to a CSV file.

    Parameters:
    @@ -228,7 +229,7 @@
    -utils.check_embeddings.generate_vect(chat_data, output_path, message_col, batch_size=64)
    +utils.check_embeddings.generate_vect(chat_data, output_path, message_col, device, batch_size=64)

    Generates sentence vectors for the given chat data and saves them to a CSV file.

    Parameters:
    @@ -236,6 +237,7 @@
  • chat_data (pd.DataFrame) – Contains message data to be vectorized.

  • output_path (str) – Path to save the CSV file containing message embeddings.

  • message_col (str, optional) – A string representing the column name that should be selected as the message. Defaults to “message”.

  • +
  • device (str) – A string representing the device to use for computation, either “cpu” or “cuda”.

  • batch_size (int) – The size of each batch for processing sentiment analysis. Defaults to 64.

  • @@ -259,7 +261,7 @@
    -utils.check_embeddings.get_sentiment(texts)
    +utils.check_embeddings.get_sentiment(texts, model_bert, device)

    Analyzes the sentiment of the given list of texts using a BERT model and returns a DataFrame with scores for positive, negative, and neutral sentiments.

    Parameters:
    diff --git a/docs/build/html/utils/preprocess.html b/docs/build/html/utils/preprocess.html index 3e00f85a..1d9afed0 100644 --- a/docs/build/html/utils/preprocess.html +++ b/docs/build/html/utils/preprocess.html @@ -57,7 +57,6 @@
  • Other Utilities
    • preload_word_lists module
    • preprocess module
        -
      • assert_key_columns_present()
      • compress()
      • create_cumulative_rows()
      • get_turn_id()
      • @@ -106,26 +105,6 @@

        preprocess module

        -
        -
        -utils.preprocess.assert_key_columns_present(df: DataFrame, column_names: dict) None
        -

        Ensure that the DataFrame has essential columns and handle missing values.

        -

        This function if the essential columns conversation_id_col, speaker_id_col, and -message_col are present. If any of these columns are missing, a -KeyError is raised.

        -
        -
        Parameters:
        -
          -
        • df (pandas.DataFrame) – The DataFrame to check and process.

        • -
        • column_names (dict) – Columns to preprocess.

        • -
        -
        -
        Raises:
        -

        KeyError – If one of conversation_id_col, speaker_id_col, and message_col columns is missing.

        -
        -
        -
        -
        utils.preprocess.compress(turn_df, message_col)
        @@ -295,7 +274,7 @@
        -utils.preprocess.remove_unhashable_cols(df: DataFrame, column_names: dict) DataFrame
        +utils.preprocess.remove_unhashable_cols(df: DataFrame, column_names: dict, warning: bool = True) DataFrame

        If a required column contains unhashable types, raise an error. Otherwise, remove those columns from the DataFrame and print a warning message.

        diff --git a/docs/source/basics.rst b/docs/source/basics.rst index 95eba513..1fe30963 100644 --- a/docs/source/basics.rst +++ b/docs/source/basics.rst @@ -92,11 +92,13 @@ Here are some parameters that can be customized. For more details, refer to the 5. ``regenerate_vectors``: Force-regenerate vector data even if it already exists. -6. **compute_vectors_from_preprocessed**: Computes vectors using preprocessed text (that is, with capitalization and punctuation removed). This was the default behavior for v.0.1.3 and earlier, but we now default to computing metrics on the unpreprocessed text (which INCLUDES capitalization and punctuation), and this parameter now defaults to False. +6. ``use_gpu``: If set to True and a GPU is available, the package will generate sentence vectors (SBERT) and RoBERTa sentiments using the GPU. Defaults to False (which means the package will only use the CPU). -7. **custom_liwc_dictionary_path**: Allows the user to "bring their own" LIWC dictionary, and thereby access more recent versions of the LIWC features. Our default version of LIWC is 2007, but users can obtain more recent versions of the lexicon by contacting `Ryan Boyd `_ and `Jamie Pennebaker `_. For more information on using the custom LIWC dictionary, please see :ref:`liwc`. +7. ``compute_vectors_from_preprocessed``: Computes vectors using preprocessed text (that is, with capitalization and punctuation removed). This was the default behavior for v.0.1.3 and earlier, but we now default to computing metrics on the unpreprocessed text (which INCLUDES capitalization and punctuation), and this parameter now defaults to False. -8. **Custom Aggregation of Utterance (Chat)-Level Attributes** (``convo_aggregation``, ``convo_methods``, ``convo_columns``, ``user_aggregation``, ``user_methods``, and ``user_columns``): Customize the ways in which attributes at a lower level of analysis (for example, the number of words in a given message) get aggregated to a higher level of analysis (for example, the total number of words in an entire conversation.) See the Worked Example (:ref:`custom_aggregation`) for details. +8. ``custom_liwc_dictionary_path``: Allows the user to "bring their own" LIWC dictionary, and thereby access more recent versions of the LIWC features. Our default version of LIWC is 2007, but users can obtain more recent versions of the lexicon by contacting `Ryan Boyd `_ and `Jamie Pennebaker `_. For more information on using the custom LIWC dictionary, please see :ref:`liwc`. + +9. **Custom Aggregation of Utterance (Chat)-Level Attributes** (``convo_aggregation``, ``convo_methods``, ``convo_columns``, ``user_aggregation``, ``user_methods``, and ``user_columns``): Customize the ways in which attributes at a lower level of analysis (for example, the number of words in a given message) get aggregated to a higher level of analysis (for example, the total number of words in an entire conversation.) See the Worked Example (:ref:`custom_aggregation`) for details. Example Usage: diff --git a/docs/source/examples.rst b/docs/source/examples.rst index e349c7d4..bab74995 100644 --- a/docs/source/examples.rst +++ b/docs/source/examples.rst @@ -91,10 +91,10 @@ Now we are ready to call the FeatureBuilder on our data. All we need to do is de speaker_id_col = "speaker_nickname", message_col = "message", timestamp_col = "timestamp", - grouping_keys = ["batch_num", "round_num"], + grouping_keys = ["batch_num", "round_num"], # NOTE: This example demonstrates grouping. Use conversation_id_col if you have a single conversation identifier. vector_directory = "./vector_data/", output_file_base = "jury_output", - turns = True + turns = True # NOTE: This defaults to False. Decide whether you want to combine successive 'utterances' by the same person as a 'turn.' ) jury_feature_builder.featurize() @@ -219,6 +219,12 @@ Regenerating Vector Cache * By default, **we assume that, if your output file is named the same, that the underlying vectors are the same**. If this isn't true, you should set **regenerate_vectors = True** in order to clear out the cache and re-generate the RoBERTa and SBERT outputs. + +Generating Vectors using GPU +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +By default, we use the CPU to generate sentence vectors and cached RoBERTa sentimets. To override this feature and use a GPU when available (which will speed up the computation of the vectors), turn ``use_gpu`` to True. + + Custom Features ~~~~~~~~~~~~~~~~~