iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现简易的分词器功能
  • 224
分享到

Java实现简易的分词器功能

2024-04-02 19:04:59 224人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

业务需求: 生活中常见的搜索功能大概可分为以下几类: 单关键词。如“Notebook” 双关键词加空格。如“Super Notebook” 多关键词加多空格

业务需求:

生活中常见的搜索功能大概可分为以下几类:

  • 单关键词。如“Notebook”
  • 双关键词加空格。如“Super Notebook”
  • 多关键词加多空格。如“Intel Super Notebook”

当然,还有四甚至五关键词,这些搜索场景在生活中可以用罕见来形容,不在我们的讨论范围。我们今天就以上三种生活中最常见的搜索形式进行探讨分析。业务需求也很简单,假设我们要完成一个搜索功能,业务层、持久层、控制层不在我们讨论的范围,仅讨论分词功能如何实现。

分析:

假设用户键入的搜索内容为以下内容:


Intel Super Notebook

我们可以利用Java中String强大而丰富的方法来慢慢拼凑一个小算法来达到目的。String中大多数方法的参数和返回值都与下标相关,那么,分析上述语句的下标,我们可发现如下内容:

在这里插入图片描述

上述内容红色是我们分词的关键内容。对于一个语句而言(不是语言学上通俗的语句,因为该句没有主谓宾),重要的就是各单词或词组的首字母下标与该单词或词组后面最近一个空格。我们发现,Intel这个单词首字母下标为0,距离该单词后面最近的一个空格下标为5;Super首字母下标为距离该单词前面最近的一个空格的下标加1,也就是6;Notebook首字母下标为距离该单词前面最近的一个空格的下标加1,也就是12;最后就是该语句的尾下标,也就是19。

当然,实际情况会有用户多输入了两个甚至三个空格在某两个单词之间,例如如下形式:


Intel  Super  Notebook

(注意这里的空格为每个单词之间为2个)

这个问题很容易解决,我们把两个或三个空格替换为一个空格即可(为什么不是四个或者更多?因为现实情况是用户不太可能在各个单词之间连按多个空格),如下:


sentence = sentence.replace("  ", " ");
sentence = sentence.replace("   ", " ");

这样以来语句中就只存在单个空格了。

经过分析我们得知,若想对一个语句进行分词,就必须知道各个单词的起始下标才行。起始下标可以由空格的下标得知,那我们该如何得知空格的下标?

很简单,我们写个方法,通过迭代语句的每个单词,判断其是否存在空格即可。方法如下:


private int firstPosition(){
	int first = 0;
	for(int i = 0; i < sentence.length(); i++){
		if(String.valueOf(sentence.charAt(i)).equals(" ")){
			first = i;
			return first;
		}	
	}
	return first;
}

这个方法的作用是判断一个语句中第一个空格的位置。既然有第一个了,肯定要有第二个了。要注意第一个内容是从0开始进行迭代,而第二个空格的判断方法要从第一个空格的位置加1开始,否则迭代的刚好还是第一个空格的位置。内容如下:


private int secondPosition(){
		int second = 0;
		for(int i = (firstPosition() + 1); i < sentence.length(); i++){
			if(String.valueOf(sentence.charAt(i)).equals(" ")){
				second = i;
				return second;
			}	
		}
		return second;
	}

第三个为什么不迭代?因为第三个单词之后就没有空格了,就到结尾了。

找出每个空格的下标索引后,我们还需知道语句中含有多少个空格,是没有,还是1个或2个(连续的重复空格在上文已经被替换为单个空格了)。方法如下:


private int countBlank(String s){
	// Store single blank signal.
	int amount = 0;

	// If s contains single blank signal, and it will increse amount's value of 1 every loop times.
	for(int i = 0; i < s.length(); i++){
		if(String.valueOf(sentence.charAt(i)).equals(" ")){
			amount++;
		}
	}
	return amount;
}

拿到了空格的总个数及每个空格的下标,我们就可以写个方法进行分割了。由于我是采用了泛型集合作为数据源,这里的方法返回类型就为void。

我们先假设输入的仅有以下内容:


Intel

输入的仅有一个词组。我们先判断其空格的个数,发现为0,那么也不用进行什么操作了,直接添加其作为集合的数据。


public void divide(){
		// Record every single blank signal's position.
		int position1 = firstPosition();
		int position2 = secondPosition();
		
		if(sentence.contains(" ")){

		} else{
        	Words.add(sentence);
     	}
		
	}

现在情况变为输入的内容如下:


Intel Super

我们知道了这个语句共有一个空格,下标为5,长度为11,那可以这样判断:是否包含空格,如果是,那就判断其空格数是否大于等于0,如果为真,就添加到数据源。接着判断其空格数是否大于等于1,如果真,进入下一层判断其空格数是否大于等于1其小于2,如果真,就添加到数据源。内容如下:


