基于互信息+信息熵的新词发现

本文介绍了一种使用Python和nltk库进行文本预处理的方法,包括去除停用词、提取n-gram,并通过计算互信息和熵来筛选关键短语。通过对文本数据应用这些技术,可以有效地提取出有意义的信息。
部署运行你感兴趣的模型镜像
from nltk.probability import FreqDist

f = open(r"C:\Users\machuanbin\Desktop\santi.txt",encoding='utf-8')
text = f.read()

stop_word = ['', '', ')', '(', '', '', '“', '”', '', '\n', '', '', ' ', '-', '', '', '.', '\'', '[', ']', '',
             '/', '.', '"', '\u3000', '’', '', ',', '…', '?']
for i in stop_word:
    text = text.replace(i, "")

print(text)
min_entropy = 0.8
min_p = 7
max_gram = 4
count_appear = 20


def gram(text, max_gram):
    t1 = [i for i in text]
    loop = len(t1) + 1 - max_gram
    t = []
    for i in range(loop):
        t.append(text[i:i + max_gram])
    if max_gram == 1:
        return t1
    else:
        return t


import math


def pro(word):
    len_word = len(word)
    total_count = len(word_all[len_word])
    pro = freq_all[len_word][word] / total_count
    return pro


def entropy(alist):
    f = FreqDist(alist)
    ent = (-1) * sum([i / len(alist) * math.log(i / len(alist)) for i in f.values()])
    return ent


freq_all = [0]
word_all = [0]
for i in range(1, max_gram + 1):
    t = gram(text, i)
    # print('t===',t)
    freq = FreqDist(t)

    word_all.append(t)
    freq_all.append(freq)

# 筛选一部分符合互信息的单词
final_word = []
for i in range(2, max_gram + 1):
    for j in word_all[i]: #在所有的2-gram        if freq_all[i][j] < count_appear:
            pass
        else:
            p = min([pro(j[:i]) * pro(j[i:]) for i in range(1, len(j))])
            if math.log(pro(j) / p) > min_p:
                final_word.append(j)
final_word = list(set(final_word))
print(final_word)
# 筛选左右熵
import re

final_word2 = []
for i in final_word:
    lr = re.findall('(.) %s (.)' % i, text)
    left_entropy = entropy([w[0] for w in lr])
    right_entropy = entropy([w[1] for w in lr])
    if min([right_entropy, left_entropy]) > min_entropy:
        final_word2.append(i)

print(final_word2)

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 基于互信息信息熵新词发现算法 #### 方法概述 新词发现是一种重要的自然语言处理(NLP)技术,用于识别未登录词或领域特定术语。基于互信息信息熵新词发现方法主要依赖统计学原理来评估候选词语的特性。这种方法通过分析文本中的频率分布、上下文关系以及语义凝聚性,能够有效提取潜在的新词。 #### 频数计算 频数是指某个字符串在文本中出现的次数。对于一段连续字符序列 $ w_iw_{i+1}...w_j $ ,其频数可以通过滑动窗口的方式统计得到[^1]。具体而言,在整个文档集合上扫描每一段可能成为单词的子串,并记录它们的出现次数。 #### 凝合程度衡量 凝合程度反映了组成该候选词各部分之间的紧密联系强度。通常采用 **点互信息 (PMI)** 来量化这种关联度: $$ PMI(w_1, w_2) = \log\left(\frac{P(w_1,w_2)}{P(w_1)\cdot P(w_2)}\right) $$ 其中 $ P(w_1,w_2) $ 表示两个相邻字同时出现的概率;而 $ P(w_1), P(w_2) $ 则分别为单独出现各自单字的概率[^2]。较高的PMI值意味着这两个字更倾向于组合成一个整体单元而非随机并列存在。 #### 自由程度测量 - 信息熵应用 为了判断某段文字是否可以独立作为一个新的词汇单位考虑进来,则需要用到另一个重要概念即“自由程度”。这里引入了**条件熵H(Y|X)** 的定义方式来进行估算: $$ H(Y|X=x)=\sum_y p(y|x=-x)*-\log[p(y|x)] $$ 当给定前缀 X 后续 Y 变化越少时说明此模式较为固定稳定适合构成词条;反之如果后续变化很大则不太适合作为单一实体看待. 以下是Python实现的一个简单例子展示如何利用上述理论框架完成初步的新词挖掘过程: ```python import math from collections import defaultdict def calculate_pmi(word_pairs_count, word_counts, total_words): """Calculate Pointwise Mutual Information.""" result = {} for pair, count in word_pairs_count.items(): first_word, second_word = pair.split() prob_pair = count / total_words prob_first = word_counts[first_word] / total_words prob_second = word_counts[second_word] / total_words try: pmi_value = math.log(prob_pair / (prob_first * prob_second)) except ZeroDivisionError as e: continue result[pair] = pmi_value return result word_pairs_count = {"北京烤鸭": 50, "北京大学": 80} word_counts = {"北": 100, "京": 90, "大": 70, "学": 60, "烤": 40, "鸭": 30} total_words = sum(word_counts.values()) pmis = calculate_pmi(word_pairs_count, word_counts, total_words) for k,v in pmis.items(): print(f"{k}: {v}") ``` 以上脚本仅作示范用途,实际项目需进一步优化调整参数设置等细节方面的工作才能达到理想效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值