如何检查一个短语是不是是英文的

Posted

技术标签:

【中文标题】如何检查一个短语是不是是英文的【英文标题】:How to check if a phrase is in english at scale如何检查一个短语是否是英文的 【发布时间】:2019-04-12 16:50:55 【问题描述】:

我需要在 PySpark-Sql 中使用语言属性丰富我的数据框,该属性基本上告诉每一行论文标题的语言。我只需要过滤掉英文论文。我有几千万篇论文,所以我需要并行处理。

在集群上安装库后,我使用名为 langdetect (https://pypi.org/project/langdetect/) 的 Python 库注册了 UDF。我正在使用以下代码:

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")

它有效,但即使在 ca 10M 标题上也需要很长时间。我不确定这是由于 langdetect、UDF 还是我做错了什么,但我将不胜感激任何建议!

非常感谢! 保罗

【问题讨论】:

UDF 是这里的主要问题,我认为您无能为力。阅读此post 了解更多信息。我们曾经使用 langdetect 检测 160000 条文本,大约需要 45 分钟。 【参考方案1】:

感谢 cronoik 确认这一点。我最终得到了一个不同的解决方案,该解决方案需要 6 分钟以上才能处理 9,500 万份文档。基本上,我在 NLTK 中制作了一组 Brown 数据集中的所有单词,并将其作为广播变量分发到节点。然后我为数据框中的每个文档计算了该集合中出现的单词的比例。如果它> 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")

【讨论】:

以上是关于如何检查一个短语是不是是英文的的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 查询以检查某些短语(重复文章、抄袭)

句型的短语,直接短语,句柄

如何通过检查 v. 字典查找短语中删除空格的单词数

informix 14.10 如何“选择”返回一个特定的短语,如无或空白,而不是没有结果

JQuery Validator Method 检查某些短语

Java - 如何使用密码短语手动加密数据? [关闭]