如何使用正则表达式和 Java 计算文本中的音节

2024-02-12

我有文字作为String并需要计算每个单词的音节数。我尝试将所有文​​本拆分为单词数组,然后分别处理每个单词。我为此使用了正则表达式。但音节模式并没有发挥应有的作用。请建议如何更改它以计算正确的音节数。我的初始代码。

public int getNumSyllables()
{
    String[] words = getText().toLowerCase().split("[a-zA-Z]+");
    int count=0;
    List <String> tokens = new ArrayList<String>();
    for(String word: words){
            tokens = Arrays.asList(word.split("[bcdfghjklmnpqrstvwxyz]*[aeiou]+[bcdfghjklmnpqrstvwxyz]*"));
            count+= tokens.size();

            }
    return count;
}

这个问题来自UCSD的Java课程,对吗?

我认为你应该为这个问题提供足够的信息,以免让想要提供帮助的人感到困惑。在这里,我有自己的解决方案,它已经通过本地程序的测试用例以及来自 UCSD 的 OJ 进行了测试。

您在这个问题中错过了有关音节定义的一些重要信息。其实我觉得这个问题的关键是你应该如何处理e.例如,假设有一个组合te。如果你把te在单词中间,当然应该算作一个音节;但是,如果它位于单词的末尾,则e应该被认为是silent e在英语中,因此不应将其视为音节。

就是这样。我想用一些伪代码写下我的想法:

  if(last character is e) {
        if(it is silent e at the end of this word) {
           remove the  silent e;
           count the rest part as regular;
        } else {
           count++;
  } else {
        count it as regular;
  }
}

你可能会发现我不仅使用正则表达式来处理这个问题。其实我也想过:这道题真的可以只用正则表达式来完成吗?我的回答是:不,我不这么认为。至少现在,以加州大学圣地亚哥分校给我们的知识,做到这一点太困难了。正则表达式是一个强大的工具,它可以非常快速地映射所需的字符。然而正则表达式缺少一些功能。采取te再次举个例子,正则表达式在面对这样的词时不会三思而后行teate(我编造这个词只是为了举例)。如果我们的正则表达式模式算第一个te作为音节,那为什么最后一个te not?

与此同时,UCSD实际上在作业纸上谈到了这一点:

如果您发现自己在做心理体操,想出一个正则表达式来直接计算音节,这通常表明有一个更简单的解决方案(提示:考虑字符循环 - 请参阅下面的下一个提示)。仅仅因为一段代码(例如正则表达式)更短并不意味着它总是更好。

这里的提示是,你应该将这个问题与一些循环一起考虑,并与正则表达式结合起来。

好吧,我现在终于应该展示我的代码了:

protected int countSyllables(String word)
{
    // TODO: Implement this method so that you can call it from the 
    // getNumSyllables method in BasicDocument (module 1) and 
    // EfficientDocument (module 2).
    int count = 0;
    word = word.toLowerCase();

    if (word.charAt(word.length()-1) == 'e') {
        if (silente(word)){
            String newword = word.substring(0, word.length()-1);
            count = count + countit(newword);
        } else {
            count++;
        }
    } else {
        count = count + countit(word);
    }
    return count;
}

private int countit(String word) {
    int count = 0;
    Pattern splitter = Pattern.compile("[^aeiouy]*[aeiouy]+");
    Matcher m = splitter.matcher(word);

    while (m.find()) {
        count++;
    }
    return count;
}

private boolean silente(String word) {
    word = word.substring(0, word.length()-1);

    Pattern yup = Pattern.compile("[aeiouy]");
    Matcher m = yup.matcher(word);

    if (m.find()) {
        return true;
    } else
        return false;
}

你可能会发现除了给定的方法之外countSyllables,我还创建了两个额外的方法countit and silente. countit用于计算单词内的音节,silente正在试图弄清楚这个词是否以无声结尾e。还应该注意的是,not silent e。例如,the应该考虑not silent e, while ate被认为silent e.

这是我的代码已经通过测试的状态,来自本地测试用例和 UCSD 的 OJ:

从 ON 的测试结果来看:

P.S: 直接使用像 [^aeiouy] 这样的东西应该没问题,因为在我们调用这个方法之前这个词已经被解析了。还需要更改为小写,这将节省处理大写的大量工作。我们想要的只是音节数。 谈论数字,一种优雅的方式是定义count因为是静态的,所以私有方法可以直接使用count++里面。但现在好了。

如果您还是不明白这个问题的方法,请随时联系我:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用正则表达式和 Java 计算文本中的音节 的相关文章

