本帖最后由 向晚AVA 于 2024-8-21 13:32 编辑
最近做了一个项目,使用 NLTK 库对简单文本进行处理和分析。 NLTK ( Natural Language Toolkit )是一个广泛使用的自然语言处理工具包,提供了丰富的功能和资源,帮助用户处理和分析文本数据。作为一个开源项目, NLTK 库被设计用于教育和研究领域,为学生、研究人员和开发者提供了强大的工具和资源。
该项目的应用场景为中小学生的中英文语法教学,教师可以利用 NLTK 库进行文本预处理、特征提取、语言模型构建等,从而实现文本的分析和教学。众所周知,中小学中英文学习中比较难以理解的部分就是语法和词性教学,很多时候由于学生的词汇量不足导致学生无法理解句子的结构,进而无法理解句子的情感和句中单词的词性。 NLTK 库中包含了各种功能模块,包括分词、词性标注、命名实体识别、句法分析、情感分析等,涵盖了自然语言处理的各个方面。
该项目设计的目的就是利用 NLTK 库帮助中小学生通过一些简单句子的练习,锻炼分析句子结构的能力,以此提高对陌生句子语义和情感的分析能力。学生可以自己先对陌生句子进行自行理解,之后利用该项目提供的硬件和代码对句子进行精确的分析,将标准答案和自己的答案进行比较,得出自己的不足,在不知不觉中培养中英文语句的分析能力。
第一部分:所需硬件
本项目所有功能均为软件实现,所以硬件我只使用了 DFROBOT 出品的行空板 UNIHIKER 。
硬件清单:
第二部分:软件编程
1、导入库模块
NLTK 库:包括分词、词性标注、语法分析等,适用于构建和训练语言模型。
Jieba 库:支持中文文本的分词、词性标注、关键词提取等功能。
Translate 库:翻译文本。
GUI 库: UNIHIKER 的自带 UI 界面库。
Pingpong 库: UNIHIKER 的自带函数功能库。
上传代码前,请确保 UNIHIKER 上已安装 NLTK 库。输入“ pip install nltk ”在终端中进行安装,等待安装成功完成,安装成功之后再输入 “ pip install nltk ” 如下图所示。
代码:
import nltk
from nltk import pos_tag
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from unihiker import GUI
import time
import jieba.posseg as pseg
import jieba.analyse
from nltk.sentiment import SentimentIntensityAnalyzer
from translate import Translator 复制代码
2、下载所需要的环境 nltk.download('maxent_ne_chunker')
nltk.download('words')
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('stopwords')
nltk.download('vader_lexicon') 复制代码
3、基本的语法规则 ( 教师可以在这里设定不同的语法规则,以此来对学生进行不同语句的教学。)
英文缩写释义:
句子( S )由名词短语( NP )和动词短语( VP )组成 名词短语( NP )由限定词( DT )和名词( NN )组成 动词短语( VP )由动词( V )和名词短语( NP )组成 限定词( DT ) 名词( NN ) 动词( V )
代码:
grammar = nltk.CFG.fromstring("""
S -> NP VP
NP -> DT NN
VP -> V NP
DT -> 'the'
NN -> 'cat' | 'dog'
V -> 'chased'
""") # 定义一个简单的语法规则 复制代码
4、界面UI部分
我通过 UNIHIKER 自带的 GUI 库对 UNIHIKER 的屏幕进行美化。
gui.draw_round_rect() 函数为在屏幕上画方形函数, gui.fill_rect() 函数为在屏幕上填充颜色函数, title = gui.draw_text() 函数为在屏幕上打出文字函数。
代码:
gui = GUI()
gui.fill_rect(x=0, y=0, w=240, h=320, color="#99CCFF")
title = gui.draw_text(x=70, y=10, text='文本分析器', font_size=14, color='blue')
gui.draw_round_rect(x=1, y=40, w=237, h=42, r=8, width=1)
gui.draw_round_rect(x=1, y=100, w=237, h=42, r=8, width=1)
gui.draw_round_rect(x=1, y=160, w=237, h=42, r=8, width=1)
gui.draw_round_rect(x=1, y=220, w=237, h=42, r=8, width=1)
gui.draw_round_rect(x=1, y=280, w=237, h=42, r=8, width=1) 复制代码
我通过 UNIHIKER 自带的 GUI 库在 UNIHIKER 上添加所需要的按钮。通过按钮调用上文的回调函数。
button_A = gui.add_button() 为 添加所需要的按钮函数。
代码:
button_A = gui.add_button(x=10, y=47, w=100, h=30, text="英文文本分析", onclick=click_A)
button_B = gui.add_button(x=130, y=47, w=100, h=30, text="中文文本分析", onclick=click_B)
button_c = gui.add_button(x=75, y=105, w=100, h=30, text="英文语法分析", onclick=click_C)
button_D = gui.add_button(x=75, y=165, w=100, h=30, text="英文情感分析", onclick=click_D)
button_E = gui.add_button(x=75, y=225, w=100, h=30, text="英文信息检索", onclick=click_E)
button_F = gui.add_button(x=75, y=285, w=100, h=30, text="机器翻译", onclick=click_F) 复制代码
效果展示:
5、英文文本分析部分
本节代码分三部分,都是使用了 NLTK 库中自带的函数。第一部分首先要将输入的英文文本进行分词,第二部分将文本中类似“ a ”、“ the ”这样的词略去,第三部分将去掉这些词的英文文本进行词性标注。
代码:
def click_A():
text = input("请输入要分析的英文文本:") # 输入文本
tokens = word_tokenize(text) # 分词
print("分词:")
print(tokens)
stop_words = set(stopwords.words('english')) # 去除停用词
filtered_tokens = [word for word in tokens if word.lower() not in stop_words]
print("分词略去停用词:")
print(filtered_tokens)
tagged_tokens = pos_tag(tokens) # 词性标注
print("词性标注:")
print(tagged_tokens)
print("分析完成") 复制代码
效果展示:
首先我们输入英文文本:
然后我们进行文本分析结果为:
6、中文文本分析部分
本节代码与上一节代码类似,也是分为三个部分:分词、去除停用词和词性标注。只是 NLTK 库并不支持中文相关文本分析,所以我引入了 jieba 库专用于中文文本分析,请输入“ pip install jiaba ”安装 jieba 库后使用。
代码:
def click_B():
text = input("请输入要输入的中文文本:")
# "自然语言处理是人工智能领域的一个重要研究方向,中文分词和词性标注是其中的重要技术。"
# 中文分词(使用 jieba)
words = list(pseg.cut(text))
tokens = [word.word for word in words]
# 去除停用词
stop_words = set(stopwords.words('chinese'))
filtered_tokens = [word for word in tokens if word not in stop_words]
# 词性标注
tagged_tokens = [(word.word, word.flag) for word in words]
# 输出结果
print("原始文本:")
print(text)
print("\n中文分词结果:")
print(tokens)
print("\n去除停用词后的结果:")
print(filtered_tokens)
print("\n词性标注结果:")
print(tagged_tokens)
print("分析完成") 复制代码
效果展示:
首先我们输入中文文本:
然后我们进行文本分析,结果为:
7、英文语法分析部分
本节代码根据上文教师自己定义的语法规则,利用 NLTK 库自带的语法分析器对语法进行分析。
代码:
def click_C(): # nltk不支持中文语法处理
parser = nltk.ChartParser(grammar) # 创建一个自带语法解析器
sentence = input("请输入要分析的英文文本:") # 对句子进行语法分析
for tree in parser.parse(sentence.split()):
print(tree)
print("分析完成") 复制代码
效果展示 :
首先我们输入英文文本:
然后进行语法分析,结果为:
8、英文情感分析部分
本节代码利用 NLTK 库自带的情感分析器对文本进行情感分析。
我 使用了 NLTK 的 SentimentIntensityAnalyzer 类来计算文本的情感得分,分别是: neg : 表示文本中负面情感的得分; neu : 表示文本中中性情感的得分; pos : 表示文本中积极情感的得分; compound : 综合情感得分,综合考虑了 neg 、 neu 、 pos 三个得分,可以作为文本整体情感的衡量标准,取值范围为 -1 (最负面)到 1 (最积极)。
代码:
def click_D():
# 创建情感分析器
sia = SentimentIntensityAnalyzer()
# 自定义文本
text = input("请输入要分析的英文文本:")
# 进行情感分析
sentiment_score = sia.polarity_scores(text)
# 输出情感分析结果
print("文本: ", text)
print("情感分析结果: ", sentiment_score)
print("分析完成")
复制代码
效果展示:
首先我们输入英文文本:
9、英文信息检索部分
本节代码利用一个常见的扫描循环,将学生想输入的文本逐行扫描进入信息检索处理代码,通过构建经典的检索查找算法,利用 NLTK 库的函数进行查词定位。
代码:
def click_E():
documents = {}
num_documents = int(input("请输入文档数量: "))
for i in range(1, num_documents+1):
doc_text = input(f"请输入文档 {i} 的内容: ")
documents[i] = doc_text
# 构建倒排索引
inverted_index = {}
stop_words = set(stopwords.words('english'))
for doc_id, doc_text in documents.items():
tokens = word_tokenize(doc_text.lower())
for token in tokens:
if token not in stop_words:
if token in inverted_index:
inverted_index[token].append(doc_id)
else:
inverted_index[token] = [doc_id]
# 查询词
query = input("请输入查询词: ")
# 查询倒排索引
query_tokens = word_tokenize(query.lower())
result_docs = set()
for token in query_tokens:
if token in inverted_index:
result_docs.update(set(inverted_index[token]))
# 输出查询结果
print("查询词:", query)
print("查询结果:")
for doc_id in result_docs:
print(f"Document {doc_id}: {documents[doc_id]}")
print("查找完成") 复制代码
效果展示:
首先我们输入英文文本,这里首先输入你想输入的英文文本行数,然后逐行输入:
然后我们输入查询词:
最后得出查询结果:
10、机器翻译部分
由于 NLTK 库的翻译功能的环境搭建需要过长的时间,这里使用了效果差不多的 translate 库实现机器翻译功能,这里最多能输入 500 个英文单词的翻译。本节代码通过构建文本翻译器,将英文翻译为中文。
代码:
def click_F():
# 创建 Translator 对象
translator = Translator(to_lang="zh")
# 输入要翻译的英文文本
text_en = input("请输入要翻译的英文文本:")
# 翻译文本为中文
text_translated = translator.translate(text_en)
# 输出翻译后的中文文本
print("翻译结果:", text_translated) 复制代码
效果展示:
我们输入想要翻译的文本:
得出翻译结果:
11、代码整体展示
import nltk
from nltk import pos_tag
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from unihiker import GUI
import time
import jieba.posseg as pseg
import jieba.analyse
from nltk.sentiment import SentimentIntensityAnalyzer
from translate import Translator
nltk.download('maxent_ne_chunker')
nltk.download('words')
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('stopwords')
nltk.download('vader_lexicon')
grammar = nltk.CFG.fromstring("""
S -> NP VP
NP -> DT NN
VP -> V NP
DT -> 'the'
NN -> 'cat' | 'dog'
V -> 'chased'
""") # 定义一个简单的语法规则
gui = GUI()
gui.fill_rect(x=0, y=0, w=240, h=320, color="#99CCFF")
title = gui.draw_text(x=70, y=10, text='文本分析器', font_size=14, color='blue')
gui.draw_round_rect(x=1, y=40, w=237, h=42, r=8, width=1)
gui.draw_round_rect(x=1, y=100, w=237, h=42, r=8, width=1)
gui.draw_round_rect(x=1, y=160, w=237, h=42, r=8, width=1)
gui.draw_round_rect(x=1, y=220, w=237, h=42, r=8, width=1)
gui.draw_round_rect(x=1, y=280, w=237, h=42, r=8, width=1)
def click_A():
text = input("请输入要分析的英文文本:") # 输入文本
tokens = word_tokenize(text) # 分词
print("分词:")
print(tokens)
stop_words = set(stopwords.words('english')) # 去除停用词
filtered_tokens = [word for word in tokens if word.lower() not in stop_words]
print("分词略去停用词:")
print(filtered_tokens)
tagged_tokens = pos_tag(tokens) # 词性标注
print("词性标注:")
print(tagged_tokens)
print("分析完成")
def click_B():
text = input("请输入要输入的中文文本:")
# "自然语言处理是人工智能领域的一个重要研究方向,中文分词和词性标注是其中的重要技术。"
# 中文分词(使用 jieba)
words = list(pseg.cut(text))
tokens = [word.word for word in words]
# 去除停用词
stop_words = set(stopwords.words('chinese'))
filtered_tokens = [word for word in tokens if word not in stop_words]
# 词性标注
tagged_tokens = [(word.word, word.flag) for word in words]
# 命名实体识别
ner_tags = nltk.ne_chunk(tagged_tokens)
# 关键词提取
keywords = jieba.analyse.extract_tags(text, topK=5)
# 输出结果
print("原始文本:")
print(text)
print("\n中文分词结果:")
print(tokens)
print("\n去除停用词后的结果:")
print(filtered_tokens)
print("\n词性标注结果:")
print(tagged_tokens)
print("分析完成")
def click_C(): # nltk不支持中文语法处理
parser = nltk.ChartParser(grammar) # 创建一个自带语法解析器
sentence = input("请输入要分析的英文文本:") # 对句子进行语法分析
for tree in parser.parse(sentence.split()):
print(tree)
print("分析完成")
def click_D():
# 创建情感分析器
sia = SentimentIntensityAnalyzer()
# 自定义文本
text = input("请输入要分析的英文文本:")
# 进行情感分析
sentiment_score = sia.polarity_scores(text)
# 输出情感分析结果
print("文本: ", text)
print("情感分析结果: ", sentiment_score)
print("分析完成")
def click_E():
documents = {}
num_documents = int(input("请输入文档数量: "))
for i in range(1, num_documents+1):
doc_text = input(f"请输入文档 {i} 的内容: ")
documents[i] = doc_text
# 构建倒排索引
inverted_index = {}
stop_words = set(stopwords.words('english'))
for doc_id, doc_text in documents.items():
tokens = word_tokenize(doc_text.lower())
for token in tokens:
if token not in stop_words:
if token in inverted_index:
inverted_index[token].append(doc_id)
else:
inverted_index[token] = [doc_id]
# 查询词
query = input("请输入查询词: ")
# 查询倒排索引
query_tokens = word_tokenize(query.lower())
result_docs = set()
for token in query_tokens:
if token in inverted_index:
result_docs.update(set(inverted_index[token]))
# 输出查询结果
print("查询词:", query)
print("查询结果:")
for doc_id in result_docs:
print(f"Document {doc_id}: {documents[doc_id]}")
print("查找完成")
def click_F():
# 创建 Translator 对象
translator = Translator(to_lang="zh")
# 输入要翻译的英文文本
text_en = input("请输入要翻译的英文文本:")
# 翻译文本为中文
text_translated = translator.translate(text_en)
# 输出翻译后的中文文本
print("翻译结果:", text_translated)
button_A = gui.add_button(x=10, y=47, w=100, h=30, text="英文文本分析", onclick=click_A)
button_B = gui.add_button(x=130, y=47, w=100, h=30, text="中文文本分析", onclick=click_B)
button_c = gui.add_button(x=75, y=105, w=100, h=30, text="英文语法分析", onclick=click_C)
button_D = gui.add_button(x=75, y=165, w=100, h=30, text="英文情感分析", onclick=click_D)
button_E = gui.add_button(x=75, y=225, w=100, h=30, text="英文信息检索", onclick=click_E)
button_F = gui.add_button(x=75, y=285, w=100, h=30, text="机器翻译", onclick=click_F)
while True: # circulate
time.sleep(0.5) # Delay by 0.5 seconds 复制代码
第三部分:总结
本项目通过 NLTK 库、 jieba 库、 translate 库构建了一个基于中小学语法教育、中英文文本分析场景下的简单文本分析助手,目的在于能够通过将便携式的移动平台 UNIHIKER 、高性能的文本处理语言 python 和最流行的文本处理语言模型 NLTK 库等结合起来,针对语言教学中最困难的文本分析部分进行教学新模式的探索。利用基于 UNIHIKER 构建的便携式文本分析助手,学生能够自主地进行语法和文本分析的学习,在不知不觉中提高自己的语言能力。