自然语言处理NPL最大概率分词算法

合集下载

自然语言处理之分词术_光环大数据培训

自然语言处理之分词术_光环大数据培训

自然语言处理之分词术_光环大数据培训一个良好的分词系统应由词典和统计两套系统组成。

后者为前者构造可持续更新的词典,识别新词,同时对消岐部分进行匹配。

在分词过程中,好的词典很重要,其次算法要跟着需求走,不同需求选择不同算法,比如有些要求速度快,与兴趣相关,此时算法是次要的,而有些需求注重的是精度。

中文分词难点:未登录词和切分歧义。

中文分词算法大概分为两类:基于字符串匹配,集扫描字符串,若发现字符串的子串和词相同,就算匹配。

例如mmseg正向最大匹配策略等。

这类算法速度快,时间复杂度是0(n),实现简单,但是对歧义和未登录词处理效果不太明显。

基于统计及机器学习的分词方式。

这类分词基于人工标注的词性和统计特征,对中文进行建模。

对标注好的预料进行训练。

在分词阶段,通过模型计算各种分词出现的概率,概率最大的分词即为最终结果。

常见模型如CRF、HMM。

这类算法能很好的解决歧义和未登录问题,效果比前一类好,但是需要大量人工标注数据,分词速度较慢。

基于神经网络的分词方式。

这是未来的趋势,目前比较看好的模型是RNN循环神经网络,可以解决标注量的问题,但是可能存在分词速度慢的问题,后续将确认下。

现有方法:基于词典的匹配:前向最大匹配,后向最大匹配;基于字的标注:最大熵模型,条件随机场模型,感知器模型;其他方法:与词性标注集合,与句法分析结合。

常见分词工具(以下来自知乎,具体介绍将会在后学章节展开):1、mmseg。

是我自己最喜欢的分词方法,简单、高效、实用、效果还不错。

我给它起了个名字,叫做“3段回溯式方法”,即每次从一个完整的句子里,按照从左向右的顺序,识别出多种不同的3个词的组合;然后根据下面的4条消歧规则,确定最佳的备选词组合;选择备选词组合中的第1个词,作为1次迭代的分词结果;剩余的2个词继续进行下一轮的分词运算。

采用这种办法的好处是,为传统的前向最大匹配算法加入了上下文信息,解决了其每次选词只考虑词本身,而忽视上下文相关词的问题。

n-gram 分词 原理

n-gram 分词 原理

n-gram 分词原理一、什么是n-gram分词n-gram分词是一种基于统计的文本处理方法,它将文本按照一定的规则进行切割,形成不同长度的词组。

其中n代表词组的长度,可以是1、2、3等。

二、n-gram分词的原理1. 数据预处理在进行n-gram分词之前,需要对原始文本进行预处理。

这包括去除特殊字符、停用词等。

预处理后的文本更加干净,有助于提高分词的准确性。

2. 构建n-gram模型n-gram模型是基于马尔可夫链的一种文本生成模型。

它将文本看作是一个由词组组成的序列,通过统计词组出现的频率来预测下一个词组的概率。

3. 分词在n-gram模型中,分词的过程就是根据给定的n值,将文本切割成一定长度的词组。

例如,当n=1时,就是将文本切割成单个词语;当n=2时,就是将文本切割成两个词语的组合,依此类推。

4. 评估分词结果对于分词结果,我们可以通过一些指标来评估其准确性。

常见的指标包括精确率、召回率和F1值等。

通过这些指标,我们可以了解到n-gram分词的效果如何,并对其进行优化。

三、n-gram分词的应用1. 机器翻译n-gram分词在机器翻译中有着广泛的应用。

通过将源语言和目标语言的文本切割成一定长度的词组,可以更好地进行翻译。

2. 文本分类在文本分类任务中,n-gram分词可以将文本切割成词组,并将每个词组表示为特征向量。

这样可以更好地表示文本的语义信息,提高分类的准确性。

3. 信息检索n-gram分词可以用于信息检索中的查询扩展。

通过将查询文本切割成词组,并扩展查询词,可以提高检索的准确性和召回率。

四、n-gram分词的优缺点1. 优点n-gram分词简单易懂,容易实现。

同时,它能够捕捉到词组的上下文信息,提高分词的准确性。

2. 缺点n-gram分词忽略了词与词之间的顺序关系,可能会导致分词结果的歧义。

