在句子边界分割文本文件我要处理一个文本文件(电子书)。我想处理它以便每行有一个句子(“换行分隔文件”,嗯?)。我如何使用sedUNIX实用程序来执行此任务?它是否有“句子边界”的符号,如“单词边界”(我认为GNU版本有)。请注意,一个句子可以以句号、省略号、问题或感叹号结尾,最后两个组合在一起(例如,?、!、!?、!!!!!都是有效的“句子终止符”).输入文件的格式使得某些句子包含必须删除的换行符。我考虑过像s/...|这样的脚本。|[!?]+|/n/gs/...|。|[!?]+|/n/g脚本s/...|.|[!?]+|/n/gs/...|。|[!?]+|/n/g(为了更好的阅读而未转义)。但它不会从句子中删除换行符。在C#中怎么样?如果我在sed中使用正则表达式会更快吗?(我想不是)。还有其他更快的方法吗?无论哪种方式(sed或C#)都可以。谢谢。正则表达式是我使用了很长时间的一个不错的选择。一个非常好的正则表达式对我来说很好用上下文。例如,如果我的文本是,美国是一个美妙的国家。大多数人都乐于住在那里。正则表达式方法将在每个时期拆分为5个句子。但我们从逻辑开始,我知道它应该只拆分为两个句子.这就是让我寻找机器学习技术的原因,最终SharpNLP对我来说非常有效。私有字符串mModelPath=@"C:UsersATSDocumentsVisualStudio2012ProjectsGoogle_page_speed_jsonGoogle_page_speed_jsonbinRelease";私有OpenNLP.Tools.SentenceDetect.MaximumEntropySentenceDetectormSentenceDetector;私人字符串[]SplitSentences(字符串段落){如果(mSentenceDetector==null){mSentenceDetector=newOpenNLP.Tools.SentenceDetect。EnglishMaximumEntropySentenceDetector(mModelPath+"EnglishSD.nbin");}返回mSentenceDetector.SentenceDetect(段落);在这个例子中,我使用的是SharpNLP,而我使用的是EnglishSD.nbin——一个用于句子检测的预训练模型。现在,如果我在此方法上应用相同的输入,它会完美地将文本分成两个逻辑句子。您甚至可以使用SharpNLP项目来标记、POSTag、Chuck等。要逐步将SharpNLP集成到您的C#应用程序中,请阅读我写的详细文章。它将向您解释与代码片段的集成。谢谢句子拆分是一个非常重要的问题,机器学习算法已经针对该问题进行了开发。但是拆分[.?!]+和大写字母[A-Z]之间的空格可能是一个很好的启发式方法。首先用tr删除换行符,然后应用RE:tr'rn'''|sed's/([.?!])ss*([AZ])/1n2/g'输出应该是每行一个句子。如果发现错误,请检查输出并优化RE。(例如,Ed先生会被错误处理。可能会编译此类缩写的副本。)C#还是sed更快只能通过实验确定。您可以使用类似这样的方法来提取句子:varsentences=Regex.Matches(input,@"[w,]+[.!?]+")foreach(Matchmatchinsentences){Console.WriteLine(match.Value);这应该匹配包含单词、空格和逗号并以(任意数量的)句点、感叹号和问号结尾的句子。您可以查看我的教程http://code.google.com/p/graph-expression/wiki/SentenceSplitting基本思想是在每次拆分时都有拆分字符和不可能的前置/后置条件。Tjis简单的启发式方法非常有效。您感兴趣的任务通常称为“句子分割”。正如larsmans所说,这是一个非常重要的问题,但启发式方法通常表现得很好,至少在英语中是这样。听起来您主要对英语感兴趣,因此已经提供的正则表达式试探法可能会满足您的需要。如果您想要更准确的解决方案(以更高的复杂性为代价),您可以考虑使用开源NLP框架LingPipe。我对LingPipe很满意,我已经用过几次了。有关句子分割的详细教程,请参见http://alias-i.com/lingpipe/demos/tutorial/sentences/read-me.html。以上就是C#学习教程:在句子边界拆分文本文件,分享全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
