回答者:宁教授网络空间元宇宙日期:06月14日·网络空间北京市国际科技合作基地主任 北科大教授

判断一个句子是否是问句,是一个二分类问题。

1. 构造标注数据集。 首要问题是构造分类所需要的标注数据。 标注数据的获得非常简单,拿到一批标点使用比较规范的文档就行,比如学生作文、官方新闻稿。把所有文章分句,拿到每个句子的最后一个标点符号,如果是问号,就是正样本,否则是负样本。

2. 分词,去除停用词。 对每个样本分词,使用词作为特征,为了提升效果,还可以使用词级别的ngram特征。你可能需要去掉“的”“你”“这”等停用词,但是注意一定不要把语气词(“吧”、“吗”)也去掉。

3. 特征选择。 使用传统的特征选择方法(DF、信息增益、卡方统计等),筛选出跟类别最相关的N个词。

4. 特征权重计算。 使用TFIDF作为特征权重,将每句话表示为一个N维向量。

5. 选择分类器。 选择你想使用的分类器,常见的LR、SVM、决策树都行。

6. 将数据划分训练集,测试集,在训练集上训练模型,在测试集上评估模型。 不断调节模型参数,使得模型在测试集上F1最高。

7. 对于一个新的输入句子,使用你训练的模型预测。

但是上面模型存在一些缺点:

1. 词袋法丢失语序信息。比如“吧”出现在句子尾部跟首部,可能结果完全不一样。

2. 复杂的句子需要结合更多的上下文来判断。这个楼里同学提到过。 为了克服这些缺点,可以尝试用深度学习,卷积网络捕捉语序,也可以把前后几个句子向量和当前句子向量拼接起来。 实际上,配几个规则更为直接有效。 比如,句子最后一个字是“吗”基本上是就是问句了,最后一个字是“呢”就不是疑问句。 常见的问句分为:疑问句、反问句、设问句等。每种问句都有自己常见的句式。比如“是…,还是…”,“能…么”。

回答者:编程颂日期:2018年03月01日

问题是一个简单问题,二分类。

场景需要具体分析,是段落中的一句话呢,是单句分析呢,标点是否存在么。每一个场景的难度复杂程度和产生歧义的概率并不相同。有一些情况人都很难判断,更不要说机器人来分类了。

怎么这么黑?
怎么这么黑。

上面两句话如果不带标点的话,只凭单句字面基本无法判断。


目前在序列建模领域最常使用的方法就是LSTM以及它的一系列变体了,输入变量使用常用的word2vec进行词向量训练,对于文本长度较长的场景,使用biLSTM+CNN+pooling layer的方式通常会取得较好效果,对于文本长度较短的场景,不妨使用biLSTM进行训练。

需要注意的是对于本文场景,对于标点的依赖程度很大,需要将标点也纳入到词向量训练之中,并将标点和其他词同等看待。