另外,n-gram模型对于未出现的词组无法进行处理。

五、总结n-gram分词是一种基于统计的文本处理方法,通过将文本切割成一定长度的词组,可以捕捉到词组的上下文信息,提高分词的准确性。

n-gram 句子概率

n-gram 句子概率

n-gram 句子概率n-gram是一种基于统计语言模型的方法,它可以用来计算一个句子的概率。

在n-gram模型中,一个句子的概率被分解成一个个单词的条件概率的乘积。

具体来说,n-gram模型假设一个单词出现的概率只与它前面的n-1个单词有关,而与其他单词无关。

因此,一个句子的概率可以表示为:P(w1,w2,w3,...,wn) = P(w1) * P(w2|w1) * P(w3|w1,w2) * ... * P(wn|wn-n+1,...,w2,w1)其中,P(w1)表示第一个单词出现的概率,P(w2|w1)表示在w1出现的情况下,w2出现的概率,以此类推。

n-gram模型中的n值可以根据实际情况进行选择。

通常情况下,n取2或3比较常见。

当n=1时,称为unigram模型;当n=2时,称为bigram模型;当n=3时,称为trigram模型。

在计算句子概率时,需要对语料库进行统计,得到每个单词出现的频率以及每个n-gram出现的频率。

然后,可以使用最大似然估计或平滑技术来计算条件概率。

最大似然估计是一种常用的方法,它假设每个n-gram出现的概率等于它在语料库中出现的频率除以前面n-1个单词出现的频率的乘积。

平滑技术可以避免出现未在语料库中出现的n-gram的概率为0的情况,常见的平滑技术包括拉普拉斯平滑、Good-Turing平滑等。

计算句子概率的过程可以通过递归实现。

具体来说,可以先计算第一个单词出现的概率,然后递归计算后面每个单词在前面n-1个单词出现的情况下的概率,最后将它们的乘积作为整个句子的概率。

总之,n-gram模型是一种基于统计的语言模型,它可以用来计算一个句子的概率。

在实际应用中,可以根据实际情况选择n值,并使用最大似然估计或平滑技术来计算条件概率。

tiktoken中文分词原理

tiktoken中文分词原理

tiktoken中文分词原理1.概述在自然语言处理(NL P)领域中,中文分词是一个重要的任务,它的目标是将连续的中文字符序列切分成有意义的词语。

ti kt ok en是一个开源的中文分词工具,它基于最大匹配算法和字典树的方法来实现中文分词。

本文将介绍t ik to ke n中文分词工具的原理及其运行过程。

2.最大匹配算法最大匹配算法是一种常用的中文分词算法,它基于词典中最长的词汇进行切分。

t ik to ken利用了最大匹配算法来进行分词。

具体而言,t ik to ken首先将待切分的句子按照最大切分长度划分为几个子句。

然后,它从每个子句的起始位置开始,逐渐增大切分长度,不断寻找匹配的词汇。

当找到匹配的词汇时,t ik to ke n将该词汇作为一个分词结果,并将切分位置移动到下一个子句的起始位置。

这个过程重复进行,直到所有子句都被分词为止。

最大匹配算法的一个关键问题是如何确定最大切分长度。

t ikt o ke n使用了统计信息和机器学习的方法来动态地确定最佳的最大切分长度,以提高分词的准确性。

3.字典树字典树(Tr ie)是一种树状数据结构,它能够高效地存储和查找字符串。

ti kt ok en利用了字典树来储存中文词汇信息,以支持最大匹配算法的快速匹配过程。

字典树的每个节点代表一个字符,从根节点到叶节点的路径表示一个完整的词汇。

ti kt ok e n在分词过程中通过比对待切分句子的字符与字典树节点的字符,来确定最大匹配的词汇。

4. ti ktoken的运行过程t i kt ok en的运行过程可以概括为以下几个步骤:4.1构建字典树t i kt ok en首先从一个大型的中文词汇库中提取出所有的词汇,并构建字典树。

这个字典树将作为最大匹配算法的匹配模型。

4.2切分子句t i kt ok en将待切分的句子按照标点符号或其他符号进行划分,形成若干个子句。

每个子句都将作为最大匹配算法的输入。

4.3最大匹配对于每个子句,ti kt o ke n从起始位置开始,逐渐增大最大切分长度,利用字典树进行匹配。

自然语言处理(snownlp)算法

