Python 自动化脚本系列:第6集

51. 命名实体识别(NER)

命名实体识别(NER)是从文本中识别和提取命名实体(如人名、地点、组织等)的任务。你可以使用 spaCy 或 NLTK 等库自动进行NER。

示例:从新闻文章中提取命名实体

假设你有一组新闻文章的数据集,想要提取每篇文章中提到的命名实体。下面是如何使用 spaCy 自动完成这项任务的示例:


import spacy  
  
# 加载预训练的英文模型  
nlp = spacy.load("en_core_web_sm")  
  
# 新闻文章  
articles = [  
    "苹果公司计划下个月推出一款新的 iPhone 型号。该公司的首席执行官 Tim Cook 在加州库比蒂诺举行的新闻发布会上宣布了这一消息。",  
    "联合国在纽约市举行了一场气候变化峰会。来自包括美国、中国和印度在内的各国领导人出席了这一活动。"  
]  
  
# 对每篇文章进行命名实体识别  
for article in articles:  
    doc = nlp(article)  
      
    print("文章:", article)  
    print("命名实体:")  
    for entity in doc.ents:  
        print(f"- {entity.text} ({entity.label_})")  
    print("---")

这段代码通过使用 spacy.load() 方法从 spaCy 加载预训练的英文模型。然后定义了一组新闻文章。它对每篇文章进行迭代,并使用加载的 spaCy 模型处理文章文本创建了一个 Doc 对象。 doc.ents 属性提供了对文章中识别到的命名实体的访问。它打印了每个命名实体的文本和标签。打印出了从每篇文章提取的命名实体,以及文章文本本身。

52. 文本摘要

文本摘要是在保留关键信息的同时,生成较长文本的简洁摘要的任务。你可以使用 gensim 或 sumy 等库自动进行文本摘要。

示例:对新闻文章进行摘要

假设你有一组新闻文章的数据集,想要为每篇文章生成摘要。下面是如何使用 gensim 自动完成这项任务的示例:


from gensim.summarization import summarize  
  
# 新闻文章  
articles = [  
    "政府宣布了一项新的经济刺激计划,以提振国家经济。该计划包括减税、基础设施投资和支持小企业。专家认为这些措施将有助于创造就业机会和刺激经济增长。然而,一些批评人士认为这项计划可能不足以解决经济面临的长期挑战。",  
    "一家主要的科技公司在一场备受期待的活动中推出了其最新的智能手机型号。新设备具有更大的屏幕、改进的摄像功能和提高的性能。该公司声称该手机将改变智能手机行业,并树立新的创新标准。该设备的预订已经开始,预计将于下个月上市。"  
]  
  
# 为每篇文章生成摘要  
for article in articles:  
    summary = summarize(article, ratio=0.3)  
      
    print("文章:", article)  
    print("摘要:", summary)  
    print("---")

这段代码定义了一组新闻文章。然后它对每篇文章进行迭代,并使用 gensim.summarization.summarize() 函数生成摘要。 ratio 参数指定了摘要相对于原始文本的长度。在这个示例中,摘要将大约是原始文章长度的 30%。生成的摘要与原始文章文本一起打印出来。

53. 文本分类

文本分类是将预定义的类别或标签分配给给定文本的任务。你可以使用机器学习算法和类似 scikit-learn 的库自动进行文本分类。

示例:将电子邮件消息分类为垃圾邮件或正常邮件

假设你有一组标记为垃圾邮件或正常邮件(非垃圾邮件)的电子邮件消息的数据集,并且想要构建一个文本分类模型来自动分类新的电子邮件消息。下面是如何使用 scikit-learn 自动完成这项任务的示例:


from sklearn.feature_extraction.text import CountVectorizer  
from sklearn.naive_bayes import MultinomialNB  
from sklearn.metrics import accuracy_score  
  
# 电子邮件消息及其标签  
emails = [  
    ("购买廉价的伟哥!", "垃圾邮件"),  
    ("明天上午 10 点重要会议", "正常邮件"),  
    ("恭喜!你赢得了一个奖品!", "垃圾邮件"),  
    ("嘿,你好吗?", "正常邮件"),  
    ("利用这个惊人的机会快速致富!", "垃圾邮件")  
]  
  
# 将电子邮件消息和标签分开  
messages = [email[0] for email in emails]  
labels = [email[1] for email in emails]  
  
# 创建一个 CountVectorizer 将文本转换为数字特征  
vectorizer = CountVectorizer()  
X = vectorizer.fit_transform(messages)  
  
# 训练一个多项式朴素贝叶斯分类器  
classifier

 = MultinomialNB()  
classifier.fit(X, labels)  
  
