5个鲜为人知的 Python 库!帮你的下一个NLP项目起航

5个鲜为人知的 Python 库!帮你的下一个NLP项目起航

Python 中的库在数据科学、机器学习、数据操作应用程序等领域发挥着重要作用。Python作为一种高级编程语言,在现在已被人们广泛使用。它支持自动内存管理,并拥有一个大型标准库。

Python 库定泛指一些可以在其他程序中重复使用的代码。它们的用处在于,不需要在每次需要运行相同的进程时都去写新的代码。

为了让更多人知道了解Python,我想分享5个Python库,这些库是我在过去几年中从事各种自然语言处理(NLP)工作时发现的。如果你想了解更多数据分析相关内容,可以阅读以下这些文章:
从Marplotlib到Plotly: 教你入门Python数据可视化
如何征服数据科学面试中的Python编程考试
如何编写出优秀的 Python Class
Python机器学习库:pycarets新增时间序列模块

01 Contractions

当然,你可以写一长串的正则表达式,扩展文本数据中的缩略词(即 don’t → do not;can’t → cannot;have’t → have not)。但是为什么不省点力气,利用 Python 库来完成这些繁琐的工作呢?

Contractions 库用起来非常简单,可以扩展常见的英语缩写和俚语,速度非常快,而且效率也很高,可以处理大多数边缘情况,例如缺少撇号的情况。

安装

pip install contractions

使用样例

import contractions
s = "ive gotta go! i'll see yall later."
text = contractions.fix(s, slang=True)
print(text)

结果

ORIGINAL: ive gotta go! i’ll see yall later.
OUTPUT: I have got to go! I will see you all later.

用例

文本预处理的一个重要部分,是创建一致性,并在不失去太多意义的情况下减少单词列表。比如,词袋模型和 TF-IDF 会创建大型稀疏矩阵,其中每个变量都是语料库中一个不同的词汇词。将缩略语进行还原可以进一步降低维度,还可以有助于过滤停用词。

02 Distilbert-Punctuator

将丢失的标点符号的文本进行断句,并添加标点符号……听起来很容易,对吧?对于计算机来说,做到这一点其实要复杂得多。

Distilbert-punctuator 是我能找到的唯一可以执行此任务的 Python 库。而且还超级准!这是因为它用了 BERT 的精简变体。在结合 20,000 多篇新闻文章和 4,000 份 TED Talk 抄本后,对模型进行了进一步微调,被用来检测句子边界。在插入句尾标点符号(例如句号)时,模型还会自动将下一个起始字母大写。

安装

pip install distilbert-punctuator

提示:这个库需要好几个依赖项。如果你在安装时遇到问题,可以在 Google Colab 上试用,运行 !pip install distilbert-punctuator。

使用样例

from dbpunctuator.inference import Inference, InferenceArguments
from dbpunctuator.utils import DEFAULT_ENGLISH_TAG_PUNCTUATOR_MAP
args = InferenceArguments(
        model_name_or_path="Qishuai/distilbert_punctuator_en",
        tokenizer_name="Qishuai/distilbert_punctuator_en",
        tag2punctuator=DEFAULT_ENGLISH_TAG_PUNCTUATOR_MAP
    )
punctuator_model = Inference(inference_args=args, 
                             verbose=False)
text = [
    """
however when I am elected I vow to protect our American workforce
unlike my opponent I have faith in our perseverance our sense of trust and our democratic principles will you support me
    """
]
print(punctuator_model.punctuation(text)[0])

结果

ORIGINAL: 
however when I am elected I vow to protect our American workforce
unlike my opponent I have faith in our perseverance our sense of trust and our democratic principles will you support me
OUTPUT:
However, when I am elected, I vow to protect our American workforce. Unlike my opponent, I have faith in our perseverance, our sense of trust and our democratic principles. Will you support me?

用例

有的时候,你只是想让你的文本数据在语法上更加正确、和更易于展示。无论任务是修复凌乱的 Twitter 帖子,还是聊天机器人消息,这个库都适合你。

03 Textstat

Textstat 是一个易于使用的轻量级库,可提供有关文本数据的各种指标,例如阅读水平、阅读时间和字数。

安装

pip install textstat

使用样例

import textstat
text = """
Love this dress! it's sooo pretty. i happened to find it in a store, and i'm glad i did bc i never would have ordered it online bc it's petite. 
"""
# Flesch reading ease score
print(textstat.flesch_reading_ease(text))
  # 90-100 | Very Easy
  # 80-89  | Easy
  # 70-79  | Fairly Easy
  # 60-69  | Standard
  # 50-59  | Fairly Difficult
  # 30-49  | Difficult
  # <30    | Very Confusing