自然语言处理(snownlp)算法

自然语言处理(snownlp)算法
自然语言处理(SnowNLP)算法是一个面向中文自然语言处理任务的 Python 库,它包含了多种自然语言处理相关的算法,以下是一些核心功能所涉及的算法和技术:
1、分词:
SnowNLP 使用基于统计模型的分词方法,对输入的中文文本进行有效分词,将连续的汉字序列切分成一个个单独的词语。

2、词性标注:
虽然在描述中未明确提到词性标注,但很多中文 NLP 库包括了这项功能,即识别每个词在句子中的语法角色。

3、情感分析:
SnowNLP 实现了情感倾向分析算法,能够计算出一段文本的情感极性,通常返回的是一个介于0到1之间的浮点数,数值越接近1表示情感越积极,越接近0则表示越消极。

4、关键词抽取:
利用 TF-IDF 或者其他的文本摘要算法来提取文本的关键信息,找到最具代表性的关键词。

5、文本摘要:
提供文本摘要功能,可能采用基于权重或基于机器学习的方法,从原文中抽取出关键句子形成摘要。

6、拼音转换:
包含将汉字转换为拼音的功能,用于语音合成或其他需要拼音信息的应用场景。

7、繁简体转换:
支持简体与繁体中文之间的转换。

8、统计信息计算:
提供计算词频(Term Frequency, TF)和逆文档频率(Inverse Document Frequency, IDF)的能力,这两个指标常用于文本挖掘和信息检索领域的特征权
重计算。

这些算法的实现背后可能涉及到如最大熵模型、隐马尔可夫模型、TF-IDF、余弦相似度等多种统计学习和机器学习技术。

随着自然语言处理领域的发展,SnowNLP 库也在不断迭代更新以适应新的技术和需求。

如何使用自然语言处理技术进行关键词提取与自动摘要

如何使用自然语言处理技术进行关键词提取与自动摘要

如何使用自然语言处理技术进行关键词提取与自动摘要自然语言处理(NLP)技术在信息处理和文本分析领域具有广泛的应用,其中关键词提取和自动摘要是其中两个重要的任务。

本文将介绍如何使用自然语言处理技术进行关键词提取和自动摘要。

关键词提取是从一段文本中识别出最具代表性和关键性的单词或短语。

通过关键词提取,可以快速了解一篇文章的主题和重点。

下面是使用自然语言处理技术进行关键词提取的步骤:1. 文本预处理:首先,需要对输入文本进行预处理,包括去除HTML标签、特殊字符、停用词等。

预处理的目的是为了减少噪音和提高关键词提取的准确性。

2. 分词:将文本拆分成单词或短语,称为分词。

分词是关键词提取的基础步骤,可以使用现有的NLP工具或库进行分词,如NLTK、Stanford NLP等。

3. 词频统计:统计每个词在文本中出现的频率。

词频统计可以使用简单的计数方法,也可以使用TF-IDF(词频-逆文档频率)等方法进行加权。

4. 关键词提取算法:根据词频统计结果,使用合适的关键词提取算法从中筛选出最重要的关键词。

常用的算法包括基于词频的提取、基于TF-IDF的提取、基于文本主题模型(如LDA)的提取等。

使用以上步骤,可以实现基本的关键词提取。

然而,关键词提取只是通过统计方法提取出词频较高的词汇,无法完全准确地反映文本的主题和要点。

因此,接下来将介绍如何使用自然语言处理技术进行自动摘要。

自动摘要是从原文本中自动生成一个具有代表性和完整性的摘要段落。

下面是使用自然语言处理技术进行自动摘要的步骤:1. 文本预处理:同关键词提取一样,需要对输入文本进行预处理,去除噪音和停用词等。

2. 分句:将文本拆分成多个句子。

分句可以使用现有的NLP工具或库进行处理,如NLTK、Stanford NLP等。

3. 计算句子权重:根据句子中词汇的重要性(如词频、关键词重要性等),计算每个句子的权重。

常用的方法包括基于TF-IDF的权重计算、基于文本主题模型(如LDA)的权重计算等。

自然语言中的词法分析、语法分析、句法分析

⾃然语⾔中的词法分析、语法分析、句法分析1.词法分析词是⾃然语⾔中能够独⽴运⽤的最⼩单位,是⾃然语⾔处理的基本单位。

