如何使用 C# 查找文本中重复出现的词组? [关闭]

2024-05-22

我正在统计重复出现的字数字符串生成器(sb)我在互联网上找到了这段代码,据作者称,它与 Word 的字数计数器非常一致。

StringBuilder wordBuffer = new StringBuilder();
        int wordCount = 0;
        // 1. Build the list of words used. Consider ''' (apostrophe) and '-' (hyphen) a word continuation character.
        Dictionary<string, int> wordList = new Dictionary<string, int>();
        foreach (char c in sb.ToString())
        {

            if (char.IsLetter(c) || c == '\'' || c == '-')
            {
                wordBuffer.Append(char.ToLower(c));
            }
            else
            {
                if (wordBuffer.Length > 3)
                {
                    int count = 0;
                    string word = wordBuffer.ToString();
                    wordList.TryGetValue(word, out count);
                    wordList[word] = ++count;

                    wordBuffer.Clear();
                    wordCount++;
                }
            }
        }

这是我的示例文本:

绿藻(单数:green alga)是一个大型的、非正式的藻类群,由叶绿藻和轮藻藻组成,现在被分为不同的科。 陆地植物或有胚植物(高等植物)被认为是从轮藻植物中出现的。[1]由于有胚植物不是藻类,因此被排除在外,因此绿藻是一个并系群。然而,包括绿藻和有胚植物的进化枝是单系的,被称为绿色植物进化枝和植物界。绿藻包括单细胞和群落鞭毛虫,大多数每个细胞有两个鞭毛,以及各种群落、球状和丝状形式,以及宏观的多细胞海藻。在高等植物的近亲Charales中,组织发生了完全的细胞分化。绿藻约有8,000种。[2]许多物种的大部分生命都以单细胞的形式存在,而其他物种则形成群落(coenobia)、长丝或高度分化的宏观海藻。 其他一些生物体依靠绿藻进行光合作用。眼虫和氯蛛植物中的叶绿体是从摄入的绿藻中获得的,[1]并且后者保留了核形态(退化核)。绿藻也共生于纤毛虫草履虫、水螅和扁虫中。一些绿藻物种,特别是Trebouxiophyceae纲的Trebouxia属和Trentepohlia(Ulvophyceae纲),可以与真菌共生形成地衣。一般来说,地衣中的真菌物种不能独立生存,而藻类物种通常在没有真菌的情况下生活在自然界中。 Trentepohlia 是一种丝状绿藻,可以独立生活在潮湿的土壤、岩石或树皮上,也可以在石墨科地衣中形成光共生体。

通过我的示例文本,我得到green and algae第一行中的单词符合预期。

问题是,我不仅需要单个单词,我还需要单词组。对于这个示例文本,我想要绿藻词也一起green and algae words.

And my 可选问题是:我需要以高性能来完成,因为文本可能会很长。据我研究,在这种情况下使用正则表达式并不是高性能,但我不确定是否有第二种方法可以实现这一点。

提前致谢。

UPDATE 如果您明白我要问的内容,则无需阅读这些内容。
由于我看到太多关于我的“组”定义不清楚的评论,我认为我需要更详细地陈述我的观点,我希望在评论部分写下这些行,但对于本次更新来说,这是一个有点狭窄的区域。首先,我知道 StackOverflow 不是编码服务。我试图找到文章中最常用的词组,并尝试确定文章的内容,我们也可以将其称为标签生成器。为此,我尝试找到最常用的单词,一开始还可以。然后我意识到这不是决定主题的好方法,因为我不能假设这篇文章只是关于第一个或第二个词。在我的例子中,我不能说这篇文章只是关于green or algae因为它们在这里意味着某种意义,而不是单独存在。如果我尝试用一​​篇关于像“海伦娜·博纳姆·卡特”这样的三个名字的名人的文章(如果我假设它是沿着文章写出全名,而不仅仅是姓氏),我想把这些词放在一起而不是一个接一个。我正在尝试实现更聪明的算法,以最准确的方式一次性猜测主题。我不想限制字数,因为文章可能是关于“联合国工业发展组织”(我再次假设它现在写成文章中的“UNIDO”)。我可以通过尝试获取从任何索引开始到任意长度的文本末尾的每个单词组来实现此目的。好吧,这确实不是一个好方法,尤其是对于长文本,但这并非不可能,对吗?但我一直在寻找更好的方法来做到这一点,我只是询问更好的算法思想和最好使用的工具,我可以自己编写代码。我希望我最终明确了我的目标。


实现此目的的方法是获取初始文本,并使用空格将其拆分为字符串数组string.split(' ');

接下来,您需要迭代数组中的每个字符串。 这对于单个单词来说很容易,但对于组来说则更复杂。 因此,您需要定义组大小。您必须控制每次迭代时指针在数组中前进的位数。

一旦能够迭代数组,您就需要获取该组单词(无论您选择的长度),并将其存储在某个地方。 示例中的字典是一个好方法。

如果字典包含单词组,则将其值加一。 如果不包含该组,只需添加它,默认值为 1。

 if (wordList.ContainsKey(theKey)) {
   wordList[theKey]++;
 } else {
   wordList.Add(theKey, 1);
 }

