Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 消除字符串中的冗余字母?(例如goooooood->;good)_C#_Regex - Fatal编程技术网

C# 消除字符串中的冗余字母?(例如goooooood->;good)

C# 消除字符串中的冗余字母?(例如goooooood->;good),c#,regex,C#,Regex,我正在尝试为Twitter的朴素贝叶斯分类器设置一些样本数据 我想做的推文后处理之一就是删除不必要的重复字符 例如,其中一条tweet上写着:twizzler。嗯,好极了 我想把w的数量减少到只有两个。为什么是两个?这就是我下面的文章所做的。任何少于2个字符的单个单词都将被丢弃(请参见上面的MMM)。至于Gooooood,我认为双字母是uber最常见的重复字母 那么,就执行时间而言,将goooood等词简化为good的最快方法是什么 [编辑] 我将在这个应用程序中处理800000条推文,因此需要

我正在尝试为Twitter的朴素贝叶斯分类器设置一些样本数据

我想做的推文后处理之一就是删除不必要的重复字符

例如,其中一条tweet上写着:
twizzler。嗯,好极了

我想把w的数量减少到只有两个。为什么是两个?这就是我下面的文章所做的。任何少于2个字符的单个单词都将被丢弃(请参见上面的MMM)。至于Gooooood,我认为双字母是uber最常见的重复字母

那么,就执行时间而言,将goooood等词简化为good的最快方法是什么

[编辑] 我将在这个应用程序中处理800000条推文,因此需要最快的执行速度 [/编辑]

[编辑二] 我只是根据运行时间运行了一些简单的基准测试,以迭代1000条记录并保存到一个文本文件中。我对每个方法重复了100次这个迭代。平均结果如下:

方法1:386 ms[删除LINQ-答案] 方法2:407 ms[Regex] 方法3:303 ms[StringBuilder] 方法4:301 ms[StringBuilder第2部分]

方法1:LINQ(答案显然已删除)

方法3:

static string StringB(string s)
    {
        string input = s;
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < input.Length; i++)
        {
            if (i < 2 || input[i] != input[i - 1] || input[i] != input[i - 2])
                sb.Append(input[i]);
        }
        string output = sb.ToString();
        return output;

    }