词法分析就是利⽤计算机对⾃然语⾔的形态 (morphology) 进⾏分析,判断词的结构和类别等。

词法分析的主要任务是:①:能正确的把⼀串连续的字符切分成⼀个⼀个的词②:能正确地判断每个词的词性,以便于后续的句法分析的实现。

常见的中⽂分词算法:(分为三类,1.基于字符串匹配(机械分词)的分词⽅法、2.基于理解的分词⽅法、3.基于统计的分词⽅法) 最⼤匹配法(正向、逆向) 1基于字符串匹配 基于词典的中⽂分词 1基于字符串匹配 基于标记法 约束矩阵法 句模切分法 神经⽹络分析算法 2.基于理解 基于统计语⾔模型(共现率) 3.基于统计 专家系统分词算法 常见分词项⽬: word分词 FudanNLP Paoding MMSEG4J jcseg ICTCLAS 智呈分词 MFSOU分词 SCWS jieba2.句法分析(语法分析)运⽤⾃然语⾔的句法和其他知识来确定组成输⼊句各成分功能。

对句⼦中的词语语法功能进⾏分析。

(每个词充当的⾓⾊,主语、谓语等)。

句法分析的基本任务是:确定句⼦的语法结构或句⼦中词汇之间的依存关系。

句法分析分为:句法结构分析和依存关系分析两种。

采⽤语法树来表⽰3.语义分析4.语⽤分析5.常见的术语: 未登录词:命名实体(⼈名、地名)、新词,专业术语称为未登录词。

也就是那些在分词词典中没有收录,但⼜确实能称为词的那些词。

npl中英文分词方法

npl中英文分词方法English:There are various methods for segmenting Chinese and English text in Natural Language Processing (NLP). For English, the most common method is to simply split the text based on spaces or punctuation marks. More advanced techniques include using Part-of-Speech (POS) tagging to identify word boundaries and compound words. For Chinese, the most common method is to use word segmentation algorithms such as the Maximum Match method, which involves matching the longest possible word from a dictionary, or the Bi-LSTM-CRF model, which is a neural network model specifically designed for Chinese word segmentation. Additionally, character-based word segmentation methods can also be used for Chinese text, where words are segmented based on constituent characters and language-specific rules.中文翻译:在自然语言处理(NLP)中,有多种方法可以对中文和英文文本进行分词处理。

npl自然语言处理

npl自然语言处理自然语言处理(Natural Language Processing,NLP)是一种人工智能技术,能够处理和分析人类语言的形式和含义。

这种技术涉及文本、语音和图像等各种形式的语言数据,并且在当前各种应用场景中都起到了重要作用,如语音识别、机器翻译、信息提取等等。

在本文中,我们将就NLP的主要技术和应用进行探讨。

1. 分词分词是NLP中的一个重要步骤,它将长篇的文本分成多个词组。

例如中文中的“我爱北京天安门”,分词后就变成了“我爱北京天安门”。

分词是其他NLP技术的基础,例如语义分析、情感分析等等。

2. 语义分析语义分析是一种用于理解句子或文本的意义的方法。

通过该技术,计算机可以判断文本的含义以及上下文中单词和短语的含义。

例如,“我想看电影”和“我想买电影票”这两个句子经过语义分析后,计算机可以理解它们的含义。

3. 情感分析情感分析是一种通过识别文本中的情感或情绪的方法。

它也被称作意见挖掘或者评价挖掘。

通过情感分析,计算机可以自动识别文本中的情感,如积极、消极或中立。

这种技术可应用于各种应用程序,如评论分析、舆情监测等等。

4. 机器翻译机器翻译是一种将一种语言翻译成另一种语言的技术。

借助NLP技术,计算机能够识别原始文本的语义,并将其翻译成另一种语言。

虽然机器翻译已经相当成熟,但对于一些长句子或者文化差异较大的内容,翻译的准确性还难以保证。

5. 信息提取信息提取是一种从文本中提取出特定信息的技术。

例如,从新闻文章中识别出地点、人名和组织名称等信息。

当这些信息被整齐地提取出来,就形成了一个知识库,这种知识库可以用于各种智能应用程序。

总之,在NLP技术的支撑下,计算机可以像人类一样处理自然语言。

NLP已经在许多实际应用中得到了广泛应用,如语音助手、智能客服、智能写作等。

通过不断的技术发展和精进,NLP在未来肯定将会发挥更多的作用。

