使用C#和Jieba.NET实现中英文混合文本关键词的提取功能

 更新时间:2025年03月12日 09:01:02   作者:老胖闲聊  
Jieba.NET 是一个在 C# 中实现的分词库,它基于 Java 的 jieba 分词库,并进行了 C# 语言的移植,Jieba 是一个高效的中文分词工具,能够处理全模式、精确模式以及搜索引擎模式,本文给大家介绍了如何使用C#和Jieba.NET实现中英文混合文本关键词的提取功能

实现步骤

  1. 创建Windows窗体应用程序
    添加以下控件:

    • TextBox:输入文本(支持多行)
    • Button:触发分词
    • ListBox:显示关键词及词频
  2. 安装NuGet包

Install-Package jieba.NET
  • 完整代码实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using JiebaNet.Segmenter;
using System.Text.RegularExpressions;

public partial class MainForm : Form
{
    private TextBox inputBox;
    private Button analyzeButton;
    private ListBox resultList;
    private HashSet<string> stopWords;

    public MainForm()
    {
        InitializeComponent();
        InitializeStopWords(); // 初始化停用词表
    }

    private void InitializeStopWords()
    {
        // 中英文停用词表(示例)
        stopWords = new HashSet<string>
        {
            // 中文停用词
            "的", "了", "在", "是", "我", "和", "有", "就", "不", "人",
            // 英文停用词
            "a", "an", "the", "is", "are", "and", "in", "on", "at"
        };
    }

    private void AnalyzeButton_Click(object sender, EventArgs e)
    {
        string inputText = inputBox.Text.Trim();
        if (string.IsNullOrEmpty(inputText))
        {
            MessageBox.Show("请输入文本!");
            return;
        }

        // 使用Jieba进行分词(处理中文和英文混合)
        var segmenter = new JiebaSegmenter();
        var segments = segmenter.Cut(inputText);

        // 提取英文单词(通过正则表达式补充处理)
        var allWords = new List<string>();
        foreach (var seg in segments)
        {
            // 处理中英文混合词(如 "C#编程" -> ["C#", "编程"])
            var words = Regex.Matches(seg, @"([A-Za-z0-9#+]+)|([\u4e00-\u9fa5]+)")
                .Cast<Match>()
                .Select(m => m.Value.ToLower());
            allWords.AddRange(words);
        }

        // 过滤停用词和单字词
        var filteredWords = allWords
            .Where(word => !stopWords.Contains(word) && word.Length >= 2);

        // 统计词频并排序
        var keywordCounts = filteredWords
            .GroupBy(word => word)
            .OrderByDescending(g => g.Count())
            .Select(g => $"{g.Key} ({g.Count()})")
            .ToList();

        // 显示结果
        resultList.DataSource = keywordCounts;
    }

    // 初始化窗体控件
    private void InitializeComponent()
    {
        this.inputBox = new TextBox();
        this.analyzeButton = new Button();
        this.resultList = new ListBox();

        // 布局控件
        this.inputBox.Multiline = true;
        this.inputBox.Location = new System.Drawing.Point(20, 20);
        this.inputBox.Size = new System.Drawing.Size(400, 150);

        this.analyzeButton.Text = "提取关键词";
        this.analyzeButton.Location = new System.Drawing.Point(20, 180);
        this.analyzeButton.Click += AnalyzeButton_Click;

        this.resultList.Location = new System.Drawing.Point(20, 220);
        this.resultList.Size = new System.Drawing.Size(400, 200);

        this.ClientSize = new System.Drawing.Size(440, 440);
        this.Controls.Add(inputBox);
        this.Controls.Add(analyzeButton);
        this.Controls.Add(resultList);
    }
}