public void divide(){
		// Record every single blank signal's position.
		int position1 = firstPosition();
		int position2 = secondPosition();
		
		if(sentence.contains(" ")){
			int blankAmount = countBlank(sentence);
			if (blankAmount >= 0) {
				words.add(sentence.substring(0, position1));
				if (blankAmount >= 1) {
					if(blankAmount >= 1 && blankAmount < 2)));
						words.add(sentence.substring(position1, sentence.length()));
					} else {

					}
	
				} 
				
			}
		} else{
        	words.add(sentence);
     	}
	}

下面就是较为全面的情况了:


Intel Super Notebook

我们判断完两个情况就看第三个情况。第三个单词其获取是通过第二个空格下标与语句长度得来。但第二个单词就要改为第一个空格下标加1与第二个空格下标加1了。那么至此分割方法也就完成了:


public String divide(){
	// Record every single blank signal's position.
	int position1 = firstPosition();
	int position2 = secondPosition();
	
	if(sentence.contains(" ")){
		int blankAmount = countBlank(sentence);
		if (blankAmount >= 0) {
			words.add(sentence.substring(0, position1));
			if (blankAmount >= 1) {
				if(blankAmount >= 1 && blankAmount < 2){
					words.add(sentence.substring(position1, sentence.length()));
				} else {
					words.add(sentence.substring(position1, position2));
					if (blankAmount >= 2) {
						words.add(sentence.substring(position2, sentence.length()));
					}
				}

			} 
			
		}
	} else{
        	words.add(sentence);
     	}
	
}

测试


Intel Super Notebook

SIZE:3
POSITION(0): Intel
POSITION(1): Super
POSITION(2): Notebook


Intel   Super   Notebook

(注这里有重复且连续的空格)
SIZE:3
POSITION(0): Intel
POSITION(1): Super
POSITION(2): Notebook

英特尔 超级  笔记

SIZE:3
POSITION(0): 英特尔
POSITION(1): 超级
POSITION(2): 笔记本

华为

SIZE:1
POSITION(0): 华为

完整代码:


class DivideWord{
	
	private String sentence;
	private List<String> words = new ArrayList<String>();

	public DivideWord(String sentence) {
		// Replace two or three blank signal that connected into single blank signal.
		sentence = sentence.replace("  ", " ");
		sentence = sentence.replace("   ", " ");
		this.sentence = sentence;
	}
	
	private int countBlank(String s){
		// Store single blank signal.
		int amount = 0;

		// If s contains single blank signal, and it will increse amount's value of 1 every loop times.
		for(int i = 0; i < s.length(); i++){
			if(String.valueOf(sentence.charAt(i)).equals(" ")){
				amount++;
			}
		}
		return amount;
	}
	
	private int firstPosition(){
		int first = 0;
		for(int i = 0; i < sentence.length(); i++){
			if(String.valueOf(sentence.charAt(i)).equals(" ")){
				first = i;
				return first;
			}	
		}
		return first;
	}
	
	private int secondPosition(){
		int second = 0;
		for(int i = (firstPosition() + 1); i < sentence.length(); i++){
			if(String.valueOf(sentence.charAt(i)).equals(" ")){
				second = i;
				return second;
			}	
		}
		return second;
	}
	
	public String divide(){
		// Record every single blank signal's position.
		int position1 = firstPosition();
		int position2 = secondPosition();
		
		if(sentence.contains(" ")){
			int blankAmount = countBlank(sentence);
			if (blankAmount >= 0) {
				words.add(sentence.substring(0, position1));
				if (blankAmount >= 1) {
					if(blankAmount >= 1 && blankAmount < 2){
						words.add(sentence.substring(position1, sentence.length()));
					} else {
						words.add(sentence.substring(position1, position2));
						if (blankAmount >= 2) {
							words.add(sentence.substring(position2, sentence.length()));
						}
					}
	
				} 
				
			}
		} else{
        	words.add(sentence);
     	}
	}
	
	public int getSize(){
		return words.size();
	}
	
	public String getWord(int position){
		return words.get(position);
	}
}

public class DateGet {
	public static void main(String[] args){
		DivideWord divideWord = new DivideWord("英特尔");
		divideWord.divide();
		System.out.println("SIZE:" + divideWord.getSize());
		System.out.println("POSITION :" + divideWord.getWord(0));
		
	}
}

到此这篇关于Java实现简易的分词器功能的文章就介绍到这了,更多相关Java分词器功能内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实现简易的分词器功能