nlp中常用文本分割方法

nlp中常用文本分割方法NLP中常用文本分割方法概述:在自然语言处理(Natural Language Processing, NLP)中,文本分割是将一段长文本拆分成短文本或子句的过程。

文本分割是NLP 任务的重要预处理步骤,它可以帮助我们更好地理解和处理文本数据。

本文将介绍NLP中常用的文本分割方法。

1. 句子分割(Sentence Segmentation):句子分割是将一段文字拆分成独立的句子的过程。

在英文中,句子通常以句号、问号或感叹号结尾。

常用的句子分割方法包括基于标点符号的分割和基于机器学习的分割。

基于标点符号的分割方法简单直观,但它不能处理缺失标点符号或带有省略号等情况。

而基于机器学习的方法则可以通过训练模型来识别句子边界,具有更好的鲁棒性。

2. 单词分割(Word Segmentation):单词分割是将一段连续的字符序列拆分成单个单词的过程。

在英文中,单词通常由空格或标点符号分隔。

然而,在一些语言中,如中文和日文,单词之间没有明显的间隔,因此需要通过分词算法来进行单词分割。

常用的分词算法包括基于规则的分词和基于统计的分词。

基于规则的分词方法使用预定义的规则和词典来进行分词,而基于统计的分词方法则通过训练模型来识别常见的词组和词汇。

3. 段落分割(Paragraph Segmentation):段落分割是将连续的文本拆分成独立的段落的过程。

在文本中,段落通常由空行或缩进符分隔。

段落分割可以帮助我们更好地理解文本的结构和组织。

常用的段落分割方法包括基于空行的分割和基于缩进的分割。

基于空行的分割方法将连续的空行作为段落的边界,而基于缩进的分割方法则通过检测段落中的缩进符来确定段落的边界。

4. 主题分割(Topic Segmentation):主题分割是将一段长文本拆分成具有相同主题或内容的子文本的过程。

主题分割可以帮助我们更好地理解文本的结构和内容。

常用的主题分割方法包括基于关键词的分割和基于机器学习的分割。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NLP基于最大概率的汉语切分Ytinrete要求:基于最大概率的汉语切分目标:采用最大概率法进行汉语切分。

其中:n-gram用bigram,平滑方法至少用Laplace平滑。

输入:接收一个文本,文本名称为:corpus_for_test.txt输出:切分结果文本,其中:切分表示:用一个字节的空格“”分隔,如:我们在学习。

每个标点符号都单算一个切分单元。

输出文件名为:学号.txtBigram参数训练语料:corpus_for_train.txt注:请严格按此格式输出,以便得到正确评测结果特别注意:代码雷同问题本次作业最后得分会综合考虑:切分性能、代码、文档等几个方面。

第三次作业上交的截止时间:2014 年1月7日24:001.关于最大概率分词基本思想是:一个待切分的汉字串可能包含多种分词结果,将其中概率最大的作为该字串的分词结果。

根据:由于语言的规律性,句子中前面出现的词对后面可能出现的词有很强的预示作用。

公式1:其中 w 表示词, s 表示待切分字符串。

公式2:例如:S :有意见分歧W1: 有/ 意见/ 分歧/W2: 有意/ 见/ 分歧/P(W1)=P(有)×P(意见)×P(分歧) =1.8*10-9P(W2)=P(有意)×P(见)×P(分歧) =1*10-11P(W1)> P(W2)所以选择 W1历史信息过长,计算存在困难p(wi|w1w2…wi-1)为了便于计算,通常考虑的历史不能太长,一般只考虑前面n-1个词构成的历史。

即: p(wi|wi-n+1…wi-1)1212(|)*()(|)()()()(,,...,)()*()*...*()i iP S W P W P W S P W P S P W P w w w P w P w P w =≈=≈n ()ii w P w =在语料库中的出现次数语料库中的总词数Nn-gramn 较大时:提供了更多的语境信息,语境更具区别性。

但是,参数个数多、计算代价大、训练语料需要多、参数估计不可靠。

n 较小时:语境信息少,不具区别性。

但是,参数个数少、计算代价小、训练语料,无需太多、参数估计可靠。

题目要求使用bigram,即考虑前一个词,即考虑左邻词。

