Этика ИИ, Обработка естественного языка
Этика искусственного интеллекта: определение вашей этнической принадлежности и пола
Изучение обработки естественного языка (NLP) и машинного обучения
Может ли ИИ определить ваш пол на основе одного твита?
Почему это важный вопрос? В конечном счете, это ступенька к ответу на этический вопрос: следует ли нам учить искусственный интеллект определять вашу этническую принадлежность? Это вопрос, аналогичный следующему: если бы у нас была полная свобода действий, научили бы мы наших детей распознавать чью-то национальность? этническая принадлежность?
Как создатели и пользователи этих инструментов, мы несем ответственность за регулирование ИИ аналогично тому, как мы применяем ремни безопасности и ограничения скорости.
На пути к этике ИИ мы можем сначала изучить способность ИИ предсказывать ваш пол просто на основе текста. Мы не будем использовать голосовое распознавание или распознавание лиц, потому что это было бы слишком просто.
Чтобы повысить экономическую ценность, каковы бизнес-кейсы для классификации пола?
- Лучшая сегментация клиентов: компании могут сократить и оптимизировать расходы на рекламу, правильно идентифицируя клиентов и обеспечивая более персонализированный маркетинг.
- Лучший опыт электронной коммерции: в такой индустрии, как мода, определение правильного пола улучшает качество обслуживания клиентов, позволяет розничным продавцам адаптировать предложения в соответствии с вашими потребностями и может увеличить продажи.
- Лучшие системы рекомендаций: некоторые алгоритмы основаны на сходстве клиентов с полом в качестве ключевой переменной. Это может помочь вам найти группы по интересам (например, для мам или пап), гендерные темы (например, беременность) или потенциальные развлекательные предпочтения в фильмах, музыке или книгах.
- Деловая этика: компании все чаще нуждаются в согласовании социальных проблем и реагировании на них. Восприятие бренда новым поколением может привести к значительному росту или потере клиентов, например, компаний социальных сетей и чувства «доверия» человека, использующего этот продукт.
Но можем ли мы действительно определить пол только по тексту? Давайте исследуем это с помощью обработки естественного языка и машинного обучения. Вот 6 твиттер-цитат общественных деятелей.
Можете ли вы угадать пол лучше, чем машина?
- «Но ты должен делать то, о чем мечтаешь, даже когда тебе страшно». (мужчина или женщина?)
- «Моему самому большому ребенку сегодня 11 лет! Я так горжусь тем добрым, артистичным, любопытным, чутким, умным и отзывчивым человеком, которым она стала. Время идет так быстро. Семейный ужин в нашем любимом месте »(мужчина или женщина?)
- «Не заблуждайтесь, мы, возможно, сейчас находимся в ужасном месте, но молодые люди на этой фотографии скоро возьмут на себя ответственность, и то, чего они хотят, довольно ясно». (мужчина или женщина?)
- «Сегодня Всемирный день здоровья, и мы глубоко признательны всем нашим медицинским работникам. Они по-прежнему отдают нам все свои силы каждый день, подвергая себя огромному риску, и мы не можем отблагодарить их достаточно за их храбрость и их службу ». (мужчина или женщина?)
- «Почему именно сейчас? Потребности становятся все более насущными, и я хочу увидеть, как они повлияют на мою жизнь. Я надеюсь, что это вдохновит других сделать что-то подобное. Жизнь слишком коротка, поэтому давайте сделаем все, что в наших силах, чтобы помочь людям прямо сейчас ». (мужчина или женщина?)
- "Не глупи, если тебе не нравится то, что все делают вид, что любят". (мужчина или женщина?)
Построение модели машинного обучения для гендерного прогнозирования с использованием данных Twitter
Шаги:
1. Получить данные Twitter
2. Очистить данные
3. Построить модель
4. Предсказать пол
5. Обсудить следующие шаги
1. Получите данные Twitter
# Import libraries import json import pprint import tweepy as tw import pandas as pd # Connect to Twitter API path_auth = '[your file path to twitter API keys]' auth = json.loads(open(path_auth).read()) pp = pprint.PrettyPrinter(indent=4) my_consumer_key = auth['my_consumer_key'] my_consumer_secret = auth['my_consumer_secret'] my_access_token = auth['your_access_token'] my_access_token_secret = auth['my_access_token_secret'] auth = tw.OAuthHandler(my_consumer_key, my_consumer_secret) auth.set_access_token(my_access_token, my_access_token_secret) api = tw.API(auth) type(api)
Загрузите список желаемых пользователей Twitter с указанием их пола: 0 = мужской, 1 = женский.
# Upload list of desired Twitter users # Gender classification: 0 = male, 1 = female users = pd.read_csv('../Data/twitter-users.csv') users.sample(20)
Используйте Twitter API, чтобы получать твиты от пользователей и создавать DataFrame.
# Get collection of tweets and store into a new dataframe list = [] for index, row in users.iterrows(): tweets = api.user_timeline(screen_name=row['user'], count=200, include_rts=False) users_text = [[tweet.user.screen_name, tweet.text, row['gender']] for tweet in tweets] tweet_text = pd.DataFrame(data=users_text, columns=["user", "text", "gender"]) list.append(tweet_text) # Merge the list tweets = pd.concat(list) tweets
# Check percentages for each gender # 0 = male, 1 = female tweets.gender.value_counts(normalize=True, sort=False)
Данные относятся к равномерному гендерному распределению, это может измениться, когда мы очистим текст.
2. Чистые данные
Удалите из текста все, что не нужно для обучения модели.
# Import libraries import numpy as np import re import spacy from matplotlib import pyplot as plt # Clean text def clean_text(text): # Reduce multiple spaces and newlines to only one text = re.sub(r'(\s\s+|\n\n+)', r'\1', text) # Remove double quotes text = re.sub(r'"', '', text) return text tweets['clean_text'] = tweets['text'].apply(clean_text) # Remove hyperlinks tweets['clean_text'] = tweets['clean_text'].str.replace('http\S+|www.\S+', '', case=False) # Remove patterns def remove_pattern(text,pattern): # re.findall() finds the pattern i.e @user and puts it in a list for further task r = re.findall(pattern,text) # re.sub() removes @user from the sentences in the dataset for i in r: text = re.sub(i,"",text) return text tweets['clean_text'] = np.vectorize(remove_pattern)(tweets['clean_text'], "@[\w]*") # Removes all @ tweets['clean_text'] = np.vectorize(remove_pattern)(tweets['clean_text'], "&") # Removes all & tweets['clean_text'] = np.vectorize(remove_pattern)(tweets['clean_text'], "#[\w]*") # Removes all # # Remove stop words and apply lemmatization nlp = spacy.load('en') def convert_text(text): sent = nlp(text) ents = {x.text: x for x in sent.ents} tokens = [] for w in sent: if w.is_stop or w.is_punct: continue if w.text in ents: tokens.append(w.text) else: tokens.append(w.lemma_.lower()) text = ' '.join(tokens) return text tweets['clean_text'] = tweets['clean_text'].apply(convert_text) tweets.sample(15)
Есть еще текст, который нужно почистить.
# Remove punctuation, numbers, and special characters tweets['clean_text'] = tweets['clean_text'].str.replace("[^a-zA-Z#]", " ") # Remove short words less than 3 tweets['clean_text'] = tweets['clean_text'].apply(lambda x: ' '.join([w for w in x.split() if len(w)>3])) # Count the length of characters tweets['clean_length'] = tweets['clean_text'].apply(len) # Remove rows where character length <= 20 tweets = tweets[tweets.clean_length > 20] tweets.sample(n=15)
3. Построить модель
Мы можем использовать «Мешок слов» для построения модели. Есть и другие методы, например, использование термина "частота - обратная частота документа" (TF-IDF).
# Import libraries from sklearn.feature_extraction.text import CountVectorizer from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import f1_score # Bag-of-words features bow_vectorizer = CountVectorizer(stop_words='english') # Bag-of-words feature matrix bow = bow_vectorizer.fit_transform(tweets['clean_text']) df_bow = pd.DataFrame(bow.todense(), columns=bow_vectorizer.get_feature_names()) df_bow
# Splitting the data into training and test set X = df_bow y = tweets['gender'] # Use Bag-of-words features X_train_bow, X_test_bow, y_train_bow, y_test_bow = train_test_split(X, y, test_size=0.20)
Для первоначального прогноза мы можем использовать логистическую регрессию. Есть и другие модели, такие как Decision Tree или XGBoost.
# Fitting on Logistic Regression model logreg = LogisticRegression() logreg.fit(X_train_bow, y_train_bow) prediction_bow = logreg.predict_proba(X_test_bow) # Calculating the F1 score # If prediction is greater than or equal to 0.5 than 1, else 0 # Gender, 0 = male and 1 = female prediction_int = prediction_bow[:,1]>=0.5 prediction_int = prediction_int.astype(np.int) # Calculating F1 score log_bow = f1_score(y_test_bow, prediction_int) log_bow
4. Прогнозировать пол
После обучения модели и получения приемлемого показателя точности пора с самого начала спрогнозировать пол этих 6 твитов.
- «Но ты должен делать то, о чем мечтаешь, даже когда тебе страшно».
- «Моему самому большому ребенку сегодня 11 лет! Я так горжусь тем добрым, артистичным, любопытным, чутким, умным и отзывчивым человеком, которым она стала. Время идет так быстро. Семейный ужин в нашем любимом месте »
- «Не заблуждайтесь, мы, возможно, сейчас находимся в ужасном месте, но молодые люди на этой фотографии скоро возьмут на себя ответственность, и то, чего они хотят, совершенно ясно».
- «Сегодня Всемирный день здоровья, и мы глубоко признательны всем нашим медицинским работникам. Они по-прежнему отдают нам все свои силы каждый день, подвергая себя огромному риску, и мы не можем отблагодарить их за их храбрость и службу ».
- «Почему именно сейчас? Потребности становятся все более насущными, и я хочу увидеть, как они повлияют на мою жизнь. Я надеюсь, что это вдохновит других сделать что-то подобное. Жизнь слишком коротка, поэтому давайте сделаем все, что в наших силах, чтобы помочь людям прямо сейчас ».
- «Не чувствуй себя глупо, если тебе не нравится то, что все делают вид, что любят».
Импортируйте приведенные выше данные и обработайте их так же, как данные обучения.
# Import testing set testset = pd.read_csv('Data/twitter-test.csv') # Bag-of-words feature matrix bow = bow_vectorizer.transform(testset['text']) df_bow_test = pd.DataFrame(bow.todense(), columns=bow_vectorizer.get_feature_names()) df_bow_test
Теперь используйте логистическую регрессию, чтобы предсказать пол.
# Predict probability z = df_bow_test pred_prob = logreg.predict_proba(z) pred_prob = pd.DataFrame(data=pred_prob, columns=['percentage_0', 'percentage_1']) # Predict classification pred = logreg.predict(z) pred = pd.DataFrame(data=pred, columns=['predicted_gender']) # Store into the same DataFrame result = pd.concat([testset, pred, pred_prob], axis=1, sort=False) result # 0 = male, 1 = female
Результат:
Машина точно предсказала пол на 100%. Как у вас дела по сравнению с машиной?
5. Дальнейшие действия
Модель все еще может быть усовершенствована многими способами для повышения точности:
- Использование Term Frequency-Inverse Document Frequency (TF-IDF) для извлечения признаков.
- Использование комбинаций функций Bag-of-words и TF-IDF с различными моделями: логистическая регрессия, дерево решений, XGBoost.
- Оптимизация гиперпараметров.
- Использование нейронных сетей для лучшей обработки естественного языка.
Конечно, вы можете обмануть машину, используя различные слова или формулировки, нейтральные в гендерном отношении. Но в чем это значение? Если бы машина могла определить ваш пол исключительно на основе текста, что произойдет, если мы предоставим ему больше данных о вашем голосе, распознавании лиц, физических атрибутах, транзакциях с кредитными картами, покупках, поведении в социальных сетях или вашем социальном графике?
Если вы экстраполируете это, с учетом правильных данных, машина сможет определить ваш возраст, социально-экономический статус, сексуальность, психологическое здоровье и этническую принадлежность так же, как и человек, или даже лучше.
Искусственный интеллект находится на этапе, когда то, что мы делаем сегодня, создаст в будущем большой эффект снежного кома, который затем может стать необратимым. Возьмите аналогию с поп-музыкой и рок-музыкой, которая зародилась примерно в 1950-х годах и стала глобальным явлением.
Мы можем создавать, проектировать и использовать технологии как во благо, так и во вред. Это решение остается за нами, как его создателями и пользователями. Но есть ли правила, нормы или этика, которые мы должны соблюдать? Например, если у нас есть выбор, должны ли мы научить наши машины определять чью-либо этническую принадлежность? Будет это хорошо или плохо для человечества? Что произойдет через 50 лет, если мы это сделаем, или нет, или есть другой способ задуматься над этим вопросом?