JAVA做一个词频计算,怎么分组计算,希望有前端和后台

img


这是表

img


这是我想要前端展示结果

最好有代码我不怎么会写用的spring boot+maven

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int NOT NULL,
  `词汇` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `词汇总` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `浮点` double(255, 5) NOT NULL,
  `整数` int NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (1, 'for for ends', 'for for end', 1.20000, 1);
INSERT INTO `test` VALUES (2, 'fors for end', 'for for end', 2.40000, 2);
INSERT INTO `test` VALUES (3, 'ands for end', 'and for end', 1.20000, 3);
INSERT INTO `test` VALUES (4, 'and for end', 'and for end', 3.60000, 2);
INSERT INTO `test` VALUES (5, 'for and end ', 'for and end', 3.50000, 6);

SET FOREIGN_KEY_CHECKS = 1;

直接上代码
1.前端页面效果

img


2.前端html代码

<!DOCTYPE html>
<html>
  <head>
    <title>mainfunction.html</title>
    <meta charset="UTF-8">
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="../assets/js/jquery.min.js"></script>
    <style>
        html,body{margin:0 auto;width:100%;height:100%;}
        .item:hover{border:1px solid #c0c0c0;}
    </style> 
  </head>
  <body>
    <div id="word" style="width:100%;height:20%;overflow-x:hidden;overflow-y:scroll;">单词</div>
    <div id="wordArray" style="width:100%;height:20%;overflow-x:hidden;overflow-y:scroll;margin-top:20px;"></div>
    <div id="wordList" style="width:100%;height:20%;overflow-x:hidden;overflow-y:scroll;margin-top:20px;"></div>
  </body>
</html>

3、js代码


<script>
        var serverUrl = "http://localhost:3885"
        $(function(){
            getTest();
        });        
        function getTest(){
        $.ajax({
             url: serverUrl+"/Test/getWordList",
            type: "POST",
            contentType: "application/json;charset=UTF-8", 
            async:false,
            timeout:5000,  //5s
            beforeSend:function(xhr){
                xhr.setRequestHeader("Authorization",window.localStorage.getItem("token"));
            },
            success: function(result){
                //alert(JSON.stringify(result.data));
                var rlt = result.data;
                var html = "<div style='width:100%;height:40px;line-height:40px;'>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;'>单词</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;'>浮点数</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;'>整数</div>"+
                           "</div>";
                for(var i=0;i<rlt.length;i++){
                    html += "<div class='item' style='width:100%;height:40px;line-height:40px;'>"+
                                "<div onclick='getWord(this)' style='display:inline;float:left;width:33%;text-align:center;height:40px;line-height:40px;'>"+rlt[i].keyword+"</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;height:40px;line-height:40px;'>"+rlt[i].floatNum+"</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;height:40px;line-height:40px;'>"+rlt[i].intNum+"</div>"+
                           "</div>";
                }
                $("#word").empty().append(html);
            },
            error:function(XMLHttpRequest, textStatus, errorThrown){
                alert("status:"+XMLHttpRequest.status+"\n readyState:"+XMLHttpRequest.readyState+"\n textStatus:"+textStatus);        
            }
       });
function getWord(that){
        var word = $(that).html();
        var uri = "word="+word;
        $.ajax({
             url: serverUrl+"/Test/getWord",
            type: "POST",
            //contentType: "application/json;charset=UTF-8", 
            contentType: 'application/x-www-form-urlencoded',
            async:false,
            //data: JSON.stringify({
            //      "word": word
            //    }),
            //datatype:"JSON",
            data:uri,
            timeout:5000,  //5s
            beforeSend:function(xhr){
                xhr.setRequestHeader("Authorization",window.localStorage.getItem("token"));
            },
            success: function(result){
                //alert(JSON.stringify(result.data));
                var rlt = result.data;
                var html = "<div style='width:100%;height:40px;line-height:40px;'>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;'>词汇总</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;'>浮点数</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;'>整数</div>"+
                           "</div>";
                for(var i=0;i<rlt.length;i++){
                    html += "<div class='item' style='width:100%;height:40px;line-height:40px;'>"+
                                "<div onclick='searchMultiWord(this)' style='display:inline;float:left;width:33%;text-align:center;height:40px;line-height:40px;'>"+rlt[i].keyword+"</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;height:40px;line-height:40px;'>"+rlt[i].floatNum+"</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;height:40px;line-height:40px;'>"+rlt[i].intNum+"</div>"+
                           "</div>";
                }
                $("#wordArray").empty().append(html);
            },
            error:function(XMLHttpRequest, textStatus, errorThrown){
                alert("status:"+XMLHttpRequest.status+"\n readyState:"+XMLHttpRequest.readyState+"\n textStatus:"+textStatus);        
            }
       });
    

function searchMultiWord(that){
        var word = $(that).html();
        var uri = "word="+word;
        $.ajax({
             url: serverUrl+"/Test/searchMultiWord",
            type: "POST",
            //contentType: "application/json;charset=UTF-8", 
            contentType: 'application/x-www-form-urlencoded',
            async:false,
            //data: JSON.stringify({
            //      "word": word
            //    }),
            //datatype:"JSON",
            data:uri,
            timeout:5000,  //5s
            beforeSend:function(xhr){
                xhr.setRequestHeader("Authorization",window.localStorage.getItem("token"));
            },
            success: function(result){
                //alert(JSON.stringify(result.data));
                var rlt = result.data;
                var html = "<div style='width:100%;height:40px;line-height:40px;'>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;'>词汇</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;'>浮点数</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;'>整数</div>"+
                           "</div>";
                for(var i=0;i<rlt.length;i++){
                    html += "<div class='item' style='width:100%;height:40px;line-height:40px;'>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;height:40px;line-height:40px;'>"+rlt[i].keyword+"</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;height:40px;line-height:40px;'>"+rlt[i].floatNum+"</div>"+
                                "<div style='display:inline;float:left;width:33%;text-align:center;height:40px;line-height:40px;'>"+rlt[i].intNum+"</div>"+
                           "</div>";
                }
                $("#wordList").empty().append(html);
            },
            error:function(XMLHttpRequest, textStatus, errorThrown){
                alert("status:"+XMLHttpRequest.status+"\n readyState:"+XMLHttpRequest.readyState+"\n textStatus:"+textStatus);        
            }
       });
    }
    </script>

4、Java后台代码


/***************************************************************
     * 功能:从数据库搜索所有词汇、词汇总,检索出单词,相同单词累加“浮点数”和“整数”
     * 
     * */
    @Override
    public List<TestAnalysis> getWordList() {
        // TODO Auto-generated method stub
        List<Test>  testList = testMapper.findAll();
        List<TestAnalysis> anaList = new ArrayList<>();
        List<String> wordList = new ArrayList<>();
        for(Test one:testList) {
            //判断已添加的数据中,是否有该单词
            String[] words = one.get词汇().split(" ");
            for(int i=0;i<words.length;i++) {
                //处理以"s"结尾的单词
                String currentWord = words[i];
                if(currentWord.endsWith("s")) {
                    currentWord = currentWord.substring(0, (currentWord.length()-1));
                }
                if((wordList.size()!=0) && (wordList.contains(currentWord))) {
                    //在anaList,查找KeyWord等于words[i]的元素,累计"浮点数"和“整数”
                    TestAnalysis newRcd = new TestAnalysis();
                    TestAnalysis oldRcd = new TestAnalysis();
                    for(TestAnalysis rcd:anaList) {
                        if(rcd.getKeyword().equals(currentWord)) {                            
                            newRcd.setKeyword(currentWord);
                            newRcd.setFloatNum(((rcd.getFloatNum()*100000+one.get浮点()*100000))/100000);
                            newRcd.setIntNum(rcd.getIntNum()+one.get整数());
                            //预备删除元素赋值,在遍历外进行删除;
                            oldRcd = rcd;
                        }                        
                    }
                    //anaList中,删除老元素,添加新元素;
                    anaList.remove(oldRcd);
                    anaList.add(newRcd);
                }else {
                    //定义新的TestAnalysis,赋值KeyWord、"浮点数"、“整数”,添加 anaList、添加KeyWord进入wordList
                    TestAnalysis record = new TestAnalysis();
                    record.setKeyword(currentWord);
                    record.setFloatNum(one.get浮点());
                    record.setIntNum(one.get整数());
                    anaList.add(record);
                    wordList.add(currentWord);
                }
            }
String[] words1 = one.get词汇总().split(" ");
            for(int i=0;i<words1.length;i++) {
                String currentWord2 = words1[i];
                //处理以"s"结尾的单词
                if(currentWord2.endsWith("s")) {
                    currentWord2 = currentWord2.substring(0, (currentWord2.length()-1));
                }
                if((wordList.size()!=0) && (wordList.contains(currentWord2))) {
                    //在anaList,查找KeyWord等于words[i]的元素,累计"浮点数"和“整数”
                    TestAnalysis newRcd = new TestAnalysis();
                    TestAnalysis oldRcd = new TestAnalysis();
                    for(TestAnalysis rcd:anaList) {
                        if(rcd.getKeyword().equals(currentWord2)) {                            
                            newRcd.setKeyword(currentWord2);
                            newRcd.setFloatNum(((rcd.getFloatNum()*100000+one.get浮点()*100000))/100000);
                            newRcd.setIntNum(rcd.getIntNum()+one.get整数());
                            //预备删除元素赋值,在遍历外进行删除;
                            oldRcd = rcd;
                        }                        
                    }
                    //anaList中,删除老元素,添加新元素;
                    anaList.remove(oldRcd);
                    anaList.add(newRcd);
                }else {
                    //定义新的TestAnalysis,赋值KeyWord、"浮点数"、“整数”,添加 anaList、添加KeyWord进入wordList
                    TestAnalysis record = new TestAnalysis();
                    record.setKeyword(currentWord2);
                    record.setFloatNum(one.get浮点());
                    record.setIntNum(one.get整数());
                    anaList.add(record);
                    wordList.add(currentWord2);
                }
            }
        }
        return anaList;
    }

/***************************************************************
     * 功能:从数据库搜索所有词汇、词汇总,检索是否含有我word,含有累加“浮点数”和“整数”
     * 
     * */
    @Override
    public List<TestAnalysis> getWord(String word) {
        // TODO Auto-generated method stub
        List<Test>  testList = testMapper.findAll();
        List<TestAnalysis> anaList = new ArrayList<>();
        
        List<String> wordList = new ArrayList<>();
        for(Test one:testList) {                        
            String[] words1 = one.get词汇总().split(" ");
            for(int i=0;i<words1.length;i++) {
                String currentWord2 = words1[i];
                //处理以"s"结尾的单词
                if(currentWord2.endsWith("s")) {   //以s结尾的单词需要再处理,此处只处理单词后面增加s的情况
                    currentWord2 = currentWord2.substring(0, (currentWord2.length()-1));
                }
                //词汇总中,只要含有word,就添加anaList、wordList
                if(currentWord2.equals(word)) {
                    if(!wordList.contains(one.get词汇总())) {
                        wordList.add(one.get词汇总());
                        
                        TestAnalysis record = new TestAnalysis();
                        record.setKeyword(one.get词汇总());
                        record.setFloatNum(one.get浮点());
                        record.setIntNum(one.get整数());
                        anaList.add(record);
                        wordList.add(currentWord2);
                    }else {
                        
                        TestAnalysis newRcd = new TestAnalysis();
                        TestAnalysis oldRcd = new TestAnalysis();
                        for(TestAnalysis rcd:anaList) {
                            if(rcd.getKeyword().equals(one.get词汇总())) {                            
                                newRcd.setKeyword(one.get词汇总());
                                newRcd.setFloatNum(((rcd.getFloatNum()*100000+one.get浮点()*100000))/100000);
                                newRcd.setIntNum(rcd.getIntNum()+one.get整数());
                                //预备删除元素赋值,在遍历外进行删除;
                                oldRcd = rcd;
                            }                        
                        }
                        //anaList中,删除老元素,添加新元素;
                        anaList.remove(oldRcd);
                        anaList.add(newRcd);
                    }                    
                }                
            }
        }
        return anaList;
    }

/***************************************************************
     * 功能:从数据库搜索所有词汇检索词汇总中字符出,含有累加“浮点数”和“整数”
     * 
     * */
    @Override
    public List<TestAnalysis> searchMultiWord(String word) {
        // TODO Auto-generated method stub
        List<Test>  testList = testMapper.findAll();
        List<TestAnalysis> anaList = new ArrayList<>();        
        List<String> wordList = new ArrayList<>();
        for(Test one:testList) {                        
            //String[] words1 = one.get词汇().split(" ");
            //1、直接比较两个字符串是否相等
            String CH = one.get词汇().trim();
            //2、删除“词汇”列中每个单词的末尾“s”,是否相等
            String CHdeleteS = one.get词汇().replace("s ", " ").trim();
            //3、同时删除“词汇”和“词汇中”每个单词的的末尾“s”,是否相等
            String worddeleteS = word.replace("s ", " ").trim();
            System.out.println("CHdeleteS:"+CHdeleteS);
            if((CH.equals(word))||CHdeleteS.equals(word)||CHdeleteS.equals(worddeleteS)) {
                if(!wordList.contains(one.get词汇())) {
                    wordList.add(one.get词汇());                    
                    TestAnalysis record = new TestAnalysis();
                    record.setKeyword(one.get词汇());
                    record.setFloatNum(one.get浮点());
                    record.setIntNum(one.get整数());
                    anaList.add(record);
                }else {
                    TestAnalysis newRcd = new TestAnalysis();
                    TestAnalysis oldRcd = new TestAnalysis();
                    for(TestAnalysis rcd:anaList) {
                        if(rcd.getKeyword().equals(one.get词汇())) {                            
                            newRcd.setKeyword(one.get词汇());
                            newRcd.setFloatNum(((rcd.getFloatNum()*100000+one.get浮点()*100000))/100000);
                            newRcd.setIntNum(rcd.getIntNum()+one.get整数());
                            //预备删除元素赋值,在遍历外进行删除;
                            oldRcd = rcd;
                        }                        
                    }
                    //anaList中,删除老元素,添加新元素;
                    anaList.remove(oldRcd);
                    anaList.add(newRcd);
                }                
            }            
        }
        return anaList;
    }

你的描述太不清晰了吧,没看懂这里点击展开是什么意思

img

参考gpt:
结合自己分析给你如下建议:
前端:您可以使用一些前端框架,如Vue.js、React.js、Angular.js等,来构建一个用户界面,让用户可以输入或上传文本,并显示词频的结果。
后台:您可以使用一些后台语言,如Python、Java、PHP等,来编写一个词频统计的程序,接收用户的文本,并对其进行分词、清洗、统计等操作,然后返回词频的结果。
为了帮助您更好地理解,我为您提供了一个用Python实现词频统计的简单代码,如下:

导入分词库
import jieba
定义一个词频统计的函数
def word_count(text): # 对文本进行分词 words = jieba.lcut(text) # 创建一个空字典,用于存储词频 counts = {} # 遍历分词结果,统计每个词出现的次数 for word in words: # 如果词长度大于1,并且不是停用词,则进行统计 if len(word) > 1 and word not in stop_words: # 如果字典中已经有这个词,则次数加一 if word in counts: counts[word] += 1 # 如果字典中没有这个词,则添加这个词,并将次数设为一 else: counts[word] = 1 # 返回字典类型的词频结果 return counts

定义一个停用词列表,用于过滤无意义的词
stop_words = [“的”, “了”, “是”, “我”, “你”, “他”, “她”, “它”, “我们”, “你们”, “他们”, “她们”, “它们”]

定义一个测试文本
text = “我爱北京天安门,天安门上太阳升。”

调用函数,得到词频结果
counts = word_count(text)

按照词频降序排序,并打印前十个高频词
sorted_counts = sorted(counts.items(), key=lambda x: x1, reverse=True) for i in range(10): word, count = sorted_counts[i] print(f"{word}: {count}")

要实现词频的统计,您可以使用Java编写后台代码来处理数据库中的数据,然后使用前端来展示结果。以下是一个基本的示例,展示了如何使用Java和Spring Boot作为后台,以及HTML和JavaScript作为前端来实现您的需求。

首先,您需要创建一个Spring Boot项目,并配置数据库连接。然后,您可以按照以下方式实现词频的统计:

  1. 后台代码(Java + Spring Boot):
// 创建一个实体类来映射数据库中的表
@Entity
@Table(name = "test")
public class TestEntity {
    @Id
    private int id;
    private String 词汇;
    private String 词汇总;
    private double 浮点;
    private int 整数;

    // getters and setters
}

// 创建一个服务类来处理词频统计
@Service
public class WordFrequencyService {
    @Autowired
    private TestRepository testRepository;

    public Map<String, Integer> calculateWordFrequency() {
        List<TestEntity> entities = testRepository.findAll();
        Map<String, Integer> wordFrequencyMap = new HashMap<>();

        for (TestEntity entity : entities) {
            String[] words = entity.get词汇().split("\\s+");
            for (String word : words) {
                wordFrequencyMap.put(word, wordFrequencyMap.getOrDefault(word, 0) + 1);
            }
        }

        return wordFrequencyMap;
    }
}

// 创建一个控制器类来处理前端请求
@RestController
public class WordFrequencyController {
    @Autowired
    private WordFrequencyService wordFrequencyService;

    @GetMapping("/wordFrequency")
    public Map<String, Integer> getWordFrequency() {
        return wordFrequencyService.calculateWordFrequency();
    }
}
  1. 前端代码(HTML + JavaScript):
<!-- 创建一个HTML页面来展示词频统计结果 -->
<!DOCTYPE html>
<html>
<head>
    <title>词频统计</title>
</head>
<body>
    <h1>词频统计结果</h1>
    <div id="wordFrequencyResult"></div>

    <script>
        fetch('/wordFrequency')
            .then(response => response.json())
            .then(data => {
                const resultDiv = document.getElementById('wordFrequencyResult');
                for (const word in data) {
                    const wordCount = data[word];
                    const p = document.createElement('p');
                    p.textContent = `${word}: ${wordCount}`;
                    resultDiv.appendChild(p);
                }
            })
            .catch(error => console.error('Error fetching data:', error));
    </script>
</body>
</html>

请注意,上述代码是一个简化示例,您需要根据您的实际项目需求进行适当的调整和扩展。您可以使用您的数据库配置、依赖管理工具(如Maven或Gradle)来创建项目,然后将这些代码整合到您的项目中。

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你描述的不够清楚,具体的需求是啥,词频计算的规则是什么,数据来源是啥?前端需要如何展示?

有没有指定用什么框架

你是对词还是词组统计词频?有没有预定义的词库?还有对java框架有没有要求,需求尽量细化一下

要实现一个词频计算的应用,包括前端和后台,你可以按照以下步骤进行操作。我会为你提供一个简单的示例,涵盖前端和后台的代码。

前端部分:

HTML(index.html):

html

<!DOCTYPE html>
<html>
<head>
    <title>Word Frequency Counter</title>
</head>
<body>
    <h1>Word Frequency Counter</h1>
    <textarea id="textInput" rows="10" cols="50"></textarea>
    <button id="countButton">Count Words</button>
    <h2>Word Frequencies:</h2>
    <div id="wordFrequencies"></div>

    <script src="script.js"></script>
</body>
</html>

后台部分:

Java(WordFrequencyCalculator.java):

java

import java.util.HashMap;
import java.util.Map;

public class WordFrequencyCalculator {
    public static Map<String, Integer> calculateWordFrequency(String text) {
        String[] words = text.split("\\s+");
        Map<String, Integer> wordFrequencyMap = new HashMap<>();

        for (String word : words) {
            word = word.toLowerCase(); // Convert to lowercase for case-insensitive counting
            wordFrequencyMap.put(word, wordFrequencyMap.getOrDefault(word, 0) + 1);
        }

        return wordFrequencyMap;
    }
}

整合前后端:

Java(Main.java):

java

import java.util.Map;

public class Main {
    public static void main(String[] args) {
        // Simulated input from the frontend
        String userInput = "This is a simple example. This is a test example.";

        // Calculate word frequencies
        Map<String, Integer> wordFrequencyMap = WordFrequencyCalculator.calculateWordFrequency(userInput);

        // Display word frequencies
        for (Map.Entry<String, Integer> entry : wordFrequencyMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

这个示例中,我们创建了一个简单的前端页面,允许用户输入文本,然后通过点击按钮来计算词频。在后台,我们创建了一个WordFrequencyCalculator类,它将文本拆分为单词并计算词频。在主类Main中,我们模拟了从前端获取的输入并显示计算得到的词频。

请注意,这只是一个简单的示例。在实际应用中,你可能需要更多的错误处理、界面设计和优化。另外,这个示例没有涉及到将前端和后台真正整合起来,你可能需要使用一些框架(如Spring Boot)来创建一个完整的应用

前台HTML+JS
后台:Springboot
具体代码需要根据具体需求,按项目结构完成

SELECT 词汇总, 词汇, COUNT(*) AS 频率, 浮点
FROM test
GROUP BY 词汇总, 词汇
ORDER BY 浮点 DESC;

还是不太清楚需求,方便重新描述一下吗?

实体类

@Entity
@Table(name = "test")
public class TestData {
    @Id
    private int id;
    private String vocabulary;
    // ... other fields, getters, setters
}


service

@Service
public class WordFrequencyService {

    @Autowired
    private TestDataRepository testDataRepository;

    public Map<String, Integer> calculateWordFrequency() {
        List<TestData> testDataList = testDataRepository.findAll();

        Map<String, Integer> wordFrequencyMap = new HashMap<>();

        for (TestData testData : testDataList) {
            String vocabulary = testData.getVocabulary();
            String[] words = vocabulary.split(" "); // split words by space

            for (String word : words) {
                wordFrequencyMap.put(word, wordFrequencyMap.getOrDefault(word, 0) + 1);
            }
        }

        return wordFrequencyMap;
    }
}


前端

<!DOCTYPE html>
<html>
<head>
    <title>Word Frequency Calculator</title>
</head>
<body>
    <h1>Word Frequency Calculator</h1>
    <div id="result"></div>

    <script>
        fetch('/calculateWordFrequency') // Call the backend service
            .then(response => response.json())
            .then(data => {
                let resultDiv = document.getElementById('result');
                for (let word in data) {
                    resultDiv.innerHTML += `${word}: ${data[word]}<br>`;
                }
            });
    </script>
</body>
</html>


控制器

@RestController
public class WordFrequencyController {

    @Autowired
    private WordFrequencyService wordFrequencyService;

    @GetMapping("/calculateWordFrequency")
    public ResponseEntity<Map<String, Integer>> calculateWordFrequency() {
        Map<String, Integer> wordFrequencyMap = wordFrequencyService.calculateWordFrequency();
        return ResponseEntity.ok(wordFrequencyMap);
    }
}