我正在进行一个小型研究项目。我希望编写一个程序,该程序可以a) 处理大量短文本(每篇约100词,共几千篇)b) 识别文本中的关键词c) 将所有关键词呈现给一组用户,让他们指出是否觉得这些关键词有趣d) 让软件学习哪些关键词或组合可能更受欢迎。假设在这个例子中,目标群体是统一的。
现在,有两个主要挑战。第一个我已经有了答案,第二个我正在寻求帮助。
1) 关键词识别。逆频分析似乎是这里的解决方法。识别那些在给定文本中相对于其他文本出现比例较高的词。不过,这也有一些缺点,例如非常常见的关键词可能会被忽略。
2) 如何将数据集准备成数值形式。我可以将关键词映射到输入神经元,然后根据它们的相对频率调整值,但这限制了模型的灵活性,并且难以添加新的关键词。如果我们想扩展到几十个关键词之外,这也会很快变得竞争性地昂贵。
这个问题通常是如何解决的?
回答:
这是一个开始的方法:
- 清理你的输入文本(移除特殊标记等)
- 使用n-gram作为特征(可以从1-gram开始)。
- 将用户的反馈“是否喜欢”视为二元标签。
- 学习一个二元分类器(任何模型都可以,朴素贝叶斯、逻辑回归)。
1) 关键词识别。逆频分析似乎是这里的解决方法。识别那些在给定文本中相对于其他文本出现比例较高的词。不过,这也有一些缺点,例如非常常见的关键词可能会被忽略。
在你构建的第一个模型中,你可以跳过这一部分。将句子视为词袋(n-gram)以简化第一个工作模型。如果你愿意,你可以稍后将其作为特征权重添加。
2) 如何将数据集准备成数值形式。我可以将关键词映射到输入神经元,然后根据它们的相对频率调整值,但这限制了模型的灵活性,并且难以添加新的关键词。如果我们想扩展到几十个关键词之外,这也会很快变得竞争性地昂贵。
你可以使用一个字典将n-gram映射到整数ID。对于每个训练示例,特征将是稀疏的,因此你的训练示例可能如下所示:
34, 68, 79293, 23232 -> 0 (负标签)340, 608, 3, 232 -> 1 (正标签)假设你有一个字典(或词汇表)映射:3: foo34: movie68: in-stock232: bar340: barz...
要使用神经网络,你需要有一个嵌入层,通过聚合(例如,平均)所有特征的嵌入向量,将稀疏特征转换为密集特征。使用上面的相同示例,假设我们只使用4维嵌入:
34 -> [0.1, 0.2, -0.3, 0]68 -> [0, 0.1, -0.1, 0.2]79293 -> [0.3, 0.0, 0.12, 0]23232 -> [0.4, 0.0, 0.0, 0]------------------------------- sumsum -> [0.8, 0.3, -0.28, 0.2]------------------------------- L1-normalizel1 -> [0.8, 0.3, -0.28, 0.2] ./ (0.8 + 0.3 + 0.28 + 0.2) -> [0.51,0.19,-0.18,0.13]
在预测时,你需要使用字典和相同的方式进行特征提取(清理/n-gram生成/将n-gram映射到ID),这样你的模型才能理解输入。