【问题标题】:Splitting a long Urdu sentence into smaller based on conjunctions in C#基于 C# 中的连词将一个长的乌尔都语句子拆分成更小的句子
【发布时间】:2014-03-29 02:02:12
【问题描述】:

这是我到目前为止所做的。问题是如果连词在句子中出现两次,则代码不适用于连词的第二次出现。请问有高手可以帮忙吗?

    private void SplitSentence_Click(object sender, EventArgs e)
    {
        richTextBox2.Text = "";
        richTextBox3.Text = "";
        string[] keywords = { " or ", " and ", " hence", "so that", "however", " because" };
        string[] sentences = SentenceTokenizer(richTextBox1.Text);
        string remSentence;

        foreach (string sentence in sentences)
        {
           remSentence = sentence;
            richTextBox3.Text = remSentence;
            for (int i =0; i < keywords.Length; i++)
            {
               if ((remSentence.Contains(keywords[i])))// || (remSentence.IndexOf(keywords[i]) > 0))
                {

                  richTextBox2.Text += remSentence.Substring(0, remSentence.IndexOf(keywords[i])) + '\n' + keywords[i] + '\n';
                  remSentence = remSentence.Substring(remSentence.IndexOf(keywords[i]) + keywords[i].Length);

                }                   

             }
            richTextBox2.Text += remSentence;
        }
    }

    public static string[] SentenceTokenizer(string text)
    {
        char[] sentdelimiters = new char[] { '.', '?', '۔', '؟', '\r', ':', '-' }; //    '{ ',' }', '( ', ' )', ' [', ']', '>', '<','-', '_', '= ', '+','|', '\\', ':', ';', ' ', '\'', ',', '.', '/', '?', '~', '!','@', '#', '$', '%', '^', '&', '*', ' ', '\r', '\n', '\t'};
        // text.Remove('\n');
        return text.Split(sentdelimiters, StringSplitOptions.RemoveEmptyEntries);
    }

【问题讨论】:

    标签: c#


    【解决方案1】:

    您可以使用正则表达式来处理此问题,而不是手动执行操作。我将在我的示例中使用英语,以免我不小心杀死可怜的乌尔都语。

    using System.Text.RegularExpressions;
    
    Regex r = new Regex("\b(and|or|hence)");
    sentence = r.Replace(sentence, "|");     // Just something unlikely to be normal.
    string[] phrases = sentence.Split ('|'); // Each piece between conjunctions.
    

    您可能需要调整它的大小写(?)以及连词可能是另一个单词的一部分的可能性(我使用了前导空格 - 或 @Drahcir 建议中的单词边界 - 开始该过程)。请参阅 this answer 了解如何使用 .NET 版本的反向引用。

    【讨论】:

    • 可以使用单词边界\b代替前导空格
    • 好计划。毕竟,这是一个非英语目标。不过,双方都不是,因为这可能会漏掉“和/或”等类似词。
    • @John C 感谢它有效。在某些情况下,单词“and”出现在两个名词之间而不是短语之间。例如Akram 和 Jhon 是最好的朋友。这里的“和”需要在上下文中单独处理。有没有办法处理这种情况?
    • 不,很遗憾,此时您需要开始解析。我们在这里做的是“词法分析”,在文本中挑选出特殊的标记。解析获取这些标记并找到语法模式。这变得更加棘手,因为自然语言(尤其是更成熟的语言和地缘政治边界上的语言)不是“常规语言”。但如果输入足够简单,您可以查看“解析器生成器”以了解可行的方法。
    • @JohnC 我有一个包含 20 个单词的词典,通常出现在乌尔都语的“and (اور)”之前。我想要的是有一种方法可以对照词典检查“和”之前的单词,如果发现句子被破坏,则显示完整的句子。使用正则表达式拆分我失去了对“和”一词的控制以进行进一步处理。我不打算开发一个完整的解析器或 lex。分析仪。
    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多