使用C#和Jieba.NET實(shí)現(xiàn)中英文混合文本關(guān)鍵詞的提取功能
實(shí)現(xiàn)步驟
創(chuàng)建Windows窗體應(yīng)用程序
添加以下控件:TextBox
:輸入文本(支持多行)Button
:觸發(fā)分詞ListBox
:顯示關(guān)鍵詞及詞頻
安裝NuGet包
Install-Package jieba.NET
完整代碼實(shí)現(xiàn)
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("請(qǐng)輸入文本!"); return; } // 使用Jieba進(jìn)行分詞(處理中文和英文混合) var segmenter = new JiebaSegmenter(); var segments = segmenter.Cut(inputText); // 提取英文單詞(通過(guò)正則表達(dá)式補(bǔ)充處理) 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); } // 過(guò)濾停用詞和單字詞 var filteredWords = allWords .Where(word => !stopWords.Contains(word) && word.Length >= 2); // 統(tǒng)計(jì)詞頻并排序 var keywordCounts = filteredWords .GroupBy(word => word) .OrderByDescending(g => g.Count()) .Select(g => $"{g.Key} ({g.Count()})") .ToList(); // 顯示結(jié)果 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 = "提取關(guān)鍵詞"; 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); } }
功能說(shuō)明
中英文混合分詞
- 使用
Jieba.NET
處理中文分詞。 - 通過(guò)正則表達(dá)式
([A-Za-z0-9#+]+)
提取英文單詞和數(shù)字(如C#
、Python3
)。
- 使用
停用詞過(guò)濾
- 內(nèi)置中英文停用詞表(如 “的”、“and”),過(guò)濾無(wú)意義詞匯。
- 過(guò)濾長(zhǎng)度小于2的字符(如單字詞)。
詞頻統(tǒng)計(jì)
- 統(tǒng)計(jì)關(guān)鍵詞出現(xiàn)次數(shù)并按頻率降序排列。
擴(kuò)展建議
- 加載外部停用詞表
從文件加載更全面的停用詞(如stopwords.txt
):
private void LoadStopWordsFromFile(string path) { stopWords = new HashSet<string>(File.ReadAllLines(path)); }
- 詞性過(guò)濾
使用Jieba.NET
的詞性標(biāo)注功能,僅保留名詞、動(dòng)詞等關(guān)鍵詞:
var posSegmenter = new PosSegmenter(); var posTags = posSegmenter.Cut(inputText); var nouns = posTags.Where(tag => tag.Flag.StartsWith("n"));
- TF-IDF算法
實(shí)現(xiàn)更高級(jí)的關(guān)鍵詞權(quán)重計(jì)算(需引入TF-IDF庫(kù))。
使用 Jieba.NET 進(jìn)行中文分詞
安裝完成后,你就可以在你的 .NET 項(xiàng)目中使用 Jieba.NET 進(jìn)行中文分詞了。以下是一個(gè)簡(jiǎn)單的示例:
using JiebaNet.Segmenter; using System; class Program { static void Main(string[] args) { var segmenter = new JiebaSegmenter(); string text = "我愛(ài)北京天安門(mén)"; var words = segmenter.Cut(text); foreach (var word in words) { Console.WriteLine(word); } } }
在上面的示例中,我們首先創(chuàng)建了一個(gè) JiebaSegmenter
實(shí)例,然后使用 Cut
方法對(duì)字符串 "我愛(ài)北京天安門(mén)"
進(jìn)行分詞。分詞結(jié)果會(huì)以 IEnumerable的形式返回,我們可以遍歷這個(gè)結(jié)果并打印出每個(gè)詞語(yǔ)。
分詞模式選擇
Jieba.NET 提供了三種分詞模式:精確模式、全模式和搜索引擎模式。你可以根據(jù)需要選擇合適的模式。
精確模式:試圖將句子最精確地切開(kāi),適合文本分析。
全模式:把句子中所有的可以成詞的詞語(yǔ)都掃描出來(lái),速度非常快,但是不能解決歧義問(wèn)題。
搜索引擎模式:在精確模式的基礎(chǔ)上,對(duì)長(zhǎng)詞再次切分,提高召回率,適合用于搜索引擎分詞。
你可以通過(guò) Cut
方法的重載版本來(lái)指定分詞模式,例如:
var words = segmenter.Cut(text, cutMode: CutMode.Full); // 使用全模式進(jìn)行分詞
添加自定義詞典
Jieba.NET 還支持自定義詞典功能,你可以將特定的詞匯添加到詞典中,以確保它們能夠被正確地識(shí)別為一個(gè)詞。例如:
segmenter.AddWord("天安門(mén)廣場(chǎng)"); // 將“天安門(mén)廣場(chǎng)”添加到詞典中
添加自定義詞典后,當(dāng)你對(duì)包含這些詞匯的文本進(jìn)行分詞時(shí),Jieba.NET 會(huì)將它們作為一個(gè)整體進(jìn)行切分。
以上就是使用C#和Jieba.NET實(shí)現(xiàn)中英文混合文本關(guān)鍵詞的提取功能的詳細(xì)內(nèi)容,更多關(guān)于C# Jieba.NET關(guān)鍵詞提取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#對(duì)DataTable里數(shù)據(jù)排序的方法
在日常開(kāi)發(fā)過(guò)程中,有一個(gè)DataTable集合,里面有很多字段,現(xiàn)在要求針對(duì)某一列進(jìn)行排序,如果該列為數(shù)字的話(huà),進(jìn)行ASC即可實(shí)現(xiàn),但是該字段類(lèi)型為string,此時(shí)排序就有點(diǎn)不正確了2013-11-11C#使用委托實(shí)現(xiàn)的快速排序算法實(shí)例
這篇文章主要介紹了C#使用委托實(shí)現(xiàn)的快速排序算法,實(shí)例分析了C#委托機(jī)制與快速排序算法的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-07-07C#并行編程之?dāng)?shù)據(jù)并行Tasks.Parallel類(lèi)
這篇文章介紹了C#并行編程之?dāng)?shù)據(jù)并行Tasks.Parallel類(lèi),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05使用C#與設(shè)備接口進(jìn)行無(wú)縫通信的實(shí)現(xiàn)技巧
隨著物聯(lián)網(wǎng)、智能設(shè)備和自動(dòng)化技術(shù)的快速發(fā)展,越來(lái)越多的設(shè)備需要與計(jì)算機(jī)系統(tǒng)進(jìn)行實(shí)時(shí)通信,而C#作為一門(mén)強(qiáng)大的編程語(yǔ)言,憑借其廣泛的庫(kù)支持和高效的開(kāi)發(fā)效率,已成為與設(shè)備接口對(duì)接的理想選擇,在本篇文章中,我們將探討如何使用C#與設(shè)備進(jìn)行無(wú)縫通信2025-01-01C# 將透明圖片的非透明區(qū)域轉(zhuǎn)換成Region的實(shí)例代碼
以下代碼實(shí)現(xiàn)將一張帶透明度的png圖片的非透明部分轉(zhuǎn)換成Region輸出的方法,有需要的朋友可以參考一下2013-10-10C#使用泛型方法設(shè)計(jì)實(shí)現(xiàn)單向鏈表詳解
這篇文章主要為大家詳細(xì)介紹了C#如何使用泛型方法設(shè)計(jì)實(shí)現(xiàn)一個(gè)單向鏈表,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02使用xmltextreader對(duì)象讀取xml文檔示例
這篇文章主要介紹了使用xmltextreader對(duì)象讀取xml文檔的示例,需要的朋友可以參考下2014-02-02