左邻词假设对字串从左到右进行扫描,可以得到w1 ,w2 ,…,wi-1 wi,…等若干候选词,如果wi-1 的尾字跟wi 的首字邻接,就称wi-1 为wi 的左邻词。

比如上面例中,候选词“有”就是候选词“意见”的左邻词,“意见”和“见”都是“分歧”的左邻词。

字串最左边的词没有左邻词。

最佳左邻词如果某个候选词wi 有若干个左邻词wj ,wk ,…等等,其中累计概率最大的候选词称为wi 的最佳左邻词。

比如候选词“意见”只有一个左邻词“有”,因此,“有”同时也就是“意见”的最佳左邻词;候选词“分歧”有两个左邻词“意见”和“见”,其中“意见”的累计概率大于“见”累计概率,因此“意见”是“分歧”的最佳左邻词。

数据稀疏问若某n-gram在训练语料中没有出现,则该n-gram的概率必定是0。

解决的办法是扩大训练语料的规模。

但是无论怎样扩大训练语料,都不可能保证所有的词在训练语料中均出现。

由于训练样本不足而导致所估计的分布不可靠的问题,称为数据稀疏问题。

在NLP领域中,数据稀疏问题永远存在,不太可能有一个足够大的训练语料,因为语言中的大部分词都属于低频词。

解决办法: 平滑技术把在训练样本中出现过的事件的概率适当减小。

把减小得到的概率密度分配给训练语料中没有出现过的事件。

这个过程有时也称为discounting(减值)。

目前已经提出了很多数据平滑技术,如:Add-one 平滑Add-delta 平滑Witten-Bell平滑Good-Turing平滑Church-Gale平滑Jelinek-Mercer平滑Katz平滑这里我使用laplace平滑Add-one 平滑(Laplace’s law)规定任何一个n-gram在训练语料至少出现一次(即规定没有出现过的n-gram在训练语料中出现了一次)。

没有出现过的n-gram的概率不再是0。

2.算法描述1) 对一个待分词的字串S,按照从左到右的顺序取出全部候选词w1 ,w2 ,…,wi-1wi,…wn;2)到词典中查出每个候选词的概率值P(wi),当候选词没有出现时,由laplace平滑设其概率为1/(字典数+1),记录每个候选词的全部左邻词;3)按照公式1计算每个候选词的累计概率,同时比较得到每个候选词的最佳左邻词;4)如果当前wn是字串S的尾词,且累计概率P’(wn)最大,wn就是S的终点词。

5)从wn开始,按照从右到左的顺序,依次将每个词的最佳左邻词输出,即为S的分词结果。

3.程序设计整个程序我分为两个阶段,字典生成阶段和分词阶段。

(make_dic.cpp)字典生成:目标:输入为训练语料(corpus_for_train.txt),输出为字典(dic.txt),字典内容为单词和单词出现在字典中的频率,首行为词典总词数。

实现步骤:首先读入训练,通过空格和换行符作为判定,分出单个单词。

若单词没有在字典中出现,则将其加入字典,单词自身频数加一,单词总数加一;若单词在字典中出现,则单词自身频数加一。

将数据存入map中,然后再遍历map,创建一个输出流,输出为字典文件,数据为具体单词和他的出现概率(自身频数/单词总数)。

(zdgl_fenci.cpp)分词:目标:输入为字典和待切分语料(利用kill_space先将老师预先存好的待切分语料的空格和换行删去,成为为切分语料target.txt),输出为切分好的语料(2011211366.txt)。

实现步骤:首先在主函数中,循环取出待切分语料的每个句子,将句子传给分词子程序,分词子程序处理后返回分好的句子,将句子输出到文件,再取下一句,依次循环,直到处理完为止。

分词子程序,处理过程分为三步:1.将待切分的句子切成备选的切分词,并放在“单词池”中,切分标准参考一个假定的单词最大长度,程序里面我设置成20,也就是单词最长10个汉字(可以根据词典来决定),具体切分我考虑了两种,不同之处体现在对取到的单词(从一个汉字到10个汉字遍历地取),若不出现在词典中(出现在词典中的肯定会列入),第一种做法是只保留单个汉字形成的单词,另一种做法是保留全部的可能性。

若采取第一种则效率会有很大的提高,但理论上会降低准确性,第二种虽然能够考虑到所有的情况,但是数据往往是前一种的几十倍,而且对于句子中很多单词都有在词典时,分词结果几乎和前一种相同,如果句子中的所有词都能在词典中时,分词结果就一样了(laplace平滑使得未出现的概率是最低的,乘积也会最低,所以不会选择未出现的词),但会多出几十倍的运算。