静态字符串StringB(字符串s)
{
字符串输入=s;
StringBuilder sb=新的StringBuilder();
for(int i=0;i
方法4:

static string sb2(string s)
    {
        string input = s;

        var sb = new StringBuilder(input);

        char p2 = '\0';
        char p1 = '\0';

        int pos = 0, len = sb.Length;
        while (pos < len)
        {
            if (p2 == p1) for (; pos < len && (sb[pos] == p2); len--)
                    sb.Remove(pos, 1);

            if (pos < len)
            {
                p2 = p1;
                p1 = sb[pos];
                pos++;
            }
        }
        return sb.ToString();

    }
静态字符串sb2(字符串s)
{
字符串输入=s;
var sb=新的StringBuilder(输入);
字符p2='\0';
字符p1='\0';
int pos=0,len=sb.长度;
while(pos
我同意这样的评论,即这在一般情况下是行不通的,尤其是在“Twitter演讲”中。话虽如此,您提到的规则很简单-删除与前两个字符相同的所有字符:

string input = "goooooooooooood";
StringBuilder sb = new StringBuilder(input.Length);
sb.Append(input.Substring(0, 2));

for (int i = 2; i < input.Length; i++)
{
    if (input[i] != input[i - 1] || input[i] != input[i - 2])
        sb.Append(input[i]);
}
string output = sb.ToString();
string input=“goooood”;
StringBuilder sb=新的StringBuilder(输入长度);
sb.Append(输入子串(0,2));
for(int i=2;i
我建议研究NLP解决方案,而不是C#/regex。在这个世界上,python是首选。看见我会推荐给你的拼写更正。你甚至可以词干,甚至可以使用不定式

这也可以通过正则表达式(轻松)实现:

var re = @"((.)\2)\2*";
Regex.Replace("god", re, "$1")    // god
Regex.Replace("good", re, "$1")   // good
Regex.Replace("gooood", re, "$1") // good
它比其他方法快吗?好吧,这就是基准;-)正则表达式在非退化回溯情况下非常有效。上述内容可能需要更改(例如,这也将匹配空格),但这只是一个小示例


快乐的编码。

正则表达式看起来是最简单的。REPL中的简单概念证明:

using System.Text.RegularExpressions;  
var regex = new Regex(@"(\S)\1{2,}"); // or @"([aeiouy])\1{2,}" etc?
regex.Replace("mmmmm gooood griieeeeefff", "$1$1");
-->

“mm good grieeff”
要获得原始性能,请使用类似以下内容:观看现场直播

使用系统;
使用系统文本;
班级计划
{
公共静态void Main(字符串[]args)
{
字符串输入=“mmmm goood griiifff”;
var sb=新的StringBuilder(输入);
字符p2='\0';
字符p1='\0';
int pos=0,len=sb.Length;
while(pos如果(p2==p1)用于(;posHow你怎么知道这个人不是指上帝?比如,Gooooood?我看不出有任何方法可以100%准确地得出这个结果。@FB-我不能保证100%准确。我只是在追随斯坦福大学的一些人did@Matt-我需要以编程的方式对任何重复的字符执行此操作…而不仅仅是关于英语语言仅限年龄?@HansPassant-谢谢,我一直想获得奖项提名。这是执行速度最快的吗?我会更新我的问题,以反映我将解析80万条推文,因此速度是最佳的(我确实提到过)@斯科特:你为什么不实现它,测试它,然后自己去发现呢?你迟早要学会如何优化你自己的代码。@Ed-我想这就是我来这里的原因。考虑到我来这里之前不知道如何去做,当你不知道如何去做时,实现、测试、重构、重写、改进等等都会有点困难o一些开始的东西。或者如何改进它…不,你不能(不应该)来这里看“Theh codez”,你在付出了一些努力之后才来到这里寻求指导。如果你把所有的东西都放在一个银盘上,你希望如何发展成为一名工程师?你认为给你答案的人会不会随着时间的推移没有弄明白这些东西?@ScottSilvi:请编辑你的问题,分享这些基准,我会对结果感兴趣的h我已经研究了NTLK并阅读了他们提供的大部分书籍。我认为这方面的长期解决方案将是使用python和NTLK,但在我有时间学习python以及如何将其集成到我们的技术堆栈中之前,我必须在比预期晚一点的时间内充分利用我所拥有的,但嘿,这种方法应该非常迅速:)在总共200次迭代中,每次迭代快2毫秒。这是赢家。@ScottSilvi:我打赌,如果您以输入长度的初始容量初始化
StringBuilder
,我的解决方案仍然会赢。此外,考虑使用优化编译;始终评测代码(对于频繁且复杂的输入)
var re = @"((.)\2)\2*";
Regex.Replace("god", re, "$1")    // god
Regex.Replace("good", re, "$1")   // good
Regex.Replace("gooood", re, "$1") // good
using System.Text.RegularExpressions;  
var regex = new Regex(@"(\S)\1{2,}"); // or @"([aeiouy])\1{2,}" etc?
regex.Replace("mmmmm gooood griieeeeefff", "$1$1");
using System;
using System.Text;

class Program
{
    public static void Main(string[] args)
    {
        string input = "mmmm gooood griiiiiiiiiieeeeeeefffff";

        var sb = new StringBuilder(input);

        char p2 = '\0';
        char p1 = '\0';

        int pos = 0, len=sb.Length;
        while (pos < len)
        {
            if (p2==p1) for (; pos<len && (sb[pos]==p2); len--)
                sb.Remove(pos, 1);

            if (pos<len)
            {
                p2=p1;
                p1=sb[pos];
                pos++;
            }
        }

        Console.WriteLine(sb);
    }
}