# 在新的电子邮件消息上测试分类器  
new_emails = [  
    "你被选中获得一个免费礼物!",  
    "请查阅附件文档",  
    "使用这个秘密配方快速减肥!"  
]  
X_new = vectorizer.transform(new_emails)  
predictions = classifier.predict(X_new)  
  
# 打印预测结果  
for email, prediction in zip(new_emails, predictions):  
    print("电子邮件:", email)  
    print("预测:", prediction)  
    print("---")

这段代码定义了一组电子邮件消息以及它们对应的标签(垃圾邮件或正常邮件)。它将电子邮件消息和标签分开为两个列表。它使用 scikit-learn 中的 CountVectorizer 将电子邮件文本转换为数字特征。 fit_transform() 方法用于将向量化器拟合到电子邮件消息并将其转换为词频矩阵。然后,使用 fit() 方法对转换后的电子邮件特征和它们的标签训练了一个多项式朴素贝叶斯分类器。为了测试分类器,提供了一组新的电子邮件消息。使用 transform() 方法将新邮件转换为数字特征,使用先前拟合的向量化器。使用训练好的分类器使用 predict() 方法对新的电子邮件消息进行标签预测。最后,打印了每个新电子邮件消息的预测结果。

54. 主题建模

主题建模是在一组文档中发现潜在主题或主题的任务。它有助于理解文本语料库中讨论的主要主题。你可以使用 gensim 或 scikit-learn 等库自动进行主题建模。

示例:在一组新闻文章中发现主题

假设你有一组新闻文章,想要发现这些文章讨论的主要主题。下面是如何使用 gensim 自动完成这项任务的示例:


from gensim import corpora, models  
  
# 新闻文章  
articles = [  
    "政府宣布了一项新的经济刺激计划,以提振国家经济。",  
    "一家主要的科技公司在一场备受期待的活动中推出了其最新的智能手机型号。",  
    "科学家在南美洲一个偏远地区发现了一种新的恐龙物种。",  
    "股市在贸易紧张局势引发的担忧中出现了显著的波动。",  
    "一位著名的艺术家开设了一场新的展览,展示了他们的最新作品。"  
]  
  
# 对文章进行分词  
tokenized_articles = [article.lower().split() for article in articles]  
  
# 创建字典和语料库  
dictionary = corpora.Dictionary(tokenized_articles)  
corpus = [dictionary.doc2bow(article) for article in tokenized_articles]  
  
# 训练一个 LDA 模型  
lda_model = models.LdaModel(corpus, num_topics=3, id2word=dictionary, passes=10)  
  
# 打印发现的主题  
for idx, topic in lda_model.print_topics():  
    print(f"主题 {idx}: {topic}")

这段代码定义了一组新闻文章。它通过将每篇文章转换为小写并将其拆分为单词,对文章进行了分词。使用 gensim 的 Dictionary 类创建了一个字典,为语料库中的每个单词分配了一个唯一的整数 ID。然后使用 doc2bow() 方法将每个分词后的文章转换为词袋表示法。使用 gensim 的 LdaModel 类在语料库上训练了一个 LDA(隐含狄利克雷分配)模型。 num_topics 参数指定要发现的主题数量, id2word 参数指定将词 ID 映射到词的字典, passes 参数指定训练通过的数量。最后,使用 LDA 模型的 print_topics() 方法打印了发现的主题。

55. 文本生成

文本生成是根据给定的提示或上下文生成新文本的任务。它涉及在大量文本语料库上训练语言模型,然后使用模型生成连贯和有意义的文本。你可以使用像 GPT-2 或 Transformers 这样的库自动进行文本生成。

示例:使用 GPT-2 生成文本

假设你想要根据给定的提示生成文本,使用 GPT-2 语言模型。下面是如何使用 Transformers 库自动完成这项任务的示例:


from transformers import GPT2LMHeadModel, GPT2Tokenizer  
  
# 加载预训练的 GPT-2 模型和分词器  
model = GPT2LMHeadModel.from_pretrained("gpt2")  
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")  
  
# 提示文本用于生成文本  
prompt = "从前,有一个遥远的地方"  
  
# 生成文本  
input_ids = tokenizer.encode(prompt, return_tensors="pt")  
output = model.generate(input_ids, max_length=100, num_return_sequences=1)  
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)  
  
# 打印生成的文本  
print("提示:", prompt)  
print("生成的文本:", generated_text)

这段代码使用 Transformers 库的 from_pretrained() 方法加载了预训练的 GPT-2 语言模型和分词器。提供了一个提示

作为生成文本的起点。使用分词器的 encode() 方法将提示编码为输入 ID。使用 GPT-2 模型的 generate() 方法基于输入 ID 生成文本。 max_length 参数指定生成文本的最大长度, num_return_sequences 参数指定要生成的序列数量。使用分词器的 decode() 方法解码生成的文本,并跳过任何特殊标记。最后,打印了生成的文本以及原始提示。

