神经网络NLP分词任务,jieba,TF-IDF

中文分词 - 正向最大匹配

1.收集一个词表

2.对于一个待分词的字符串,从前向后寻找最长的,在此表中出现的词,在词边界做切分

3.从切分处重复步骤2,直到字符串末尾

正向最大匹配实现方式一:

  1. 找出词表中的最大词长度

  2. 从字符串开头开始选取最大词长度的窗口,检查窗口内词是否在词表中

  3. 如果在词表中,在词边界处进行切分,之后移动到词边界处,重复步骤2

  4. 如果不在词表中,窗口右边界回退一个字符,之后检查窗口词是否在词表中

实现方式二:

  1. 从前向后进行查找

  2. 如果窗口内的词是一个词前缀则继续扩大窗口

  3. 如果窗口内的词不是一个词的前缀,则记录已发现的词,并将窗口移动到词边界

中文分词-jieba分词

比如北京大学生前来报到

把所有的情况切分出来

那么哪种切分最好 ,根据切分方式总词频最高

它会自己算出来词频,然后找到总词频更高的值

怎么实现的?

他会先选文本,然后根据切分做出词典,统计词频,就是在跟我们做任务之前,他已经准备好了,词典

.正向最大切分,负向最大切分,双向最大切分共同的缺点:

  1. 对词表及其依赖,如果没有词表,则无法进行;如果词表中缺少需要的词,结果也不会正确

  2. 切分过程中不会关注整个句子表达的意思,只会将句子看成一个个片段

  3. 如果文本中出现一定的错别字,会造成一连串影响

  4. 对于人名等的无法枚举实体词无法有效处理

  5. 中英混杂也是个问题

中文分词 - 基于机器学习

分词的本质需要我们知道

假如

我们的本质是对每个词进行二分类

复制代码
# 统计tf和idf的值

def build_tf_idf_dict(corpus):
    tf_dict = defaultdict(dict) # key:文档号,value:dict,文档中每个词出现的概率
    idf_dict = defaultdict(set) # key: 词 value: set,文档序号,最终用于计算每个词在多少篇文档中出现过
    for text_index,text_words in enumerate(corpus):
        for word in text_words:
            if word not in tf_dict[text_index]:
                tf_dict[text_index][word] = 0
            tf_dict[text_index][word] += 1
            idf_dict[word].add(text_index)
    idf_dict = dict([(key,len(value)) for key,value in idf_dict.items()])
    return tf_dict,idf_dict

# 根据tf值和idf值计算tfidf
def calculate_tf_idf(tf_dict,idf_dict):
    tf_idf_dict = defaultdict(dict)
    for text_index,word_tf_count_dict in tf_dict.items():
        for word,tf_count in word_tf_count_dict.items():
            tf = tf_count/sum(word_tf_count_dict.values())
            # tf-idf = tf * log(D/(idf + 1))
            tf_idf_dict[text_index][word] = tf * math.log(len(tf_dict) / (idf_dict[word] + 1))
    return tf_idf_dict


# 输入语料 list of string
#["******","*******","********"]
def calculate_tfidf(corpus):
    # 先进性分词
    corpus = [jieba.lcut(text) for text in corpus]
    tf_dict,idf_dict = build_tf_idf_dict(corpus)
    tf_idf_dict = calculate_tf_idf(tf_dict,idf_dict)
    return tf_idf_dict

#根据tfidf字典,显示每个领域topK的关键词
def tf_idf_topk(tfidf_dict, paths=[], top=10, print_word=True):
    topk_dict = {}
    for text_index, text_tfidf_dict in tfidf_dict.items():
        word_list = sorted(text_tfidf_dict.items(), key=lambda x:x[1], reverse=True)
        topk_dict[text_index] = word_list[:top]
        if print_word:
            print(text_index, paths[text_index])
            for i in range(top):
                print(word_list[i])
            print("----------")
    return topk_dict

但是传统分法都很依赖词表,但是多数情况下没有词表,如果不依赖词表怎么做

新词发现

随着时间的推移,新词会不断出现,固有词表会过时

补充词表有利于下游任务

什么是词:

词相当于一种固定搭配

那怎么定义一种固定搭配:

词的内部应该是稳固的 内部凝固度

c1,cn 代表其中字,p(c1)字的频率连乘起来,p(w)词频

词的外部应该是多变的 左右熵

从词到理解

有了分词能力后,需要利用词来完成对文本的理解

首先可以想到的,就是从文章挑选重要的词

何为重要词:

如何用数学角度刻画

一种nlp的经典统计值: TF*IDF

TF: 词频

某个词在某类别中出现的次数/该类别词总数

IDF: 逆文档频率

N代表文本书总数

dfi 代表包含qi的文本中的总数

逆文档频率高->该词很少出现在其他文档

TF-IDF高->该词对于该领域重要程度高

TFIDF应用-搜索引擎

  1. 对于已有所有网页(文本),计算每个网页中,词的TFIDF值

  2. 对于一个输入query进行分词

  3. 对于文档D,计算query中的词在文档D中的TFIDF值总和,作为query和文档的相关性得分

TFIDF应用-文本摘要

1.通过计算TFIDF值得到每个文本的关键词

2.将包含关键词多的句子,认为是关键句

3.挑选若干关键句,作为文本的摘要

TFIDF应用-文本相似度计算

1.对所有文本计算tfidf后,从每个文本选取tfidf较高的前n个词,得到一个词的集合S

  1. 对于每篇文本D,计算S中的每个词的词频,将其作为文本的向量。

  2. 通过计算向量夹角余弦值,得到向量相似度,作为文本的相似度

  3. 向量夹角余弦值计算:

TFIDF劣势

1.受分词影响大

  1. 词与词之间没有语义相似度

  2. 没有语序信息

  3. 能力范围有限,无法完成复杂任务,如机器翻译和实体挖掘

  4. 样本不均衡会对结果有很大影响

  5. 类内样本分布不被考虑

相关推荐
ai小陈2 小时前
PyTorch DataLoader数据加载性能排查:GPU利用率低的实操指南
人工智能·pytorch·python·深度学习·ai·gpu算力
测试者家园3 小时前
为什么意图驱动测试是自动化测试的下一站,而不是替代品
自动化测试·软件测试·人工智能·持续测试·ai赋能·智能化测试·软件测试变革
D202020204 小时前
TikTok Shop禁止AI语音直播落地后,跨境卖家如何通过达秘合规调整带货内容
人工智能
像风一样自由20205 小时前
20.Milvus常见问题检索不到维度错误和数据一致性
人工智能·大模型·milvus
现代野蛮人5 小时前
【深度学习实验】—— 基于 LSTM 与 Optuna 调参的丙型肝炎预测
人工智能·深度学习·lstm
支支დ5 小时前
VO by Vercel 前端特定优势:为什么它是构建 AI 应用的新范式
前端·人工智能
ZGIAI5 小时前
ZGI 让那些"等你去处理"的事,真正跑起来
人工智能·架构
ZGIAI5 小时前
ZGI:别再做Agent Demo了,先问问它在业务里能不能撑过下周三
人工智能·架构
香芋芋圆5 小时前
AI 冲击内卷之下,普通前端如何破局?WebGIS—— 低门槛突围赛道
前端·javascript·人工智能·学习·职场发展
m0_614523555 小时前
完整教程|输入一句描述,能不能直接生成一段可以继续剪辑的视频:写结构化描述到生成短样片
人工智能·音视频