在处理中文文本时,经常需要从中提取出人名和公司名称。比如在文本分析、信息提取和自然语言处理(NLP)等领域,这些任务都非常常见。本文将介绍如何使用wxPython
创建一个简单的桌面应用程序,从一段中文长文中提取人名和公司名称,并用jieba
库进行分词和命名实体识别(NER)。
C:\pythoncode\new\markname.py
环境准备
在开始之前,确保你已经安装了wxPython
和jieba
库。如果没有,请使用以下命令进行安装:
pip install wxPython jieba
项目需求分析
我们将创建一个带有以下功能的桌面应用程序:
- 一个多行文本输入框,用于输入需要处理的长文。
- 一个按钮,用于触发文本处理。
- 一个多行文本输出框,用于显示提取出的人名和公司名称。
实现步骤
我们将使用wxPython
创建GUI,jieba
库进行中文分词和命名实体识别。
完整代码示例
以下是实现这一功能的完整代码示例:
import wx
import jieba
import jieba.posseg as pseg
class ChineseNameCompanyExtractorFrame(wx.Frame):
def __init__(self, *args, **kw):
super(ChineseNameCompanyExtractorFrame, self).__init__(*args, **kw)
self.panel = wx.Panel(self)
# Input text box (multiline)
self.text_ctrl_input = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE, size=(400, 200))
# Output text box (multiline)
self.text_ctrl_output = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE | wx.TE_READONLY, size=(400, 100))
# Button to trigger extraction
self.extract_button = wx.Button(self.panel, label="提取人名和公司名称")
self.extract_button.Bind(wx.EVT_BUTTON, self.on_extract_names_and_companies)
# Layout
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(wx.StaticText(self.panel, label="输入文本:"), flag=wx.LEFT | wx.TOP, border=10)
sizer.Add(self.text_ctrl_input, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)
sizer.Add(self.extract_button, flag=wx.ALIGN_CENTER | wx.ALL, border=10)
sizer.Add(wx.StaticText(self.panel, label="提取的人名和公司名称:"), flag=wx.LEFT | wx.TOP, border=10)
sizer.Add(self.text_ctrl_output, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)
self.panel.SetSizer(sizer)
self.SetTitle('中文人名和公司名称提取器')
self.SetSize((500, 400))
self.Centre()
def on_extract_names_and_companies(self, event):
# Get the current text from the input text control
text = self.text_ctrl_input.GetValue()
# Extract names and companies using jieba
names = []
companies = []
words = pseg.cut(text)
for word, flag in words:
if flag == 'nr': # 人名
names.append(word)
elif flag == 'nt': # 机构团体名,一般表示公司
companies.append(word)
# Combine names and companies, and remove duplicates
all_entities = sorted(set(names + companies))
# Display the results in the output text control
self.text_ctrl_output.SetValue(', '.join(all_entities))
class MyApp(wx.App):
def OnInit(self):
frame = ChineseNameCompanyExtractorFrame(None)
frame.Show(True)
return True
if __name__ == "__main__":
app = MyApp(False)
app.MainLoop()
代码详解
-
初始化
ChineseNameCompanyExtractorFrame
类:- 创建一个面板 (
wx.Panel
)。 - 创建一个多行文本输入框 (
wx.TextCtrl
)。 - 创建一个多行只读文本输出框 (
wx.TextCtrl
)。 - 创建一个按钮,并将按钮的点击事件绑定到
on_extract_names_and_companies
方法。 - 使用垂直盒子布局 (
wx.BoxSizer
) 布局文本框和按钮。
- 创建一个面板 (
-
on_extract_names_and_companies
方法:- 获取当前输入框中的文本。
- 使用
jieba
进行分词和词性标注:nr
表示人名。nt
表示机构团体名(一般表示公司)。
- 合并提取到的人名和公司名字,并去重。
- 将结果显示在只读文本输出框中。
-
MyApp
类:- 初始化应用程序并显示框架。
运行效果
将上述代码保存为一个Python文件(例如 name_company_extractor.py
),然后运行它。你将看到一个包含输入框和按钮的窗口。输入一段包含中文人名和公司名称的文本,点击“提取人名和公司名称”按钮,提取到的人名和公司名称将显示在下方的只读文本框中。
总结
本文介绍了如何使用wxPython
和jieba
库创建一个简单的桌面应用程序,用于从一段中文长文中提取人名和公司名称。通过这种方法,我们可以高效地处理中文文本中的信息提取任务。希望本文对你有所帮助,欢迎留言讨论或提出问题!