我目前正在开发一个工具,旨在检测文本中的地址(或任何模式,如工作、运动队或其他)。
我目前的做法是:
1/ 将文本分词
2/ 对词进行词干提取
用户可以创建类别(工作、运动队、地址等),并手动将句子分配给类别。
该句子的每个词干词将存储在数据库中,并更新其分数(+1)。
当我浏览新的文档时,我将根据其中的所有词计算每句话的分数。
示例:
我住在布朗街,伦敦
=> (live+1, Brown +1, Street+1, London+1)
然后下次我看到
我住在橙色街,伦敦分数将是3(live +1, Street+1, London+1),所以我可以说“这句话可能是地址”。如果用户确认,我会更新词(live+1, orange+1, street+1, london+1)。如果他说“不准确”,所有词的分数都会降低。
我认为通过更多的运行,我将能够检测到地址,因为“Street”和“London”将有较高的分数(邮政编码等也是如此)。
我的问题是:
首先,你觉得这种方法怎么样?其次,这种方法忽略了上下文。一句包含“Street”和“London”的句子应该有更高的分数。这意味着如果我在同一个句子中检测到“Street”和“London”,我们可以认为这是一个地址。
我如何将这些信息存储在数据库中?我目前使用的是关系数据库(MySQL),但我担心如果存储每个词之间的链接,数据量会变得非常大。
这是我们所说的神经网络吗?存储的最佳方法是什么?
你有什么建议来提升我的检测算法吗?
回答:
为每个词分配分数的想法是合理的,但我建议采用更标准的机器学习方法。
例如,你可以使用词袋技术将每句话转换为向量。之后,你可以对数据进行分类器拟合(你可以尝试一些简单的方法,如朴素贝叶斯。这对于文本分类效果很好,特别是当样本数量较少时)。
具体细节取决于你最初的数据量以及你每天从用户那里接收的数据量。如果你有大量数据且新数据量很小,你可以只在这些数据上训练模型,并使用新数据进行预测。如果你获得了大量新样本,可能使用支持在线学习的模型会更好。还有一种“中间方法”:你可以在获得一批新样本后重新训练分类器(你可以调整批次的大小)。这样,新样本会被考虑在内,但你不需要为每个新样本重新训练模型。
再次强调,我建议从标准的句子向量化方法开始(例如,计数向量化),并使用支持在线学习(或至少批量更新)的简单分类器。
这样,你只需要存储模型的参数,而不是所有用户输入,因此数据量不会增加。