在句子边界处拆分文本文件
我必须处理一个文本文件(电子书)。 我想处理它,以便每行有一个句子(“换行符分隔文件”,是吗?)。 如何使用sed UNIX实用程序执行此任务? 它是否具有“句子边界”的符号,如“单词边界”的符号(我认为GNU版本具有该符号)。 请注意,句子可以以句点,省略号,问题或感叹号结尾,最后两个组合(例如,?,!,!?,!!!!!都是有效的“句子终结符”)。 输入文件的格式使得某些句子包含必须删除的换行符。
我想过像s/...|. |[!?]+ |/n/g
这样s/...|. |[!?]+ |/n/g
剧本s/...|. |[!?]+ |/n/g
s/...|. |[!?]+ |/n/g
(未转义为更好的阅读)。 但它并没有从句子中删除换行符。
在C#怎么样? 如果我使用sed中的正则表达式会更快吗? (我想不是)。 还有其他更快的方法吗?
无论哪种方式(sed或C#)都没问题。 谢谢。
正则表达式是我长期使用的一个很好的选择。
一个非常好的正则表达式对我来说很好
string[] sentences = Regex.Split(sentence, @"(?<=['""A-Za-z0-9][.!?])s+(?=[AZ])");
但是,正则表达式效率不高。 此外,虽然逻辑适用于理想情况,但它在生产环境中效果不佳。
例如,如果我的文字是,
美国是一个美好的国家。 大多数人都很高兴生活在那里。
正则表达式方法将在每个句点分割为5个句子。 但我们从逻辑上知道它应该只分成两个句子。
这就是让我寻找机器学习技术的原因,最后SharpNLP对我来说非常好。
private string mModelPath = @"C:UsersATSDocumentsVisual Studio 2012ProjectsGoogle_page_speed_jsonGoogle_page_speed_jsonbinRelease"; private OpenNLP.Tools.SentenceDetect.MaximumEntropySentenceDetector mSentenceDetector; private string[] SplitSentences(string paragraph) { if (mSentenceDetector == null) { mSentenceDetector = new OpenNLP.Tools.SentenceDetect.EnglishMaximumEntropySentenceDetector(mModelPath + "EnglishSD.nbin"); } return mSentenceDetector.SentenceDetect(paragraph); }
在这个例子中,我使用了SharpNLP,其中我使用了EnglishSD.nbin - 一个用于句子检测的预训练模型。
现在,如果我在此方法上应用相同的输入,它将完美地将文本拆分为两个逻辑句子。
你甚至可以使用SharpNLP项目来标记,POSTag,Chuck等。
要将SharpNLP逐步集成到您的C#应用程序中,请阅读我编写的详细文章。 它将向您解释与代码片段的集成。
谢谢
句子分裂是一个非常重要的问题,已经开发出了机器学习算法。 但是在[.?!]+
和大写字母[AZ]
之间的空格上分裂可能是一个很好的启发式方法。 首先用tr
删除换行符,然后应用RE:
tr 'rn' ' ' | sed 's/([.?!])ss*([AZ])/1n2/g'
输出应该是每行一个句子。 如果发现错误,请检查输出并优化RE。 (例如, mr. Ed
会被error handling。也许会编译一份这样的缩写。)
C#或sed
是否更快只能通过实验确定。
你可以使用这样的东西来提取句子:
var sentences = Regex.Matches(input, @"[w ,]+[.!?]+") foreach (Match match in sentences) { Console.WriteLine(match.Value); }
这应该匹配包含单词,空格和逗号并以(任意数量)句号,感叹号和问号结尾的句子。
您可以查看我的教程https://code.google.com/p/graph-expression/wiki/SentenceSplitting基本思路是在每次拆分时都有拆分字符和不可能的前/后条件。 Tjis简单的启发式工作非常好。
您感兴趣的任务通常被称为“句子分割”。 正如larsmans所说,这是一个非常重要的问题,但启发式方法通常表现得相当不错,至少在英语方面如此。
听起来您主要对英语感兴趣,因此已经呈现的正则表达式启发式可以满足您的需求。 如果您想要一个更准确的解决方案(以更高的复杂性为代价),您可以考虑使用LingPipe,一个开源的NLP框架。 我用LingPipe运气很好,我用过它几次。
有关句子分段的详细教程,请参见https://alias-i.com/lingpipe/demos/tutorial/sentences/read-me.html 。
上述就是C#学习教程:在句子边界处拆分文本文件分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1031040.html