【发布时间】:2016-02-26 10:45:33
【问题描述】:
我在 StringBuilder(sb) 中使用我在互联网上找到的这段代码获得了重复的字数,据作者说,它真的像 Word 的字数计数器一样一致。
StringBuilder wordBuffer = new StringBuilder();
int wordCount = 0;
// 1. Build the list of words used. Consider ''' (apostrophe) and '-' (hyphen) a word continuation character.
Dictionary<string, int> wordList = new Dictionary<string, int>();
foreach (char c in sb.ToString())
{
if (char.IsLetter(c) || c == '\'' || c == '-')
{
wordBuffer.Append(char.ToLower(c));
}
else
{
if (wordBuffer.Length > 3)
{
int count = 0;
string word = wordBuffer.ToString();
wordList.TryGetValue(word, out count);
wordList[word] = ++count;
wordBuffer.Clear();
wordCount++;
}
}
}
这是我的示例文本:
绿藻(单数:green alga)是一种大型的非正式藻类群,由叶绿藻和轮藻藻组成,它们现在被划分为不同的部门。 陆生植物或胚胎植物(高等植物)被认为是从轮生植物中出现的。 [1]由于胚芽植物不是藻类,因此被排除在外,因此绿藻是一个并系群。然而,包括绿藻和胚芽植物的进化枝是单系的,被称为绿色植物进化枝和植物界。绿藻包括单细胞和群落鞭毛虫,大多数每个细胞有两个鞭毛,以及各种群落、球状和丝状形式,以及宏观的多细胞海藻。在高等植物的近亲 Charales 中,发生了组织的完全细胞分化。大约有 8,000 种绿藻。 [2]许多物种大部分时间都以单细胞形式生活,而其他物种则形成coenobia(菌落)、长丝或高度分化的宏观海藻。 其他一些生物依靠绿藻为它们进行光合作用。 euglenids 和 chlorarachniophytes 中的叶绿体是从摄入的绿藻中获得的,[1] 并且在后者中保留了一个核形体(残留核)。绿藻也与纤毛虫草履虫、Hydra viridissima 和扁虫共生。某些绿藻种类,特别是 Trebouxiophyceae 和 Trentepohlia(Ulvophyceae 类)属的 Trebouxia 属,可以与真菌共生并形成地衣。一般来说,与地衣合作的真菌物种不能独立生活,而藻类物种通常在没有真菌的情况下生活在自然界中。 Trentepohlia 是一种丝状绿藻,可以在潮湿的土壤、岩石或树皮上独立生活,也可以在 Graphidaceae 的地衣中形成光共生体。
对于我的示例文本,我在第一行中得到了 green 和 algae 字样,如预期的那样.
问题是,我不仅需要单个单词,还需要单词组。对于这个示例文本,我也想要 green algae 词,以及 green 和 藻类 字。
而我的可选问题是:我需要高性能,因为文本可能很长。正如我研究的那样,在这种情况下使用 RegEx 的性能并不高,但我不确定是否有第二种方法可以使它成为可能。
提前致谢。
更新 如果你明白我的意思,你不需要阅读这些行。
由于我看到太多关于我的“组”定义的 cmets 不清楚,我想我需要更详细地说明我的观点,我希望在 cmets 部分写下这些行,但对于这次更新来说,这有点狭窄。首先,我知道 StackOverflow 不是编码服务。我试图在一篇文章中找到最常用的词组,并试图确定文章是关于什么的,我们也可以称之为标签生成器。为此,我试图找到最常用的单词,一开始还可以。然后我意识到这不是决定主题的好方法,因为我不能假设这篇文章只是关于第一个词或第二个词。在我的例子中,我不能说这篇文章只是关于 green 或 algae,因为它们在这里有共同的意义,而不是单独的。如果我用一篇关于像“海伦娜·伯翰·卡特”这样的三位名人的文章来尝试这个(如果我假设它在文章中写了全名,而不仅仅是姓氏),我想把这些词放在一起,而不是一一列举。我正在尝试实现更聪明的算法,该算法以最准确的方式一次猜测主题。我不想限制字数,因为文章可能是关于“联合国工业发展组织”的(我再次假设它现在在文章中写成“UNIDO”)。我可以通过尝试让每个单词组从任何索引开始到任何长度的文本结尾来实现这一点。好吧,这确实不是一个好方法,尤其是对于长文本,但这并非不可能,对吧?但我一直在寻找一种更好的方法来做到这一点,我只是询问了一个更好的算法想法和最好的工具,我可以自己编写代码。我希望我最终明确了我的目标。
【问题讨论】:
-
正则表达式帮不了你。我相信你需要一些术语提取算法。
-
不知道什么可以帮助你,因为我在工作中使用付费 MT 软件。
-
你的问题不清楚。请再次阅读我的第一条评论以及@galakt 的评论。我们都要求您定义词组的含义。仅仅说它不止一个词并不是一个定义。或者,如果您尝试在词组中编写一些代码,那么我们也许能够理解您想要什么。
-
@ErtürkÖztürk - 出于这个原因,组中的单词数量很重要。我想得到所有的词组,所以我抓住了文本中的第一个说 10 个词。那是一个群体。与文本中的前 11 个单词一样。它与第一组不同,因为它有一个额外的单词,但它确实包含前一组中的 10 个单词。您必须将词组定义为一个死板的概念,否则您不知道如何知道一个组从哪里开始和结束。
-
@ErtürkÖztürk - 组中的单词数量会产生很大的不同。如果您有 1,000,000 个单词并且您允许任何长度的单词组,那么您就有 500,000,000,500,000,000 个单词组。它可以很快变得很长。如果事实每次字数增加 10 倍,那么字组的数量就会增加近 100 倍。