56. 文本相似度

文本相似度是衡量两段文字之间相似程度的任务。它可以用于各种应用,比如文档聚类、抄袭检测或推荐系统。你可以利用像 spaCy 或 scikit-learn 这样的库自动化文本相似度计算。

例子:计算文档之间的相似度

假设你有一组文档,想要计算每对文档之间的相似度。下面是如何利用 spaCy 自动化完成这个任务的示例:


import spacy  
  
# 加载预训练的英语模型  
nlp = spacy.load("en_core_web_sm")  
  
# 文档  
documents = [  
    "The quick brown fox jumps over the lazy dog.",  
    "A quick brown fox jumps over the lazy dog.",  
    "The quick brown fox jumps over the lazy cat.",  
    "The quick brown fox is jumping over the lazy dog."  
]  
  
# 计算每对文档之间的相似度  
for i in range(len(documents)):  
    for j in range(i+1, len(documents)):  
        doc1 = nlp(documents[i])  
        doc2 = nlp(documents[j])  
        similarity = doc1.similarity(doc2)  
        print(f"文档 {i+1} 和文档 {j+1} 之间的相似度: {similarity}")

这段代码片段使用 spacy.load() 函数从 spaCy 加载了预训练的英语模型。然后定义了一组文档。它使用嵌套循环遍历每对文档。对于每一对文档,它使用加载的 spaCy 模型处理文档以创建 Doc 对象。使用 similarity() 方法计算两个文档之间的相似度。相似度分数范围从 0 到 1,分数越高表示相似度越高。打印了每对文档之间的相似度分数。

57. 文本聚类

文本聚类是根据内容将相似的文档分组的任务。它有助于组织和发现大量文档中的模式。你可以利用像 scikit-learn 或 gensim 这样的库自动化文本聚类。

例子:聚类新闻文章

假设你有一组新闻文章的数据集,想要根据其内容对它们进行聚类。下面是如何利用 scikit-learn 自动化完成这个任务的示例:


from sklearn.feature_extraction.text import TfidfVectorizer  
from sklearn.cluster import KMeans  
  
# 新闻文章  
articles = [  
    "政府宣布了一项新的经济刺激计划,以提振国家经济。",  
    "一家主要的科技公司在一场备受期待的活动中推出了其最新的智能手机型号。",  
    "科学家在南美洲偏远地区发现了一种新的恐龙物种。",  
    "股市在对贸易紧张局势的担忧中出现了显著的波动。",  
    "一位著名艺术家开设了一场新的展览,展示了他们最新的作品。"  
]  
  
# 创建 TF-IDF 向量化器  
vectorizer = TfidfVectorizer()  
X = vectorizer.fit_transform(articles)  
  
# 执行 K-means 聚类  
kmeans = KMeans(n_clusters=3, random_state=42)  
kmeans.fit(X)  
  
# 打印聚类结果  
for i, label in enumerate(kmeans.labels_):  
    print(f"文章 {i+1} 属于聚类 {label+1}")

这段代码片段定义了一组新闻文章。它使用 scikit-learn 中的 TfidfVectorizer 类创建了一个 TF-IDF(词频-逆文档频率)向量化器。向量化器将文章转换为 TF-IDF 特征矩阵。然后使用 scikit-learn 中的 KMeans 类创建了一个 K-means 聚类模型。n_clusters 参数指定要形成的簇数,random_state 确保结果的可重现性。使用 fit() 方法将 K-means 模型拟合到 TF-IDF 特征上。最后,打印了每篇文章所属的聚类,指示每篇文章属于哪个聚类。

58. 文本预处理

文本预处理是将原始文本数据清理和转换为适合进一步分析或建模的格式的任务。它涉及各种技术,如分词、转换为小写、去除停用词、词干提取或词形还原。你可以利用像 NLTK 或 spaCy 这样的库自动化文本预处理。

例子:对文本文档进行预处理

假设你有一篇文本文档,想要进行分词、转换为小写、去除停用词和词形还原等预处理操作。下面是如何利用 NLTK 自动化完成这个任务的示例:


import nltk  
from nltk.corpus import stopwords  
from nltk.stem import WordNetLemmatizer  
  
#下载所需的 NLTK 数据  
nltk.download('punkt')  
nltk.download('stopwords')  
nltk.download('wordnet')  

#文本文档  
document = "The quick brown foxes are jumping over the lazy dogs. They are having a great time playing in the park."  

#分词处理  
tokens = nltk.word_tokenize(document)  

#将标记转换为小写  
tokens = [token.lower() for token in tokens]  

#去除停用词  
stop_words = set(stopwords.words('english'))  
tokens = [token for token in tokens if token not in stop_words]  