功能说明

  1. 中英文混合分词

    • 使用 Jieba.NET 处理中文分词。
    • 通过正则表达式 ([A-Za-z0-9#+]+) 提取英文单词和数字(如 C#Python3)。
  2. 停用词过滤

    • 内置中英文停用词表(如 “的”、“and”),过滤无意义词汇。
    • 过滤长度小于2的字符(如单字词)。
  3. 词频统计

    • 统计关键词出现次数并按频率降序排列。

扩展建议

  • 加载外部停用词表
    从文件加载更全面的停用词(如 stopwords.txt):
private void LoadStopWordsFromFile(string path)
{
    stopWords = new HashSet<string>(File.ReadAllLines(path));
}
  • 词性过滤
    使用 Jieba.NET 的词性标注功能,仅保留名词、动词等关键词:
var posSegmenter = new PosSegmenter();
var posTags = posSegmenter.Cut(inputText);
var nouns = posTags.Where(tag => tag.Flag.StartsWith("n"));
  • TF-IDF算法
    实现更高级的关键词权重计算(需引入TF-IDF库)。

使用 Jieba.NET 进行中文分词

安装完成后,你就可以在你的 .NET 项目中使用 Jieba.NET 进行中文分词了。以下是一个简单的示例:

using JiebaNet.Segmenter;
using System;
 
class Program
{
    static void Main(string[] args)
    {
        var segmenter = new JiebaSegmenter();
        string text = "我爱北京天安门";
        var words = segmenter.Cut(text);
        foreach (var word in words)
        {
            Console.WriteLine(word);
        }
    }
}

在上面的示例中,我们首先创建了一个 JiebaSegmenter 实例,然后使用 Cut 方法对字符串 "我爱北京天安门" 进行分词。分词结果会以 IEnumerable的形式返回,我们可以遍历这个结果并打印出每个词语。

分词模式选择

Jieba.NET 提供了三种分词模式:精确模式、全模式和搜索引擎模式。你可以根据需要选择合适的模式。

  • 精确模式:试图将句子最精确地切开,适合文本分析。

  • 全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义问题。

  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

你可以通过 Cut 方法的重载版本来指定分词模式,例如:

var words = segmenter.Cut(text, cutMode: CutMode.Full); // 使用全模式进行分词

添加自定义词典

Jieba.NET 还支持自定义词典功能,你可以将特定的词汇添加到词典中,以确保它们能够被正确地识别为一个词。例如:

segmenter.AddWord("天安门广场"); // 将“天安门广场”添加到词典中

添加自定义词典后,当你对包含这些词汇的文本进行分词时,Jieba.NET 会将它们作为一个整体进行切分。

以上就是使用C#和Jieba.NET实现中英文混合文本关键词的提取功能的详细内容,更多关于C# Jieba.NET关键词提取的资料请关注脚本之家其它相关文章!

相关文章

  • C#对DataTable里数据排序的方法

    C#对DataTable里数据排序的方法

    在日常开发过程中,有一个DataTable集合,里面有很多字段,现在要求针对某一列进行排序,如果该列为数字的话,进行ASC即可实现,但是该字段类型为string,此时排序就有点不正确了
    2013-11-11
  • C#使用委托实现的快速排序算法实例

    C#使用委托实现的快速排序算法实例

    这篇文章主要介绍了C#使用委托实现的快速排序算法,实例分析了C#委托机制与快速排序算法的实现技巧,需要的朋友可以参考下
    2015-07-07
  • C#实现HTTP下载文件的方法

    C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下
    2014-11-11
  • C#并行编程之数据并行Tasks.Parallel类

    C#并行编程之数据并行Tasks.Parallel类

    这篇文章介绍了C#并行编程之数据并行Tasks.Parallel类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 使用C#与设备接口进行无缝通信的实现技巧

    使用C#与设备接口进行无缝通信的实现技巧

    随着物联网、智能设备和自动化技术的快速发展,越来越多的设备需要与计算机系统进行实时通信,而C#作为一门强大的编程语言,凭借其广泛的库支持和高效的开发效率,已成为与设备接口对接的理想选择,在本篇文章中,我们将探讨如何使用C#与设备进行无缝通信
    2025-01-01
  • C# 将透明图片的非透明区域转换成Region的实例代码

    C# 将透明图片的非透明区域转换成Region的实例代码

    以下代码实现将一张带透明度的png图片的非透明部分转换成Region输出的方法,有需要的朋友可以参考一下
    2013-10-10
  • C#使用泛型方法设计实现单向链表详解

    C#使用泛型方法设计实现单向链表详解

    这篇文章主要为大家详细介绍了C#如何使用泛型方法设计实现一个单向链表,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • 使用xmltextreader对象读取xml文档示例

    使用xmltextreader对象读取xml文档示例

    这篇文章主要介绍了使用xmltextreader对象读取xml文档的示例,需要的朋友可以参考下
    2014-02-02
  • C#实现QQ窗口抖动效果

    C#实现QQ窗口抖动效果

    这篇文章主要为大家详细介绍了C#实现QQ窗口抖动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C#处理JPEG头信息的方法

    C#处理JPEG头信息的方法

    相信大家肯定都看过用C或C++处理JPEG头信息的程序了,我也看了,不过因为我不懂C,看得我头疼。所以我还是决定用C#来写吧
    2013-05-05

最新评论