# Reading time (output in seconds)
# Assuming 70 milliseconds/character
print(textstat.reading_time(text, ms_per_char=70))
# Word count 
print(textstat.lexicon_count(text, removepunct=True))

结果

ORIGINAL:
Love this dress! it's sooo pretty. i happened to find it in a store, and i'm glad i did bc i never would have ordered it online bc it's petite.
OUTPUTS:
74.87 # reading score is considered 'Fairly Easy'
7.98  # 7.98 seconds to read
30    # 30 words

用例

这些指标增加了一个额外的分析层。例如,你在分析一个八卦杂志上的名人新闻文章的数据集。使用textstat,你会发现,那些阅读速度更快、更容易阅读的文章会更受人们的欢迎,留存率更高。

04 Gibberish-Detector

这个低代码库的主要目的是检测乱码(或难以理解的单词)。该库使用了一个在大量英语单词语料库上训练的模型。

安装+培训

pip install gibberish-detector

安装完成后还需要自己训练模型,但这非常简单,只需一分钟。训练步骤如下:

  • 1. 下载 big.txt 的训练语料库
  • 2. 打开你的 CLI 并 cd 到 big.txt 所在的目录
  • 3. 运行以下命令:gibberish-detector train .\big.txt > gibberish-detector.model

这会在当前目录中创建一个名为 gibberish-detector.model 的文件。

使用样例

from gibberish_detector import detector
# load the gibberish detection model
Detector = detector.create_from_model('.\gibberish-detector.model')
text1 = "xdnfklskasqd"
print(Detector.is_gibberish(text1))
text2 = "apples"
print(Detector.is_gibberish(text2))

结果

True  # xdnfklskasqd (this is gibberish)
False # apples (this is not)

用例

我曾经用这个库从数据集中删除不良的观察结果。

这个库也可以用于处理用户输入的错误。例如,如果用户在你的 Web 应用程序上输入无意义的乱码文本,这时可以返回一条错误消息。

05 NLPAug

我把最好的留到了最后哈哈。这个多功能库确实是一个隐藏的宝石。

首先,什么是数据增强(data augmentation)?它是指通过添加一些现有数据的稍加改动的副本,来扩展训练集大小的任何技术。当现有数据的多样性有限或不平衡时,通常会使用数据增强。对于计算机视觉问题,增强用于通过裁剪、旋转和改变图像的亮度来创建新样本。对于数值数据,可以使用聚类技术创建来合成实例。

但是如果我们正在处理的是文本数据呢?

这就是 NLPAug 的用武之地了。这个库可以通过替换或插入语义关联的单词来扩充文本。通过使用像 BERT 这样的预训练语言模型来进行数据的增强,这是一种强大的方法,因为它考虑了单词的上下文。根据设置的参数,可以使用前 n 个相似词来修改文本。

预训练的词嵌入,如 Word2Vec 和 GloVe,也可用于用同义词替换词。

安装

pip install nlpaug

使用样例

import nlpaug.augmenter.word as naw
# main parameters to adjust
ACTION = 'substitute' # or use 'insert'
TOP_K = 15 # randomly draw from top 15 suggested words
AUG_P = 0.40 # augment 40% of words within text
aug_bert = naw.ContextualWordEmbsAug(
    model_path='bert-base-uncased', 
    action=ACTION, 
    top_k=TOP_K,
    aug_p=AUG_P
    )
text = """
Come into town with me today to buy food!
"""
augmented_text = aug_bert.augment(text, n=3) # n: num. of outputs
print(augmented_text)

结果

ORIGINAL:
Come into town with me today to buy food!
OUTPUTS:
• drove into denver with me today to purchase groceries!
• head off town with dad today to buy coffee!
• come up shop with mom today to buy lunch!

用例

假设你正在使用一个有 15k 条正面评论和只有 4k 条负面评论的数据集上训练监督分类模型。严重不平衡的数据集会在训练期间产生对多数类(正面评价)的模型偏差。

简单地复制少数类的示例(负面评论)不会向模型添加任何新信息。相反,利用 NLPAug 的高级文本增强功能来增加多样性的少数类。该技术已被证明可以提高 AUC 和 F1-Score。

结论

作为数据科学家、Kaggle 参赛者或程序员,我们要找到更多的工具来简化我们的工作流程。这样可以利用这些库来解决问题,增强我们的数据集,并花更多时间思考解决方案,而不是编写代码。感谢你的阅读!你还可以订阅我们的YouTube频道,观看大量数据科学相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/

原文作者:Michael Markin
翻译作者:Lia
美工编辑:过儿
校对审稿:Jiawei Tong
原文链接:https://towardsdatascience.com/5-lesser-known-python-libraries-for-your-next-nlp-project-ff13fc652553