两种的代码我都写出来了,考虑实际,我觉得第一种比较妥当,第二种我注释起来。

2.对“单词池”操作,通过循环的遍历,直到计算出所有的最佳左邻词。

3.在“单词池”中找出所有的句尾词,找到概率最大的,再通过左邻词,往回找,直到找到句头词,将这些词用空格分开,返回。

4.程序源码:1.kill_space.cpp将待切分文本corpus_for_test.txt变成不含空格和换行的待切分文本target.txt#include<iostream>#include<fstream>#include<map>#include<string>/*Name: 删除空格Description: 删除空格*/using namespace std;int main(){FILE *f_in, *f_out;//输入输出文件char ch;f_in=fopen("corpus_for_test.txt", "r");f_out=fopen("target.txt", "w");ch=getc(f_in);while(EOF!=ch){if(' '!=ch&&'\n'!=ch)putc(ch, f_out);ch=getc(f_in);}return 0;}2.make_dic.cpp读入训练预料corpus_for_train.txt输出词典文件dic.txt#include<iostream>#include<stdio.h>#include<fstream>#include<map>#include<string>using namespace std;const char *train_text = "corpus_for_train.txt";//训练文件const char *dic_text = "dic.txt";//输出词典文件map <string, int> dic;//词典表map <string, int>::iterator dic_it;//map<string, double> dic_in_text;//testint main(){FILE *f_in;f_in=fopen(train_text, "r");ofstream f_out(dic_text);double rate=0;int count=0;char ch;string word;ch=fgetc(f_in);while(EOF!=ch){if(' '!=ch&&'\n'!=ch)//词的一部分{word.append(1, ch);if("。

"==word)word.clear();}else//单词结束{if(" "==word||0==word.size()){word.clear();ch=fgetc(f_in);continue;}dic_it=dic.find(word);if(dic_it!=dic.end()){//找到dic_it->second=dic_it->second+1;word.clear();}else{//新单词count++;dic.insert(pair<string,int>(word,1));word.clear();}}ch=fgetc(f_in);// if('\n'==ch)//吸收换行// ch=fgetc(f_in);}f_out<<count<<endl;dic_it=dic.begin();while(dic_it!=dic.end()){f_out<<dic_it->first<<endl;rate=(double)(dic_it->second)/count;f_out<<rate<<endl;dic_it++;}f_out.close();fclose(f_in);/*测试用ifstream );int count_text;file>>count_text;string word_text;double rate_text;for(int i=0; i<count_text; i++){file>>word_text;file>>rate_text;dic_in_text.insert(pair<string,double>(word_text,rate_text));}();*/return 0;}3.zdgl_fenci.cpp读入词典dic.txt和带切分文本target.txt输出分词结果2011211366.txt#include<iostream>#include<stdio.h>#include<fstream>#include<map>#include<string>#include<vector>#include<stack>using namespace std;const char *target = "target.txt";//输入文件const char *out_put= "2011211366.txt";//输出文件const char *dic_text = "dic.txt";//输入词典文件const int max_word=20;//假设一个词最长包括10个汉字double laplace ;//laplace平滑map<string, double> dic;//词典map <string, double>::iterator dic_it;typedef struct word_pre//单词池内元素{int num;//标记int p_begin;//起始位置int p_end;//结束位置double word_rate;//单词本身概率double plus_rate;//单词累进概率int best;//最佳左邻词string this_word;//词本身}word_pre;void dic_init_test(void)//测试用{int count_text=10000000;laplace = (double)1/(count_text+1);dic.insert(pair<string,double>("有",0.018));dic.insert(pair<string,double>("有意",0.0005));dic.insert(pair<string,double>("意见",0.001));dic.insert(pair<string,double>("见",0.0002));dic.insert(pair<string,double>("分歧",0.0001)); }void dic_init(void)//初始化词典{ifstream );int count_text;file>>count_text;laplace = (double)1/(count_text+1);string word_text;double rate_text;for(int i=0; i<count_text; i++){file>>word_text;file>>rate_text;dic.insert(pair<string,double>(word_text,rate_text));}();}string zdgl_fenci(string sentance)//最大概率分词,输入为不带“。

相关文档
最新文档