Linq关键字提取-限制提取范围
关于此解决方案。
有没有办法限制要考虑的关键字数量?例如,我只想计算文本的前 1000 个单词。 Linq 中有一个“Take”方法,但它有不同的目的 - 将计算所有单词,并返回 N 条记录。正确地做到这一点的正确选择是什么?
With regards to this solution.
Is there a way to limit the number of keywords to be taken into consideration? For example, I'd like only first 1000 words of text to be calculated. There's a "Take" method in Linq, but it serves a different purpose - all words will be calculated, and N records will be returned. What's the right alternative to make this correctly?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(3)
Enumerable.Take
实际上确实会输出结果;它不会完全缓冲其源代码,然后仅返回前 N 个。不过,看看您的原始解决方案,问题是您想要执行 Take
的输入是 字符串.Split。不幸的是,这个方法不使用任何类型的延迟执行;它急切地创建一个包含所有“分割”的数组,然后返回它。
因此,从某些文本中获取流式单词序列的技术类似于:
var words = src.StreamingSplit() // you'll have to implement that
.Take(1000);
但是,我确实注意到查询的其余部分是:
...
.GroupBy(str => str) // group words by the value
.Select(g => new
{
str = g.Key, // the value
count = g.Count() // the count of that value
});
请注意 GroupBy
是一个缓冲操作 - 您可以预计来自其源的所有 1,000 个单词最终都会存储在通过管道输出的过程中的某个位置。
在我看来,选项是:
- 如果您不介意出于分割的目的遍历所有文本,那么
src.Split().Take(1000)
很好。缺点是浪费时间(在不再需要后继续拆分)和浪费空间(将所有单词存储在数组中,即使只有前 1,000 个单词)。但是,查询的其余将不会对超出必要的单词进行操作。 - 如果由于时间/内存限制而无法执行 (1),请使用 src.StreamingSplit().Take(1000) 或等效方法。在这种情况下,在找到 1,000 个单词后,将不再处理任何原始文本。
请注意,在这两种情况下,这 1,000 个单词本身最终都会被 GroupBy
子句缓冲。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
只需提前应用
Take
- 在调用Split
之后立即应用:Simply apply
Take
earlier - straight after the call toSplit
: