首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在规模上检查短语是否为英语

如何在规模上检查短语是否为英语
EN

Stack Overflow用户
提问于 2019-04-13 00:50:56
回答 1查看 104关注 0票数 0

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

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

代码语言:javascript
运行
复制
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")

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

非常感谢!保罗

EN

回答 1

Stack Overflow用户

发布于 2019-04-16 15:58:03

谢谢你的确认,cronoik。我最终选择了一个不同的解决方案,即95M文档的6+分钟。基本上,我在NLTK中创建了一组Brown数据集中的所有单词,并将其作为广播变量分发给节点。然后,我为数据帧中的每个文档计算了该集合中出现的单词的分数。如果它> 75%,那么我启发式地得出结论,它一定是英语的。这是嵌入到UDF中的代码。

代码语言:javascript
运行
复制
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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55656347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档