【问题标题】:How to find longest sentence in text?如何在文本中找到最长的句子?
【发布时间】:2015-11-24 14:35:47
【问题描述】:

假设我有类似这样的文本文件:

C#[note 2](读作 see sharp)是一种多范式编程 语言包含强类型、命令式、声明式、 功能性、通用性、面向对象(基于类)和 面向组件的编程学科。它是由 Microsoft 在其 .NET 计划中,后来被批准为标准 通过 Ecma (ECMA-334) 和 ISO (ISO/IEC 23270:2006)。 C# 是其中之一 为公共语言基础设施设计的编程语言。 C# 旨在成为一种简单、现代、通用、 面向对象的编程语言。 [7]其开发团队由领导 安德斯·海尔斯伯格着。最新版本是 C# 6.0,它是 2015 年 7 月 20 日发布。[8]

如何在本文中找到最长的句子?我应该使用string[] lines = File.ReadAllLines(file); 阅读它吗?

编辑:你说是不可能的。但这是老师给我的任务..

好的,如何处理这个文本文件?:

短信或短信是撰写和发送的行为 两部或多部手机之间的简短电子信息,或 通过电话网络的固定或便携式设备。该术语最初 指使用短消息服务 (SMS) 发送的消息。它 已经发展到包括包含图像、视频和声音的消息 内容(称为彩信)。短信的发件人是已知的 作为发短信者,而服务本身有不同的俗语 取决于地区。它可以简单地称为文本 北美、英国、澳大利亚、新西兰和 菲律宾,在欧洲大陆大部分地区发短信,在欧洲大陆发彩信或短信 中东、非洲和亚洲。

【问题讨论】:

  • 请定义“句子”
  • 首先你需要定义“句子”。然后,您需要编写代码将任意字符串输入解析为一个或多个句子。然后你可以简单地按长度对它们进行排序。请阅读How to Ask 并分享您的研究。
  • 基本上“不可能”。您可以拆分. (包括一个空格)以修复.NET 错误(它将它们拆分为2)。然后您可以检查数组中哪个项目的长度最大。
  • 以编程方式确定段落中句子的构成是一项相当复杂的任务。您将不得不处理像.NET 这样的边缘情况,如果您在. 上拆分(一个点后跟一个空格),您将不会正确拆分最后一个句子,如果它后面跟着另一个句子,因为它以@987654327 结尾@ 并且在. 之后缺少空格。
  • 至于您的编辑:没有人说这是不可能的。这不是微不足道的,你需要展示你已经尝试过的东西。我们不是来做你的功课的。您也许可以对第二个示例文本进行简单的实现,但是对于第一个文本,相同的代码将失败,我相信您的老师会为您的代码提供更多创造性的输入。

标签: c#


【解决方案1】:

如果您真的想按句子拆分英文文本(而不仅仅是为了家庭作业),我建议您使用其中一种开源自然语言处理工具,例如 SharpNLP,它是Java OpenNLP 工具。我已经从GitHub 下载了源代码,并在其Test 项目中创建了以下示例。这个程序输出6个句子,最长的句子实际上是第一个句子。

using OpenNLP.Tools.SentenceDetect;

namespace Test
{
    internal class Program
    {
        private static readonly string currentDirectory = Environment.CurrentDirectory + "/../../";

        private static void Main(string[] args)
        {

            var inputText =
                "C#[note 2] (pronounced as see sharp) is a multi-paradigm programming language encompassing strong typing, imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines. It was developed by Microsoft within its .NET initiative and later approved as a standard by Ecma (ECMA-334) and ISO (ISO/IEC 23270:2006). C# is one of the programming languages designed for the Common Language Infrastructure. C# is intended to be a simple, modern, general-purpose, object-oriented programming language.[7] Its development team is led by Anders Hejlsberg. The most recent version is C# 6.0, which was released on July 20, 2015.[8]";
            var sentenceDetector =
                new EnglishMaximumEntropySentenceDetector(currentDirectory + "../Resources/Models/EnglishSD.nbin");
            string[] sentences = sentenceDetector.SentenceDetect(inputText);


            string longest = sentences.OrderByDescending(s => s.Length).First();
        }
    }
}

【讨论】:

  • 这是正确的答案。您不想为重要的任务重新发明轮子,您可以利用其他人通过他们提供的代码或库完成的工作。如果你能适当地激励这一点,老师将不得不接受这一点。如果练习是学习string.Split()方法,那么很遗憾,这是老师期望的“正确”答案,但它不是任何其他意义上的正确答案。
【解决方案2】:

您可以使用string.Split(new string[]{"."},StringSplitOptions.None) 方法来 将字符串拆分为句子数组 然后你可以用 string.Length 选择最长

【讨论】:

  • 不,你不能在点上分割。示例文本中已经包含C# 6.0,这将导致错误匹配。
  • 为什么我不能在点上分割
  • 因为文本中可能存在不表示句尾的点,而且并非所有句子都必须以点结尾。
  • 是的,没错,但是如果他真的需要用句子分割他需要使用点
【解决方案3】:

编辑:编辑问题后。我将采取Guffa's 的答案来拆分字符串并占用最长的时间。

    string lines;

    try
    {   // Open the text file using a stream reader.
        using (StreamReader sr = new StreamReader("TestFile.txt"))
           lines = sr.ReadToEnd();     
    }
    catch (Exception e)
    {
        Console.WriteLine("The file could not be read:");
        Console.WriteLine(e.Message);
    }

    List<string> sentences = Regex.Split("", @"(?<=[\.!\?])\s+").ToList();
    var longestSentences = sentences.Where(s => s.Length == sentences.Max(l => l.Length));
    List<int> indexsOfLongestSentences = new List<int>();

    if(longestSentences.Any())
            indexsOfLongestSentences.AddRange(longestSentences.Select(longestSentence => sentences.IndexOf(longestSentence)));

编辑问题前的回答

这是不正确的方式:

string[] lines = fileText.Split('.');
var line =lines.Max(l=>l.Length);

【讨论】:

  • 一行不一定等于一个句子。这也会错误地将C# 6.0 拆分为两个句子。
  • 但是句子以句号结尾。
  • 不是问句或感叹句。
  • @Joshua 不,由于各种原因,您不能将句子定义为“以句号结尾”。如果您想正确执行此操作,string.Split() 不会在这里提供帮助。
  • 句子以.?! 结尾,后跟至少一个空格或字符串结尾或[...对吗?
【解决方案4】:

没有办法。抱歉,但是当您的文本包含 "within its .NET initiative and later approved""sion is C# 6.0, which " 之类的内容时,确实没有可靠方法来确定实际句子的开始位置和结束时间。

【讨论】:

  • 总有办法的。但并不总是像这种情况那样简单。
  • 您可以在 . 上拆分 . 以解决此问题。几乎总有办法。对我来说唯一的问题是你为什么要这样做。
  • "object-oriented programming language.[7] Its "的情况下不起作用
  • OP 提供的段落很好地说明了为什么您不能可靠地以编程方式确定句子
  • 你们可以随心所欲地标记这个答案,但我仍然 100% 支持它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2015-06-23
  • 2012-10-05
相关资源
最近更新 更多