#词形还原  
lemmatizer = WordNetLemmatizer()  
tokens = [lemmatizer.lemmatize(token) for token in tokens]  

#打印预处理后的标记  
print("预处理后的标记:", tokens)

这段代码片段定义了一个文本文档。它执行了以下预处理步骤:1. 分词:使用 NLTK 的 word_tokenize() 函数将文档分词为单词列表。2. 小写转换:使用列表推导将标记转换为小写。3. 停用词移除:使用 NLTK 的 stopwords 语料库移除停用词(常见词如“the”、“is”、“are”)。4. 词形还原:使用 NLTK 的 WordNetLemmatizer 进行词形还原(将词汇还原为其基本或字典形式)。最后,打印了预处理后的标记。

59. 文本翻译

文本翻译是将文本从一种语言转换为另一种语言的任务。它涉及使用机器翻译模型或 API 自动翻译文本。你可以利用像 Google Translate API 或 Transformers 这样的库自动化文本翻译。

例子:使用 Google Translate API 翻译文本

假设你有一段法语文本,想要将其翻译成另一种语言。下面是如何利用 Google Translate API 自动化完成这个任务的示例:


from googletrans import Translator  
  
# 要翻译的文本  
text = "Bonjour, comment allez-vous?"  
  
# 创建一个翻译器对象  
translator = Translator()  
  
# 翻译文本  
translation = translator.translate(text, dest='en')  
  
# 打印翻译后的文本  
print("原始文本:", text)  
print("翻译后的文本:", translation.text)

这段代码片段定义了一段法语文本。它使用 googletrans 库中的 Translator 类创建了一个翻译器对象。使用 translate() 方法将文本翻译成英语(通过 dest 参数指定)。最后,打印了原始文本和翻译后的文本。

60. 文本摘要提取方法

抽取式文本摘要涉及从原始文本中选择重要的句子或短语以创建摘要。它旨在捕捉最相关的信息同时保留关键要点。你可以利用像 sumy 或 gensim 这样的库自动化抽取式文本摘要。

例子:使用 Sumy 摘要新闻文章

假设你有一篇新闻文章,并且想要生成文章的抽取式摘要。下面是如何利用 sumy 库自动化完成这个任务的示例:


from sumy.parsers.plaintext import PlaintextParser  
from sumy.nlp.tokenizers import Tokenizer  
from sumy.summarizers.lex_rank import LexRankSummarizer  
  
# 新闻文章  
article = """  
政府宣布了一项新的经济刺激计划,以提振国家经济。该计划包括减税、基础设施投资和对小企业的支持。专家们认为这些措施将有助于创造就业机会和刺激经济增长。然而,一些批评者认为该计划可能不足以应对经济面临的长期挑战。

这项刺激计划出台之际,人们担心由于持续的大流行而导致经济活动放缓。政府希望这些措施能够给消费支出和企业信心带来急需的提振。预计减税将为个人和企业提供更多资金,而基础设施投资则旨在创造就业机会并提高国家的竞争力。

受到大流行的重创,小企业将通过拨款和贷款获得额外支持。政府认识到小企业在推动经济增长和就业方面的重要性。该计划还包括支持受到旅行限制严重影响的旅游和酒店行业的措施。

刺激计划的批评者认为,它可能不足以应对经济面临的结构性问题。他们指出,国家高额的债务水平和不断下降的生产率增长需要长期解决方案。一些经济学家还警告说,如果不加以谨慎处理,刺激措施可能会导致通胀压力。

尽管存在这些担忧,政府对刺激计划的影响仍持乐观态度。他们相信这些措施将为经济带来重大提振,并帮助国家从大流行引发的经济衰退中恢复过来。政府还承诺继续监测经济形势,并在必要时采取进一步行动。
"""  
  
# 创建一个纯文本解析器  
parser = PlaintextParser.from_string(article, Tokenizer("english"))  
  
# 创建一个 LexRank 摘要生成器  
summarizer = LexRankSummarizer()  
  
# 生成摘要  
summary = summarizer(parser.document, sentences_count=3)  
  
# 打印摘要  
for sentence in summary:  
    print(sentence)

这段代码片段将一篇新闻文章定义为一个字符串。它使用 sumy 库中的 `PlaintextParser

类创建了一个纯文本解析器,指定了文章和英语语言的标记器。然后使用 sumy 中的LexRankSummarizer类创建了一个 LexRank 摘要生成器。LexRank 是一种无监督的用于抽取式文本摘要的算法。调用summarizer` 时传入了解析的文档和摘要中所需的句子数(在本例中为 3)。最后,打印了生成的摘要句子。

总计

本次主要介绍了一些关于文本处理的Python自动化操作脚本,包括文本分类、文本总结归纳,以及文本的生成。希望对你的日常工作有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值