如何通过rJava将Java字符串传递给R 实现Google Ngram词频交互
外语单词猜测游戏Java-R字符串传递与Ngram词频获取解决方案
一、Java类调整建议
你现有的dictionary类可以正常使用,这里有个小优化点:当前带String参数的构造函数中,传入的初始line值会被后续文件读取的单词覆盖,你可以调整异常分支的逻辑,文件读取失败时返回传入的默认值,避免返回空字符串:
catch(IOException e) { System.out.println("File does not exist, use default word."); // 保留传入的默认值即可 }
运行前先执行javac dictionary.java编译得到class文件,和words.txt一起放在R的工作目录下即可。
二、R侧代码修正(字符串接收+词频统计+回传)
你原来的R代码调用逻辑错误:getLine是你自定义的dictionary类的成员方法,不属于Java原生java.lang.String类,所以调用失败。修正后的完整代码如下:
library("ngramr") library("rJava") # 初始化JVM,指定当前目录为classpath,确保能识别你编译的dictionary.class .jinit(classpath = ".", parameters = getOption("java.parameters")) # 实例化自定义的dictionary类对象 dict_obj <- .jnew("dictionary") # 如果需要用带参数的构造函数可以写为:dict_obj <- .jnew("dictionary", "默认测试词") # 调用getLine方法获取Java侧生成的目标单词 target_word <- .jcall(dict_obj, returnSig = "S", method = "getLine") print(paste0("获取到的目标单词:", target_word)) # 统计Google Ngram词频,返回各年份的相对出现占比 ngram_result <- ngram(target_word, year_start = 1800, smoothing = 0, case_insensitive = TRUE) # 计算单词的平均出现频次,数值越低代表单词越冷门 word_freq <- mean(ngram_result$Frequency, na.rm = TRUE) print(paste0("单词平均词频:", word_freq)) # 回传数据到Java侧:如果需要把词频/计算好的积分传给Java,只需在dictionary类中新增接收参数的成员方法,比如新增setWordFreq方法后直接调用即可 # 示例:.jcall(dict_obj, method = "setWordFreq", returnSig = "V", word_freq)
三、核心逻辑说明
- 积分规则适配:ngramr返回的
Frequency字段是单词在对应年份书籍样本中的出现占比,你可以直接用该值换算积分,比如获得积分 = 基础分 * (1/word_freq),自动实现冷门单词积分更高的规则 - 回传Java的参数类型:如果传递的是整数/浮点数类型的积分,
.jcall会自动匹配Java对应类型的入参方法,不需要额外做类型转换 - 查询优化:如果遇到ngram查询失败的情况,可以给
ngram函数增加corpus = "eng_2019"参数指定语料库版本,提高查询成功率
内容的提问来源于stack exchange,提问作者barrettw
相关产品推荐
相关产品推荐