您确实正确地提到您的研究表明正则表达式的性能并不高。对于此任务,正则表达式是完全错误的工具 - 您不是在寻找模式,而是在检查组。 为此,您必须从头到尾浏览文本,检查值。

任何涉及遍历文本并对其运行重复函数的任务都不应使用正则表达式。

编辑:我对正则表达式性能的最初假设是不正确的 - 在 C# 中,它似乎比 Java 快得多,但我仍然认为纯正则表达式方法不如使用正则表达式标记文本那么快然后使用循环或 linq 表达式来查找组。

Stating

@galakt 正如我上面提到的,让我们说 3。这重要吗?

词组的概念是完全抽象的。是的,这是一组单词,但整个文本块都是一组单词。 必须应用规则来控制您对这组单词的操作方式。

下面是一个示例方法,它将根据通过方法调用传递的大小返回所有单词组的字典。 它不会从文本中删除任何非字母数字字符,但即使组大小较大,它也很快。

要调用它,请使用Dictionary<String, int> SingleWordGroups = GetWordGroupInstances(1);

    private Dictionary<String, int> GetWordGroupInstances(int GroupSize) {

        Dictionary<String, int> WordGroupInstances = new Dictionary<string, int>();

        //Grab the string to work from...
        String[] sourceText = GetSourceText().Split(' ');
        int pointer = 0;
        StringBuilder groupBuilder = new StringBuilder();
        while (pointer < sourceText.Length - GroupSize) {
            groupBuilder.Clear();
            int offset = pointer + GroupSize;
            for (int i = pointer; i < offset; i++) {
                //prepend a space to allow separation between words in groups. 
                //We can make a substring from this later starting from char 1 
                //to lose the initial whitespace from the string.
                groupBuilder.Append(" ").Append(sourceText[i]);
            }

            String key = groupBuilder.ToString().Substring(1);
            if (!WordGroupInstances.ContainsKey(key)) {
                WordGroupInstances.Add(key, 1);
            } else {
                WordGroupInstances[key]++;
            }

            /**
             * Setting the pointer to increase by group size grabs a group, moves on
             * to the end of the group, and grabs the next.
             * 
             */
            pointer += GroupSize;

            /**
             * Setting the point to increment by 1 grabs a group, advances by 1 word, then
             * grabs the next, so from the phrase - "Hello world, I'm some text", the groups of size 2 would be
             * "Hello world,", "world, I'm", "I'm some" etc...
             */
            //pointer++;
        }

        return WordGroupInstances;

    }

下面的方法被修改为依次产生所有组输出,所以 这 绿色的 绿藻 绿藻 ETC...

值得注意的是,整个文本必须转换为小写或大写,以便单词不区分大小写。 我对此进行了一些改进以提高性能(并消除了对中断指令的需要)。

   private Dictionary<String, int> GetAllGroups() {
        Dictionary<string, int> WordGroupInstances = new Dictionary<string, int>();
        StringBuilder groupBuilder = new StringBuilder();
        String[] sourceText = GetSourceText().Split(' ');

        for (int i = 0; i < sourceText.Length; i++) {
            groupBuilder.Clear();
            for (int j = i; j < sourceText.Length; j++) {
                groupBuilder.Append(" ").Append(sourceText[j]);
                String key = groupBuilder.ToString().Substring(1);
                if (!WordGroupInstances.ContainsKey(key)) {
                    WordGroupInstances.Add(key, 1);
                } else {
                    WordGroupInstances[key]++;
                }
            }
        }
        return WordGroupInstances;
    }

经过对文本语料库(288个词)的性能测试,它将在0.171886秒内创建41773个词组。

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

如何使用 C# 查找文本中重复出现的词组? [关闭] 的相关文章

