N-gram 相似度计算与评估
创始人
2024-11-12 08:08:25
0次

示例文本

  • 参考文本: “Natural language processing is very interesting.”
  • 生成文本: “Natural language processing is quite interesting.”

1. 提取 N-gram

1.1. Unigram(1-gram)

参考文本的Unigram:

["Natural", "language", "processing", "is", "very", "interesting"] 

生成文本的Unigram:

["Natural", "language", "processing", "is", "quite", "interesting"] 

1.2. Bigram(2-gram)

参考文本的Bigram:

["Natural language", "language processing", "processing is", "is very", "very interesting"] 

生成文本的Bigram:

["Natural language", "language processing", "processing is", "is quite", "quite interesting"] 

2. 计算 N-gram 重叠

2.1. Unigram 重叠

重叠的Unigram:

["Natural", "language", "processing", "is", "interesting"] 

重叠的Unigram数量:5

总参考文本Unigram数量:6

总生成文本Unigram数量:6

2.2. Bigram 重叠

重叠的Bigram:

["Natural language", "language processing", "processing is"] 

重叠的Bigram数量:3

总参考文本Bigram数量:5

总生成文本Bigram数量:5

3. 计算评估指标

3.1. 精确率(Precision)

  • Unigram 精确率:
    Precision Unigram = 重叠的Unigram数量 生成文本中的总Unigram数量 = 5 6 ≈ 0.83 \text{Precision}_{\text{Unigram}} = \frac{\text{重叠的Unigram数量}}{\text{生成文本中的总Unigram数量}} = \frac{5}{6} \approx 0.83 PrecisionUnigram​=生成文本中的总Unigram数量重叠的Unigram数量​=65​≈0.83

  • Bigram 精确率:
    Precision Bigram = 重叠的Bigram数量 生成文本中的总Bigram数量 = 3 5 = 0.6 \text{Precision}_{\text{Bigram}} = \frac{\text{重叠的Bigram数量}}{\text{生成文本中的总Bigram数量}} = \frac{3}{5} = 0.6 PrecisionBigram​=生成文本中的总Bigram数量重叠的Bigram数量​=53​=0.6

3.2. 召回率(Recall)

  • Unigram 召回率:
    Recall Unigram = 重叠的Unigram数量 参考文本中的总Unigram数量 = 5 6 ≈ 0.83 \text{Recall}_{\text{Unigram}} = \frac{\text{重叠的Unigram数量}}{\text{参考文本中的总Unigram数量}} = \frac{5}{6} \approx 0.83 RecallUnigram​=参考文本中的总Unigram数量重叠的Unigram数量​=65​≈0.83

  • Bigram 召回率:
    Recall Bigram = 重叠的Bigram数量 参考文本中的总Bigram数量 = 3 5 = 0.6 \text{Recall}_{\text{Bigram}} = \frac{\text{重叠的Bigram数量}}{\text{参考文本中的总Bigram数量}} = \frac{3}{5} = 0.6 RecallBigram​=参考文本中的总Bigram数量重叠的Bigram数量​=53​=0.6

3.3. F1 分数(F1 Score)

  • Unigram F1分数:
    F1 Unigram = 2 × Precision Unigram × Recall Unigram Precision Unigram + Recall Unigram = 2 × 0.83 × 0.83 0.83 + 0.83 ≈ 0.83 \text{F1}_{\text{Unigram}} = 2 \times \frac{\text{Precision}_{\text{Unigram}} \times \text{Recall}_{\text{Unigram}}}{\text{Precision}_{\text{Unigram}} + \text{Recall}_{\text{Unigram}}} = 2 \times \frac{0.83 \times 0.83}{0.83 + 0.83} \approx 0.83 F1Unigram​=2×PrecisionUnigram​+RecallUnigram​PrecisionUnigram​×RecallUnigram​​=2×0.83+0.830.83×0.83​≈0.83

  • Bigram F1分数:
    F1 Bigram = 2 × Precision Bigram × Recall Bigram Precision Bigram + Recall Bigram = 2 × 0.6 × 0.6 0.6 + 0.6 = 0.6 \text{F1}_{\text{Bigram}} = 2 \times \frac{\text{Precision}_{\text{Bigram}} \times \text{Recall}_{\text{Bigram}}}{\text{Precision}_{\text{Bigram}} + \text{Recall}_{\text{Bigram}}} = 2 \times \frac{0.6 \times 0.6}{0.6 + 0.6} = 0.6 F1Bigram​=2×PrecisionBigram​+RecallBigram​PrecisionBigram​×RecallBigram​​=2×0.6+0.60.6×0.6​=0.6

4. Python 代码实现

from collections import Counter from typing import List  def extract_ngrams(text: str, n: int) -> List[str]:     words = text.split()     return [' '.join(words[i:i+n]) for i in range(len(words)-n+1)]  def calculate_ngram_overlap(reference: str, generated: str, n: int):     reference_ngrams = extract_ngrams(reference, n)     generated_ngrams = extract_ngrams(generated, n)          reference_counter = Counter(reference_ngrams)     generated_counter = Counter(generated_ngrams)          overlapping_ngrams = set(reference_counter.keys()) & set(generated_counter.keys())          overlap_count = sum(min(reference_counter[ngram], generated_counter[ngram]) for ngram in overlapping_ngrams)     precision = overlap_count / len(generated_ngrams) if generated_ngrams else 0     recall = overlap_count / len(reference_ngrams) if reference_ngrams else 0     f1_score = 2 * (precision * recall) / (precision + recall) if (precision + recall) else 0          return precision, recall, f1_score  reference_text = "Natural language processing is very interesting." generated_text = "Natural language processing is quite interesting."  # 计算Unigram(1-gram) precision_unigram, recall_unigram, f1_unigram = calculate_ngram_overlap(reference_text, generated_text, 1) print(f"Unigram - 精确率: {precision_unigram:.2f}, 召回率: {recall_unigram:.2f}, F1分数: {f1_unigram:.2f}")  # 计算Bigram(2-gram) precision_bigram, recall_bigram, f1_bigram = calculate_ngram_overlap(reference_text, generated_text, 2) print(f"Bigram - 精确率: {precision_bigram:.2f}, 召回率: {recall_bigram:.2f}, F1分数: {f1_bigram:.2f}") 

Code

完整示例代码已上传至:Machine Learning and Deep Learning Algorithms with NumPy
此项目包含更多AI相关的算法numpy实现,供大家学习参考使用,欢迎star~

备注

个人水平有限,有问题随时交流~ 

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...