【问题标题】:Cleaning Webscrape Text for FastText in Python在 Python 中为 FastText 清理 Webscrape 文本
【发布时间】:2021-12-11 22:32:18
【问题描述】:

BLUF:如何清理大型语料库中存在单词混为一谈的问题(如“quartzbackpa”或“passquarterback”)?

背景: 我正在为我的数据科学学位开展我的 Capstone 项目,该项目需要抓取有关 NFL QB 的体育文章以分析其内容,以试图确定是否存在基于种族的隐性偏见。我已经使用 trafilatura 抓取了 11,000 多篇文章,并将它们组合成两个语料库:白色和非白色。每个都包含大约一半的这些文章。然后,我对语料库进行预处理(词干提取、删除停用词、存储在 CSV 中,每行代表一个句子,每个单元格代表句子中的一个单词)。

当我对语料库运行 FastText 并查找最近的邻居时,我只会得到一个最接近的单词列表,这些单词只不过是带有微小偏差的原始单词。例如:

model.nearest_neighbors('smart')

[('smartidea', 0.36853086948394775), ('vsmart', 0.326141357421875), ('intelligent', 0.3181183338165283), ('smartpo', 0.27458563446998596), ('smartqb', 0.2703150510787964)]

这适用于所有结果;我的语料库中有很多脏数据。问题是:如何应用解决方案?

我尝试过的解决方案

  • 创建了一个函数来测试字典中是否存在单词。如果没有,提示输入单词应该是什么,并将结果存储在代码也检查的自定义字典中。这个解决方案有效,但花费的时间太长(我熬夜 6 个小时来处理 100,000 个字符中的一大块 - 仅白色语料库我还有 114 个字符)。

  • 编辑了之前的解决方案,只记录字典中不存在的单词的位置,这样我就可以返回并手动更改它。这也花了很长时间;我将其设置为运行并在一天后返回,却发现完成了 2 个块。

我不需要特定的代码,只需要可以帮助解决此问题的一般流程/包。如果没有,也请告诉我。

【问题讨论】:

    标签: python web-scraping data-cleaning corpus fasttext


    【解决方案1】:

    通常,如果您有足够的数据,您可以忽略这些问题。错别字和其他故障只是一点点随机噪声,它对最感兴趣的常用词的最终向量的影响可以忽略不计。 (事实上​​,通过使用 FastText,即使是拼写错误的 char n-gram 子字符串也可能仍然从相同的周围使用上下文中获得稍微有用的子词向量。)

    在某种程度上,此类“垃圾”词可能会使来自词分布的更频繁“头部”的更显着结果变得混乱,因此忽略出现在特定频率以下的词通常是有意义的——因为它们往往具有较弱的向量(来自较少的训练示例),即使它们不是纯拼写错误/垃圾标记。

    在一定程度上,训练过程已经通过默认的min_count=5 设置做到了这一点——丢弃非常罕见的单词以提高剩余单词的质量和训练时间。

    还可以通过restrict_vocab 可选参数将most_similar() 报告的结果限制为仅考虑前N 个已知词(通常是N 个最常用词)。

    因此,这样做很容易,而且通常是明智的:

    • 根据默认的min_count=5,即使在FastText 训练之前,也要丢弃非常罕见的词,因为它们具有低信息内容或潜在的垃圾/噪音。
    • 在报告结果时忽略额外的稀有词,这些词在训练中仍然有用 - 因为它们往往比强建模的更频繁的词具有更粗略的向量和更模糊的含义,因此可能会混淆更强大的结果。常用词。

    如果您觉得您的数据足够薄,以至于您需要纠正问题,正如您已经发现的那样,这可能是一个非常乏味的过程。如果你有一个可靠的预先存在的域词典——就像你使用过的pydictionary——你可以用它来提名候选人进行更正,然后可能会越来越多的决定是这个词仍然可以,或者什么它应该被更正。

    (如果您对标记未知词的简单检查需要花费一天时间来处理您仅有的 11,000 篇文章中的一部分,那么您的标记化/搜索可能会出现一些严重的低效率 - 可能是正则表达式的过度使用。)

    自动拼写纠正的一般领域有许多潜在的方法,但也有一些折衷方案,即偶尔作为审查建议工作的东西如果自动、不加选择地应用可能会破坏新的领域特定语言。

    Peter Norvig 的文章“How to Write a Spelling Corrector”是对基于统计的方法的经典介绍,可能会提供一些有用的想法。

    一般情况下,请记住,独特错误的“长尾”可能很大——但每个单独的错误,甚至所有的特殊错误可能并不那么重要。在大型训练过程中,其余数据中有大量其他“信号”,任何数量的随机噪声都可能不会造成太大伤害。因此,获得 2 倍的“脏”数据,并忽略长尾或最罕见的单词/错误,这通常比仔细纠正一小部分文本要好。

    即使在任何手动审查/更正中,我也建议从最常用的标记到最少,而不是纯粹的从前到后的顺序。也就是说,查看您的语料库中不在您的已知单词列表中的最常用单词的批次——看看它们是否是需要纠正的问题——而不是前面的每个异常单词后退。

    最后,您似乎正在尝试通过词向量量化偏差,请注意,如果将most_similar() 方法用于类比求解等任务,它不会响应任何输入词的数量,即使计算出的“目标点”最接近它们。 (请参阅this answer 的底部,了解有关这有时如何混淆有关词向量偏差的文章的更多详细信息,以及有时提供原始向量如何解决问题。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多