随机推荐

  • 如何忽略 perl 中的“证书验证失败”错误?

    我想访问一个无法验证证书的网站 我正在使用 WWW Mechanize 获取请求 那么如何忽略这一点并继续连接到该网站呢 use IO Socket SSL qw use WWW Mechanize qw my mech WWW Mecha
  • Rails 生产“CSS 未预编译”

    我已经在我的 Leopard 网络服务器上使用生产环境在姊妹 Rails 3 1 应用程序上完成了此操作 所以我没想到部署这个应用程序会如此失败 我已经让 Passenger 识别出该应用程序 但我在 apache 中收到 GET miss
  • ASP.NET MVC 开源真实世界应用程序 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 每当我开始学习新技术或语言时 我倾向于查看一些 现实世界 应用程序的源代码 我发现它们对于理解常见的
  • .NET 中非常奇怪的 SSL 错误:仅针对特定 URL 无法解密指定数据

    我正在使用 NET 从 URL 下载数据 对于大多数 URL 它都没有问题 但对于一个特定的 URL 当我尝试建立连接时 我收到一个非常奇怪的错误 此外 该错误仅在第二次 及后续 尝试发出请求时发生 第一次似乎总是有效 这是一些演示该问题的
  • 如何在 bash 上运行 MySQL 命令?

    以下代码在命令行上运行 mysql user myusername password mypassword database mydatabase execute DROP DATABASE myusername CREATE DATABA
  • SSLHandshakeException:证书中的主机名不匹配

    我正在编写一个系统 必须向具有自签名证书的服务器 一个名为 ARX 的第三方程序 当前在开发过程中在本地主机上运行 进行多部分发布 我试图找到它的证书 但只能找到三个不同的jks文件 服务器 jks 服务器信任 jks and 服务器ca
  • iOS HealthKit 今天的步数始终为 0(但尾随天数没问题)

    在我们的应用程序中 我们查询 HealthKit 以获取过去 7 天的步数 每天汇总 以午夜为基准 所以范围是 D 6 午夜到明天午夜 因为我们想要今天的步骤到现在为止 它有效 我们总是能够获取过去 6 天的数据 除了今天的数据始终为 0
  • 使用 SetWindowsHookEx() 阻止窗口鼠标单击

    我编写了一个应用程序 将某些过程挂接到新进程上 以监视鼠标按下事件并禁用新进程上的鼠标按下事件 截至目前 我能够捕获进入此进程的鼠标按下事件 并且我正在尝试将所有鼠标按下事件作为 POC 禁用 这就是我目前在钩子程序中所做的事情 exter
  • 需要一个好的 ASP.NET 菜单

    我正在寻找一个可以在 ASP NET 中使用的好菜单 我目前使用的是asp菜单 我需要 它可以在 IE 6 7 8 Firefox 和 Safari 中运行 我还需要它不要给页面客户端增加大量开销 我需要能够从数据库加载它 编写您自己的服务
  • Python Tkinter,显示实时数据

    我想在 GUI 中显示实时数据tkinter 我得到的数据包含list两个整数的 current voltage 我每秒都在获取新数据 我成功创建了一个 GUI 现在我想知道如何在 GUI 中显示数据Label小部件 python tkin
  • Google 将自动完成功能放置在 React 组件中

    我正在尝试构建一个谷歌地图组件 谷歌地图 API v3 一切正常 但自动完成功能不行 这是我正在使用的代码 Google 地图组件 import React Component from react import ReactDOM from
  • memcpy 到动态存储结构安全吗?

    Context 我正在审查一些代码 这些代码从 IO 描述符接收数据到字符缓冲区 对其进行一些控制 然后使用接收到的缓冲区的一部分来填充结构 突然想知道是否可能涉及严格的别名规则违规 这是一个简化版本 define BFSZ 1024 st
  • 监控 Thunderbolt 端口连接的变化

    我正在满足一个要求 需要监视 Thunderbolt 端口连接的变化 当 Thunderbolt 电缆连接或断开时 我尝试使用IOServiceMatching kIOUSBInterfaceClassName from IOKit框架但我
  • TYPO3 6 需要哪些 PHP 函数?

    我刚刚全新安装了 TYPO3 6 1 系统环境检查告诉我 我的服务器上禁用了某些 PHP 功能 我在我的服务器上使用 Froxlor 来管理域等 因此 我可以完全控制这台机器 但我不确定哪些功能是真正必要的 有些功能对我来说似乎相当危险 所
  • 为什么这个 django url 没有重定向?

    从以下表单获取发布数据后 页面应重定向到 associate learn 如操作中所示 然而 它只是停留在单选按钮页面上 我怀疑我犯了初学者的错误 但在重新阅读教程后 我不确定发生了什么 索引 html Choose a dataset i
  • Google Cloud SDK 中对 google-auth 的依赖错误?

    我正在标准环境应用程序中使用谷歌云存储和谷歌云数据存储API 目前在本地 我尝试运行我的测试 使用 pytest 时有一种非常奇怪的行为 我发现 在测试期间 dev appserver fix sys path命令运行者pytest bed
  • JScrollPane 中的 JScrollPane

    我有一个JScrollPane 其中有一个JPanel其内容窗格 对此JPanel我添加更小的JPanels 正如预期的那样 如果我添加太多JPanel 会出现一个垂直滚动条 问题是我的小JPanels 包含一个JScrollPane也为了
  • Maven + Resteasy JAXB 找不到内容类型 application/xml 的 writer

    我想创建一个将在其他项目中使用的 jar 其中包括使用 ReastEasy 库 jaxb jaxrs jaxrs clients 等 虽然我包含了所有库 并且在基于 Maven 的项目中一切正常 但显然有些库未包含在 jar 中 并且我在简
  • 从 Flutter 中删除底部导航栏上的默认内边距或边距

    这是问题的图片 它是底部导航栏上的默认填充吗 如果是 我该如何删除它 正如您在下面的代码中看到的 我在 BottomNavigationBarItem 内部有一个容器和一个图标 但图标和栏之间有一个空格 return Scaffold bo
  • 如何使用 C# 查找文本中重复出现的词组? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在统计重复出现的字数字符串生成器 sb 我在互联网上找到了这段代码 据作者称 它与 Word 的字数计数器非常一致 StringB