分词问题

题目:

给定字符串,以及一个字典,判断字符串是否能够拆分为 字典中的单词。例如:字典为{Hello,World},给定字符串为HelloHelloWorld,则可以拆分为Hello,Hello,World,都是字典中的单词。

分析:

这样的题目叫做“分词问题”,有点勉强。只是这是自然语言处理,搜索引擎领域中,非常基础的一个问题,解决的方法比较多,相对也比较熟悉,但这仍旧是一个值的探索的问题。那我们从简单的题目入手,看看如何处理题目中的问题。最直接的思路就是递归,很简单,我们考虑每一个前缀,是否在字典中?如果在,则递归剩下的字串,如果不在,则考虑其他前缀。

public boolean wordBreak(String str)
    {
        int size = str.length();
        if(size == 0)
            return true;
        //考虑所有的前缀
        for(int i=1;i <= size;i++)
        {
            //如果前缀在字典中,则递归处理后缀
            if(trie.fullMatch(str.substring(0, i)) && wordBreak(str.substring(i,size)))
                return true;
        }
        return false;
    }

在上面的代码中,每一种情况都要处理字串,程序耗时较长,不可接受。那么如何改进呢?

答案是:在递归子问题中,找重复子问题。这个题的重复子问题很明显:如下图表示。

所以,通过动态规划的方法,可以有较大的幅度提升。用一个二重循环,时间复杂度能够提升到O(n2)。

//优化的分词问题动态规划求解

    public boolean wordBreakDP(String str)
    {
        int size = str.length();
        if(size == 0)
            return true;
        //如果字串sub(0,i)能够分词,则wb[i] = true
        boolean [] wb = new boolean [size+1];
        for(int i=0;i<size + 1;i++)
        {
            wb[i] = false;
        }
        for(int i = 1; i <= size ;i++)
        {

            if(wb[i] == false && trie.fullMatch(str.substring(0,i)))
            {
                wb[i] = true;
            }
            if(wb[i] == true)
            {
                if(i == size)
                {
                    return true;
                }
                for(int j = i+1;j<=size;j++)
                {
                    if(wb[j] == false && trie.fullMatch(str.substring(i,j)))
                    {
                        wb[j] = true;
                    }
                    if(j == size && wb[j] == true)
                    {
                        return true;
                    }
                }
            }
        }
        return false;
    }

除了上述两个方法以外,这个问题的解法有很多!

时间: 2024-10-09 13:06:33

分词问题的相关文章

lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter

分词器的核心类: Analyzer:分词器 TokenStream: 分词器做好处理之后得到的一个流.这个流中存储了分词的各种信息,可以通过TokenStream有效的获取到分词单元. 以下是把文件流转换成分词流(TokenStream)的过程 首先,通过Tokenizer来进行分词,不同分词器有着不同的Tokenzier,Tokenzier分完词后,通过TokenFilter对已经分好词的数据进行过滤,比如停止词.过滤完之后,把所有的数据组合成一个TokenStream:以下这图就是把一个re

PHP中文分词扩展 SCWS

1.scws简介 SCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统). 这是一套基于词频词典的机械式中文分词引擎,它能将一整段的中文文本基本正确地切分成词. 词是中文的最小语素单位,但在书写时并不像英语会在词之间用空格分开, 所以如何准确并快速分词一直是中文分词的攻关难点. SCWS 采用纯 C 语言开发,不依赖任何外部库函数,可直接使用动态链接库嵌入应用程序, 支持的中文编码包括 GBK.UTF-8 等.此外还提供了 PHP 扩

Elasticsearch安装中文分词插件ik

Elasticsearch默认提供的分词器,会把每个汉字分开,而不是我们想要的根据关键词来分词.例如: curl -XPOST "http://localhost:9200/userinfo/_analyze?analyzer=standard&pretty=true&text=我是中国人" 我们会得到这样的结果: { tokens: [ { token: text start_offset: 2 end_offset: 6 type: <ALPHANUM>

中文分词实践(基于R语言)

背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来,然后做中文分词+词频统计,最后将统计结果简单做个标签云,效果如下: 后续:中文分词是中文信息处理的基础,分词之后,其实还有特别多有趣的文本挖掘工作可以做,也是个知识发现的过程,以后有机会再学习下. ================================================== * 中文分词常用实现: 单机:R语言+Rwordseg分词包 (建议数据量<1G) 分布式:Hadoop+Smallse

中文分词之结巴分词~~~附使用场景+demo

常用技能(更新ing):http://www.cnblogs.com/dunitian/p/4822808.html#skill 技能总纲(更新ing):http://www.cnblogs.com/dunitian/p/5493793.html 在线演示:http://cppjieba-webdemo.herokuapp.com 完整demo:https://github.com/dunitian/TempCode/tree/master/2016-09-05 先说下注意点,结巴分词他没有对分

IK分词器 整合solr4.7 含同义词、切分词、停止词

IK分词器如果配置成 <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/> <analyzer type="query" is

NLP之CRF分词训练(六)

分三步1.先分词2.做BEMS标注,同时做词性标注3.训练模型 1.对语料进行分词 拿到测试部的语料或者其他渠道的语料,先对语料进行分词,我刚刚开始是用NS分词的,等CRF模型训练好后,可以直接用CRF进行分词,分完词后要人工核对分词结果,将分词分得不正确的地方修改好 2.标注词性,标注BEMS BEMS所说是中科院的提出一种标注,也有说BEIS的,hanlp用的是BEMSB:开始E:结束M/I:中间 S:单独BEMS标注已经写了一个方法generateCRF在SegAndSave.class中

python jieba分词工具

源码地址:https://github.com/fxsjy/jieba 演示地址:http://jiebademo.ap01.aws.af.cm/ 特点 1,支持三种分词模式: a,精确模式,试图将句子最精确地切开,适合文本分析:     b,全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义:     c,搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词. 2,支持繁体分词 3,支持自定义词典 安装 1,Python 2.x 下的安

php+中文分词scws+sphinx+mysql打造千万级数据全文搜索

Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎.意图为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能.Sphinx可以非常容易的与SQL数据库和脚本语言集成.当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据.Sphinx创建索引的速度为:创建100万条记录的索引只需3-4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒.Sphinx的

.NET Core中文分词组件jieba.NET Core

特点 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析: 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义.具体来说,分词过程不会借助于词频查找最大概率路径,亦不会使用HMM: 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词. 支持繁体分词 支持添加自定义词典和自定义词 jieba.NET Core 用法 下载代码使用VS 2017 打开,或者使用VS Code 打开项目. 选择jieba.NET 为起始项目,P