Как проверить, если фраза на английском языке в масштабе - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно обогатить мой фрейм данных в PySpark-Sql атрибутом языка, который в основном говорит на языке названия статьи для каждой строки.Мне нужно отфильтровать только английские бумаги.У меня десятки миллионов документов, поэтому мне нужно сделать это параллельно.

Я зарегистрировал UDF, используя библиотеку Python с именем langdetect (https://pypi.org/project/langdetect/), после установки библиотеки накластер. Я использую следующий код:

from langdetect import detect

def lang_detector(_s):
  try:
    lan = detect(_s)
  except:
    lan = 'null'
  return lan

detect2 = udf(lang_detector, StringType())

papers_abs_fos_en = papers_abs \
.join(papersFos_L1, "PaperId") \
.withColumn("Lang", detect2(col("PaperTitle"))) \
.filter("Lang =='en'") \
.select("PaperId", "Rank", "PaperTitle", "RefCount", "CitCount", "FoSList")

Это работает, но это занимает вечность даже на названиях около 10 млн. Я не уверен, если это из-за langdetect, UDF или еслиЯ просто делаю что-то не так, но буду благодарен за любое предложение!

Большое спасибо! Paolo

1 Ответ

0 голосов
/ 16 апреля 2019

Спасибо, cronoik, за подтверждение этого. Я остановился на другом решении, которое заняло 6+ минут для 9,5 млн документов. По сути, я делаю набор всех слов из набора данных Брауна в NLTK и распределяю его по узлам в качестве широковещательной переменной. Затем я вычислил для каждого документа в кадре данных долю слов в этом наборе. Если это> 75%, то я эвристически заключаю, что это должен быть английский. Это код, встроенный в UDF.

from nltk.corpus import brown
import re

bwn = set([x.lower() for x in brown.words()])
bc_brown = sc.broadcast(bwn)

def is_en(_s):
  tok = set(re.findall(r"\w+", _s.lower()))
  return len(tok & bc_brown.value) / len(tok)

isEn = udf(is_en)

papers_abs_fos_en = papers_abs \
.join(papersFos_L1, "PaperId") \
.filter(isEn(col("PaperTitle")) > 0.75) \
.select("PaperId", "Rank", "PaperTitle", "RefCount", "CitCount", "FoSList")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...