我需要建模一组n-gram(n个单词的序列)及其上下文(n-gram附近出现的单词及其频率).我的想法是这样的:
public class Ngram {
private String[] words;
private HashMap<String, Integer> contextCount = new HashMap<String, Integer>();
}
Run Code Online (Sandbox Code Playgroud)
然后,对于所有不同的n-gram的计数,我使用另一个Hashmap,比如
HashMap<String, Ngram> ngrams = new HashMap<String, Ngram>();
Run Code Online (Sandbox Code Playgroud)
我在接收文本时添加它.问题是,当n-gram的数量超过10,000左右时,JVM Heap会填满(它设置为最大1.5GB),而且一切都变得非常糟糕.
有没有更好的方法来做到这一点,以避免这种内存消耗?此外,n-gram之间的上下文应该很容易比较,我不确定我的解决方案是否可行.
我有一个包含文章,活动和人物的模型:
class Person(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=30)
class Event(models.Model):
id = models.IntegerField(primary_key=True)
title = models.CharField(max_length=200)
class Article(models.Model):
id = models.IntegerField(primary_key=True)
title = models.CharField(max_length=200)
publishDate = models.DateTimeField(blank=True, null=True)
event = models.ForeignKey(Event, blank=False, null=False)
persons = models.ManyToManyField(Person)
Run Code Online (Sandbox Code Playgroud)
一篇文章属于一个事件,事件由许多文章组成.许多文章和文章中出现的人包含许多人.我们的想法是在给定的时间间隔内查看哪些事件最多.我在一个查询中做到了这一点:
topEvents = Article.objects.filter(publishDate__gt=dateStart)
.filter(publishDate__lt=dateEnd)
.values('event').annotate(count=Count('id'))
.order_by('-count')[:topN]
Run Code Online (Sandbox Code Playgroud)
我发现这比计算前N个服务器端要少得多.
现在,问题是,我如何处理与人类的ManyToMany关系?另外,这是最好的方法吗?