PySpark получает файл вектора слов из hdfs и выполняет word2vec.
PySpark получает файл вектора слов из hdfs и выполняет word2vec.

0. Предисловие

Предыстория: Word2vec необходимо рутинизировать в pyspark, но загрузка предварительно обученных векторов слов является большой проблемой, поэтому его необходимо сначала загрузить в HDFS, а затем получить с помощью кода. После исследования я обнаружил, что, хотя у pyspark есть собственный метод word2vec, он, похоже, не может загрузить предварительно обученный вектор слов txt.

Поэтому общие этапы следует разделить на два этапа:

1. Получите векторный файл слов из hdfs.

2. Выполните сегментацию слов + обработку векторизации данных в кадре данных pyspark.

1. Получите векторный файл слов.

Существует множество векторных файлов слов с открытым исходным кодом, которые по сути представляют собой текстовые документы в форме ключ-значение. Возьмем в качестве примера вектор слов Tencent AI Lab.

https://ai.tencent.com/ailab/nlp/en/embedding.html

Сначала вам нужно загрузить текстовый файл вектора слов в HDFS, а затем использовать искровой файл в коде для распространения файла каждому работнику:

Язык кода:javascript
копировать
from pyspark.sql import SparkSession
from pyspark import SparkFiles

# Отправьте вектор слов HDFS каждому работнику.
sparkContext = spark.sparkContext
sparkContext.addPyFile("hdfs://******/tencent-ailab-embedding-zh-d100-v0.2.0-s.txt")

# Метод использования файлов: Точно так же, как «/***/***» при локальном использовании файлов.
SparkFiles.get("tencent-ailab-embedding-zh-d100-v0.2.0-s.txt")

Этот этап требует много времени, главным образом, из-за этапа отправки векторов слов каждому работнику. Если файл вектора слов большой, это может занять больше времени.

2. Сегментация слов + обработка векторизации

После того, как предварительно обученные векторы слов будут отправлены каждому работнику, следующим шагом будет сегментация данных и получение векторов слов. Функция udf используется для выполнения вышеуказанных операций:

Язык кода:javascript
копировать
import pyspark.sql.functions as f

# Определите сегментацию слов и векторизованную UDF
@f.udf(StringType())
def generate_embedding(title, subtitle=None):
    cut_title = jieba.lcut(title.lower())
    if subtitle is None:
        cut_sentence = cut_title
    else:
        cut_subtitle = jieba.lcut(title.lower())
        cut_sentence = cut_title + cut_subtitle
    
    res_embed = []
    for word in cut_sentence:
        # Выберите здесь не обрабатывать незарегистрированные слова. Вместо этого вы также можете использовать unk
        try:  
            res_embed.append(model.get_vector(word))
        except:
            pass
    
    # Выполните avg_pooling для векторов слов
    if len(res_embed)==0:
        avg_vectors = np.zeros(100)
    else:
        res_embed_arr = np.array(res_embed)
        avg_vectors = res_embed_arr.mean(axis=(0))
    avg_vectors = np.round(avg_vectors,decimals=6)
            
    # Конвертировать в необходимый формат
    tmp = []
    for j in avg_vectors:
        tmp.append(str(j))
    output = ','.join(tmp)
    return output
    

Здесь возникнет проблема, если вам понадобится использовать пользовательский словарь jieba.,почему я здесьpysparkреализовано наjieba.load_userdict()

  1. Если этот метод используется непосредственно в pyspark, загруженный словарь не будет играть никакой роли при выполнении udf, что приведет к недопустимой загрузке.
  2. Кроме того, если этот метод используется непосредственно в UDF, словарь будет загружаться один раз при вычислении каждой строки кадра данных, в результате чего повторная загрузка будет занимать слишком много времени.
  3. Существуют и другие методы, такие как передача jieba в качестве параметра в каррированный udf или создание нового экземпляра jieba Tokenizer. Передача udf в качестве параметра или глобальной переменной также не работает, поскольку в jieba есть блокировка потока. и не может быть сериализован.

Следовательно, необходим способ загрузить его только один раз на каждого рабочего.

Сначала отправьте пользовательский словарь каждому работнику в основном методе:

Язык кода:javascript
копировать
# Доставьте словарь HDFS каждому работнику.
sparkContext.addPyFile("hdfs://xxxxxxx/word_dict.txt")

Затем вudfДобавьте в первую строкуjieba.dt.initializedОпределите, нужно ли загружать словарь:

Язык кода:javascript
копировать
if not jieba.dt.initialized:
    jieba.load_userdict(SparkFiles.get("word_dict.txt"))

Это прекрасно решает эту проблему~

ссылка:

https://github.com/fxsjy/jieba/issues/387

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.