Вопрос или проблема
Я пытаюсь создать mapper.py в Linux, который затем будет работать в комбинации с reducer.py на базе данных h1b.
Вот код, который я использую:
import sys
for line in sys.stdin:
line = line.strip()
EMPLOYER_NAME = line.split(",") [1].strip()
PREVAILING_WAGE = line.split (",") [5].strip()
JOB_TYPE = "академический" if "УНИВЕРСИТЕТ" in EMPLOYER_NAME.lower() else "индустрия"
print ('%s\t%s\t%s' % (JOB_TYPE,EMPLOYER_NAME,PREVAILING_WAGE))
Код работает, но классифицирует все записи как “индустрия” вместо некоторых как “индустрия”, а некоторые как “академический”. Например, “Университет Мичигана” классифицируется как “индустрия”.
введите описание изображения здесь
Я попытался проверить, что в слове university в колонке “Employer_Name” нет пробелов или других символов, и их нет, так что это не должно быть проблемой.
Ответ или решение
Создание mapper.py в Linux и проблема с оператором if
Вы разрабатываете скрипт mapper.py для обработки данных из базы данных H1B, и столкнулись с проблемой, при которой все записи классифицируются как "индустрия". Давайте разберемся с вашим кодом и определим, что может быть причиной этого.
Анализ кода
Ваш код выглядит следующим образом:
import sys
for line in sys.stdin:
line = line.strip()
EMPLOYER_NAME = line.split(",")[1].strip()
PREVAILING_WAGE = line.split(",")[5].strip()
JOB_TYPE = "academic" if "UNIVERSITY" in EMPLOYER_NAME.lower() else "industry"
print('%s\t%s\t%s' % (JOB_TYPE, EMPLOYER_NAME, PREVAILING_WAGE))
Ошибки в коде
-
Неверное определение "academic": Ваша логика определения типа работы зависит от проверки наличия слова "UNIVERSITY" в названиях работодателей. Проблема может возникнуть, если вы используете строки, которые могут не содержать точного совпадения. Например, названия университетов могут быть записаны с ошибками или включать другие символы.
-
Проблемы с данными: Хотя вы отметили, что в поле EMPLOYER_NAME нет пробелов или других символов, важно также быть уверенным в корректной обработке данных. Если у вас есть записи с дополнительными пробелами или знаками препинания, это может влиять на результат. Убедитесь, что в названиях работодателей нет невидимых символов.
Рекомендации по исправлению
-
Убедитесь в корректности данных: Проверьте, что данные в ваших входных файлах не содержат лишних символов. Вы можете добавить вывод для отладки, чтобы увидеть, какие именно значения передаются в
EMPLOYER_NAME
. -
Расширьте проверку на наличие "UNIVERSITY": Попробуйте использовать регулярные выражения для более гибкой проверки. Например, можно использовать библиотеку
re
:import re import sys for line in sys.stdin: line = line.strip() EMPLOYER_NAME = line.split(",")[1].strip() PREVAILING_WAGE = line.split(",")[5].strip() # Используем регулярное выражение для проверки "university" JOB_TYPE = "academic" if re.search(r'\b(university)\b', EMPLOYER_NAME, re.I) else "industry" print('%s\t%s\t%s' % (JOB_TYPE, EMPLOYER_NAME, PREVAILING_WAGE))
-
Логирование для отладки: Добавьте вывод для проверки переменной
EMPLOYER_NAME
, прежде чем сделать классификацию, чтобы убедиться, что она действительно содержит то, что вы ожидаете:print("Employer:", EMPLOYER_NAME)
-
Проверка формата входных данных: Убедитесь, что формат входных данных соответствует ожидаемому. Возможно, не все строки содержат запятые, или они могут иметь разное количество полей.
Заключение
Следуя вышеуказанным рекомендациям, вы сможете устранить проблему с неправильной классификацией работодателей в вашем скрипте mapper.py. Важно внимательно анализировать данные, идентифицировать потенциальные проблемы с форматированием и при необходимости использовать более гибкие механизмы поиска и сопоставления. Это позволит вам добиться правильного результата: некоторые записи будут правильно классифицированы как "academic", а другие — как "industry".