博文名称:5 Lesser-Known Python Libraries for Your Next NLP Project
博文链接:https://towardsdatascience.com/5-lesser-known-python-libraries-for-your-next-nlp-project-ff13fc652553
发表时间:Dec 25, 2021
包含示例代码和解释。
当我第一次开始阅读Medium时,我最喜欢的文章类型是介绍新的Python库的文章。我学到的几个python库现在在我日常项目经常用到。
下面,我想与大家分享我在过去几年从事各种自然语言处理(NLP)工作中发现的5个很棒的Python库。
1) Contractions
当然,你可以编写一长串规则表达式来扩展文本数据中的缩略语(即don’t → do not;can’t → cannot;haven’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.
用例
文本预处理的一个重要部分是创建一致性,并在不丢失太多含义的情况下缩减唯一单词列表。例如,词袋模型(bag-of-words models )和TF-IDF创建了大型稀疏矩阵,其中每个变量都是语料库中一个不同的词汇。利用contractions可以进一步降低维度,甚至有助于过滤停用词(stopwords)。
词袋模型(bag of words model ):信息检索领域中,文件表示法的一种。其将文件中出现的词汇,想像是放在袋子里零散而独立的物件,如此一个袋子代表一篇文件。词袋模型的重点,不在于这个想像中的袋子,而在于其对待袋子中的词汇方式,即每个词汇都是独立的单位,不考虑其相依性。
例如:
文件A中的内容(如篇名)若为:「病人与医生的纠纷研究」,以词袋模型表示,则该文件可以表达成:「病人、纠纷、医生、研究」这四个独立的词汇。
文件B中的内容(如篇名)若为:「医疗缺失改善之探讨」,以词袋模型表示,则可表达成:「缺失、探讨、改善、医疗」这四个独立的词汇。
此种独立性假设,简化了很多文件自动处理的计算,因而广被采用。例如,信息检索中的空间向量模型,便以词袋模型来表示文件,文件中的词汇代表空间中的一个维度,而维度与维度之间是独立的,如此形成文件向量,便于后续的向量计算。如上例,文件A与文件B以(病人、医生、纠纷、研究、医疗、缺失、改善、探讨),8个词当维度,可以分别表示成(1 , 1 , 1 , 1 , 0 , 0 , 0 , 0)与(0 , 0 , 0 , 0 , 1 , 1 , 1 , 1)的向量。
又如自动文件分类中,也常以词袋模型代表文件,将文件与类别的对应关系,如(文件A,医疗类)、(文件B,医疗类),分解成更小单元且会重复出现的词汇与类别的对应关系,如(病人,医疗类)、(医疗,医疗类)等,以便于各种机器学习方法的运用。上面的例子,可以看出词袋模型的好处,例如(病人,医疗类)、(医疗,医疗类)变成是很容易学习归纳出来的分类规则(因为这些对应,容易重复出现,且有高度的相关性)。尔后若有一篇新进的文件要分类,以词袋模型表示,若该文件出现病人、医疗等与医疗类有高度相关性的词汇,就可自动将其标示为医疗类的文件。词袋模型的缺点,则是其独立性假设不太符合语言文字实际分布的状况。例如,上述文件A与文件B的向量相似度为0。但根据语言文字的出现机率,文件中谈到病人、医生的时候,医疗一词出现的机率不应为0;同理,纠纷出现时,缺失、改善等词汇,出现的机率也不应为0。若能考虑到词汇的相依性,则文件A与文件B的相似度,就不会是0。在近十来年的信息检索研究中,语言模型的文件表示法,可以处理这类词汇相依性的问题。
TF-IDF(英语:term frequency–inverse document frequency)是一种用于信息检索与文本挖掘的常用加权技术。tf-idf是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。tf-idf加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了tf-idf以外,互联网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜索结果中出现的顺序。
停用词(Stop Words):在信息检索中,为节省存储空间和提高搜索效率,在自然语言处理数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。认为我们在表示信息的时候,会使用一些高频出现、但是和“noise”一样不重要的词语。后来的学者们称这种高频、低价值的词语为”停用词”。
2) Distilbert-Punctuator
将丢失的标点符号恢复为纯英文文本……听起来很容易,对吧?好吧,对于计算机来说,做到这一点肯定要复杂得多。
Distilbert-punctuator是我能找到的唯一可以执行此任务的Python库。而且它也超级准确!这是因为它使用了一个精简的BERT变体,这是谷歌最先进的、经过预训练的语言模型。结合 20,000 多篇新闻文章和 4,000 份TED谈话记录,对它进行了进一步微调,以检测句子边界。在插入句尾标点符号(例如句号)时,模型还会适当地将下一个起始字母大写。
安装
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 帖子还是聊天机器人消息,这个库都适合你。
3) 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,你可能会发现阅读速度更快、更容易的书面文章往往更受欢迎,并且保留率更长。
4) Gibberish-Detector
这个低代码库的主要目的是检测胡言乱语(或难以理解的单词)。它使用在大量英语单词上训练的模型。
安装 + 训练
pip install gibberish-detector
接下来,你还需要在自己的一端训练模型,但这非常简单,只需一分钟。只需按照以下步骤操作:
- 从这里下载名为 big.txt 的训练语料库
- 打开你的 CLI 并cd到 big.txt 所在的目录
- 运行以下命令: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)
用例
我过去曾使用gibberish-detector来帮助我从数据集中删除不良观察结果。
它还可以实现对用户输入的错误处理。例如,如果用户在您的 Web 应用程序上输入无意义的胡言乱语文本,你可能希望返回一条错误消息。
5) 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竞赛者或一般程序员,重要的是我们将尽可能多的工具放在口袋里。我们可以利用这些库来解决问题,增强数据集,花更多的时间思考解决方案,而不是编写代码。
如果你对 NLP 感兴趣,请查看我最近关于命名实体识别 (NER) 的文章。我展示了如何使用 spaCy(另一个强大的NLP库)来构建一个模型,该模型可以在非结构化文本中自动识别与家装服务相关的词。
Auto-Detect Anything With Custom Named Entity Recognition (NER)
A start-to-finish code walkthrough using spaCy v3
使用自定义命名实体识别(NER)自动检测任何内容
工具对我们意味着什么?
经常听到程序员“工具人”和“调包侠”之类的自嘲。
我们要解决现实世界的问题,重要的是我们要聚焦问题,提出实现的解决方案,知道如何快速找到答案。工具能让我们解决问题更高效,更准确,也就是常说的“不要重复造轮子”,我们知道工具的原理,应用场景。遇到实际具体问题,能快速找到合适的工具解决。