You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:06:08