随机推荐

  • 什么是非法反射访问?

    Java 9 中存在很多关于非法反射访问的问题 我发现了很多关于解决错误消息的讨论 但我很想知道非法反射访问实际上是什么 所以我的问题是 什么定义了非法反射访问以及什么情况会触发警告 我认为它与 Java 9 中引入的封装原则有关 但我找不
  • GCM PhoneGap 插件 消息错误

    我正在使用phonegap在android上实现GCM 在我向设备发送消息之前 该过程运行良好 当我的设备收到该消息时 它会关闭 并显示我的应用程序出现内部错误的消息 该错误消息来自 dalvik VM 我仍在使用插件附带的演示应用程序进行
  • 使用 Python 删除文件中的括号和文本

    我有一个文本文件 其中包含如下内容 Cl1 Cl 0 21988 6 0 2500 0 15016 5 0 01587 14 Uani 1 2 d S T P O1 O 1 05820 17 0 2500 0 48327 16 0 0206
  • C# [匿名\通用] 对象到 byte[] 没有 BinaryFormatter [在 .NET 4.5 中]?

    BinaryFormatter效果很好 但不存在于 NET 4 5 的可移植类库中 我读到它是在 NET 4 6 Portable 中 我还没有证实这一点 因为当我在项目设置中更改为 4 6 时 我收到警告 消息 4 5 将自动成为目标 除
  • 为什么 Python 和 CUDA 不支持半精度复杂浮点运算?

    NumPY 有复杂64 https docs scipy org doc numpy user basics types html对应于两个float32 但它也有 float16 但没有 complex32 怎么会 我有涉及 FFT 的信
  • 为什么 Git 使用加密哈希函数?

    为什么 Git 使用SHA 1 http en wikipedia org wiki SHA 1 加密哈希函数 而不是更快的非加密哈希函数 相关问题 堆栈溢出问题为什么 Git 使用 SHA 1 作为版本号 https stackoverf
  • GitHub 从另一个存储库包含

    我是 github 的新手 我的机器上有一个 github 存储库 我想将另一个存储库 作为第三方 包含到我的存储库中 我相信我应该先做一个叉子 但如何将其包含在我的本地存储库中 我尝试过子模块但没有成功 Thanks git 子模块 ht
  • 如何管理 Perl 应用程序开发、构建和部署?

    我还没有想出一种令人满意的方法来管理 Perl 应用程序的开发 构建和部署 我想听听您如何解决这个问题和 或您希望在您现在没有的应用程序构建系统中拥有什么 请描述您的应用程序类型 它是一个 Web 应用程序 它是否在服务器上运行 或者您是否
  • webview中的字体没有改变

    Typeface hnr Typeface createFromAsset this getAssets HelveticaNeueLTStd Md otf html table tr td align left td tr table
  • 用于检测变量更改的 Java 事件侦听器

    我似乎无法在任何地方找到我的问题的答案 是否有任何事件侦听器可以检测布尔值或其他变量的变化 然后对其采取行动 或者是否可以创建自定义事件侦听器来检测这一点 请我似乎无法在任何地方找到解决方案 我发现这个网站 http www example
  • GroupLayout:值得学习吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对java 特别是swing 比较陌生 最近一直在制作一些相当简单的应用程序 边学习边学习 最新的有很多表单组件 例如 JLabels JTe
  • 登录 Microsoft AD 后 Request.IsAuthenticated 始终为 false

    我有一个 ASP NET 4 5 1 MVC WebAPI 项目 它使用 SSO 针对 Microsoft 进行身份验证 成功登录 Microsoft 后 我 的 HomeController 上仍然有 Request IsAuthenti
  • 如何在文本区域中使用不同的字体颜色?

    我希望在输入特定关键字时文本区域中的字体颜色发生变化 就像在 Visual Studio 中一样 我没有在任何地方见过这个 所以我不知道这是否可以用 HTML 和 JavaScript 实现 有人见过这样的东西吗 或者知道怎么写吗 Text
  • 如何使用包含正则表达式的测试路径

    我想检查文件 Test txt 是否存在于特定目录 文件夹名称为 16 位数字 中 我尝试了以下命令 Test Path C Users
  • 无法使用 Unity 找到名称空间“ServiceModel”

    我想在我的 Unity 应用程序中使用 WCF 服务 通过命名管道 因此 我包含以下两个命名空间 using System ServiceModel using System ServiceModel Channels 在Unity中运行我
  • Composer:删除一个包,清理依赖项,不更新其他包

    情况 假设我有一个由 Composer 安装的项目 其中包含两个软件包 php composer phar require squizlabs php codesniffer 2 0 phpmd phpmd 2 1 自动生成的compose
  • 如何解决“此翻译单元中未实现带有选择器的方法”?

    我收到这个错误 如下图所示 the showSingerInfo方法在父类中定义 我该如何解决这个警告 看起来 Clang 无法解析 showSingerInfo 方法的声明 我猜测 showSingerInfo 是翻译单元 类中的本地方法
  • 如何避免从 solr 检索整个存储字段

    我使用 sunspot 和 solr 作为 Rails 应用程序来搜索电子书内容 为了突出显示功能 我必须将 ebook content 设置为存储的文件 每次我查询 solr 的结果时 它都会发回有关该书的整个文档内容 其中使得查询非常慢
  • 在 Android 设置中防止“匹配的 Activity 可能不存在”

    大部分活动操作 用于启动各种设置活动 Settings http developer android com reference android provider Settings html类带有警告 在某些情况下 匹配的活动可能不存在 因
  • 如何使用正则表达式和 Java 计算文本中的音节

    我有文字作为String并需要计算每个单词的音节数 我尝试将所有文 本拆分为单词数组 然后分别处理每个单词 我为此使用了正则表达式 但音节模式并没有发挥应有的作用 请建议如何更改它以计算正确的音节数 我的初始代码 public int ge