本文链接: https://www.lsjlt.com/news/128243.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现简易的分词器功能
    业务需求: 生活中常见的搜索功能大概可分为以下几类: 单关键词。如“Notebook” 双关键词加空格。如“Super Notebook” 多关键词加多空格...
    99+
    2024-04-02
  • java实现简易聊天功能
    本文实例为大家分享了java实现简易聊天功能的具体代码,供大家参考,具体内容如下 应用客户端和服务端通过控制台的输入输出实现简易聊天功能 思路: 1.创建服务端类ChatServer...
    99+
    2024-04-02
  • java方法实现简易ATM功能
    用java方法写简易ATM,供大家参考,具体内容如下 本文需求:用java写一个简易ATM 功能:有登陆,有查询资金功能,有存款功能,有取款功能,有转账功能,有退出; 简述: (ja...
    99+
    2024-04-02
  • Java利用栈实现简易计算器功能
    利用栈实现一个简易计算器(Java实现),供大家参考,具体内容如下 一、思路分析 当我们输入一个类似于“7*2+100-5+3-4/2”的简单中缀表达式时,我...
    99+
    2024-04-02
  • vue实现简易的计算器功能
    本文实例为大家分享了vue实现简易计算器功能的具体代码,供大家参考,具体内容如下 实现功能:将两个输入框中的值进行加减乘除计算 用到的知识点: 1.v-model数据双向绑定 2. ...
    99+
    2024-04-02
  • Androidstudio实现简易的计算器功能
    本文实例为大家分享了android studio简易运算器,供大家参考,具体内容如下 JAVA语句代码块: package com.example.douyingming; im...
    99+
    2024-04-02
  • javascript实现简易的计算器功能
    本文实例为大家分享了javascript实现简易的计算器的具体代码,供大家参考,具体内容如下 javascript实现简易计算器,只有两个input输入框,简单实现加减乘除: <...
    99+
    2024-04-02
  • Java实现简易的洗牌和发牌功能
    目录代码思路代码实现Poker的Java文件抽象出一张扑克牌Game的Java文件实现洗牌跟发牌功能创建一副扑克牌洗牌发牌整体功能实现在日常生活中,想必大家都玩过或者听过斗地主吧,斗...
    99+
    2023-05-15
    Java 洗牌 Java 发牌
  • python实现简易计算器功能
    本文实例为大家分享了python实现简易计算器功能的具体代码,供大家参考,具体内容如下 一、功能目标 用户输入一个类似  1-2*((60-30+(-40/5)*(9-2*...
    99+
    2024-04-02
  • jQuery实现简易计算器功能
    jQuery制作一个简易计算器,供大家参考,具体内容如下 页面效果: 源码: <!DOCTYPE html> <html> <head>    ...
    99+
    2024-04-02
  • Pyqt实现简易计算器功能
    本文实例为大家分享了Pyqt实现简易计算器的具体代码,供大家参考,具体内容如下 环境:pycharm、python3.7 首先用qtDesigner设计出如下界面。 再用pyUIC...
    99+
    2024-04-02
  • SpringMvc实现简易计算器功能
    用SpringMvc做一个简易计算器,供大家参考,具体内容如下 一 .domain类 package ssm1.domain; public class JiSuan {     ...
    99+
    2024-04-02
  • Android实现简易计算器功能
    本项目为大家分享了Android实现计算器功能的具体代码,供大家参考,具体内容如下 项目介绍 练手项目。能实现加减乘除及括号运算。 开发思路 界面布局  1.界面布...
    99+
    2024-04-02
  • js实现简易计数器功能
    本文实例为大家分享了js实现简易计数器功能的具体代码,供大家参考,具体内容如下 实现简易计数器 可进行三个操作,开始计数,暂停计数,复位操作 (使用计时函数事件) <html&...
    99+
    2022-11-13
    js 计数器
  • Swift实现简易计算器功能
    用Swift写一个简单计算器的Demo,供大家参考,具体内容如下 实验环境: Xcode v6.4   & OS X Yosemite 10.10 功能描述: 1、...
    99+
    2024-04-02
  • C++实现简易计算器功能
    本文实例为大家分享了C++实现简易计算器功能的具体代码,供大家参考,具体内容如下 介绍 介绍:仅支持自然数间的+ - * /操作,并没有括号。 实现:利用栈实现存储运算数以及运算符。...
    99+
    2024-04-02
  • Android实现简易的闹钟功能
    本文实例为大家分享了Android实现简易的闹钟功能的具体代码,供大家参考,具体内容如下 主要是通过广播,实现一个闹钟的简易功能。 实现效果如下: 主界面为一个简易的设置闹钟Butt...
    99+
    2024-04-02
  • Android实现简易计算功能
    本文实例为大家分享了Android实现简易计算功能的具体代码,供大家参考,具体内容如下 效果如图: activity_main.xml <?xml version...
    99+
    2024-04-02
  • 用Java实现简易的洗牌和发牌功能
    在日常生活中,想必大家都玩过或者听过斗地主吧,斗地主大致分为三个过程:洗牌,发牌,玩家按照规则将手中的牌给打完,谁最先打完,谁就获胜。这听起来挺简单的,但是影响你胜利的因素有很多:洗牌,玩家的水平。在...
    99+
    2023-09-04
    java 开发语言 jvm
  • C#实现简易计算器小功能
    本文实例为大家分享了C#实现简易计算器小功能的具体代码,供大家参考,具体内容如下 简易的登陆界面。 具有幻灯片效果。(picturebox time控件)计算器支持多位数,小数,括...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作