使用NLTK查找不完整句子中的主题

时间:2012-01-12 20:08:03

标签: python nlp nltk

我有一份产品清单,我试图将其归类为类别。他们将用不完整的句子来描述,如:

"固态硬盘外壳"

"硬盘线"

" 1TB Hard Drive"

" 500GB硬盘,由制造商翻新"

如何使用python和NLP获取类似" Housing,Cable,Drive,Drive"或者描述哪个词正在修改哪一个的树? 提前谢谢

4 个答案:

答案 0 :(得分:2)

NLP技术相对不适合处理这种文本。

换句话说:很有可能构建一个包含NLP流程的解决方案来实现所需的分类器,但增加的复杂性不一定会在开发速度和分类器精度改进方面得到回报。 如果一个人真的坚持使用NLP技术,POS标记及其识别名词的能力是最明显的想法,但是Chunking和访问WordNet或其他词汇来源是NLTK的其他合理用途。

相反,基于简单正则表达式的特殊解决方案以及 NoBugs 建议的一些启发式方法可能是解决问题的合适方法。当然,这样的解决方案有两个主要风险:

  • 过度拟合在制定规则时审查/考虑的部分文本
  • 如果引入太多规则和子规则,解决方案可能会出现混乱/复杂性。

对要考虑的文本的完整(或非常大的样本)进行一些简单的静态分析应该有助于指导一些启发式的选择,并避免过度拟合的问题。我很确定与自定义词典相关的相对少量的规则应该足以产生具有适当精度以及速度/资源性能的分类器。

一些想法:

  • 在一个大小的语料库中计算所有单词(可能还有所有的二元组和三元组)。此信息可以通过允许将最大努力和最严格的规则分配给最常见的模式来推动分类器的设计。
  • 手动引入一个短词典,将最流行的词汇与:
    • 他们的POS功能(这里主要是二元函数:即名词与修饰语和其他非名词。
    • 他们的同义词根[如果适用]
    • 他们的班级[如适用]
  • 如果模式适用于大多数输入文本,请考虑在文本结尾之前或第一个逗号之前使用最后一个单词作为类选择的主键。 如果模式不成立,只需给予第一个和最后一个单词更多的权重。
  • 考虑第一遍,其中文本被重写,最常见的bi-gram被单个单词(甚至是人工代码字)替换,将在字典中
  • 还考虑用相应的同义词根替换最常见的拼写错误或同义词。在输入中添加规律性有助于提高精确度,并且还有助于使字典中的一些规则/一些条目具有很高的精确度。
  • 对于在字典中找不到的单词,假设与数字混合和/或以数字开头的单词是修饰符,而不是名词。假设
  • 考虑两层分类,其中不能合理地分配类的输入被放入“手动堆”中以提示额外的检查,这导致额外的规则和/或词典条目。经过几次迭代后,分类器应该需要越来越少的改进和调整。
  • 寻找不明显的功能。例如,一些语料库由混合源构成,但是一些源可以包括有助于识别源和/或可用作分类提示的特定规则。例如,某些源可能只包含大写文本(或文本通常长于50个字符,或末尾有截断的文字等)。

我担心这个答案不能提供Python / NLTK片段作为解决方案的入门,但坦率地说,这种简单的基于NLTK的方法可能会令人失望。此外,我们应该有一个更大的输入文本样本集来指导选择合理的方法,包括基于NLTK或NLP技术的方法。

答案 1 :(得分:1)

我会手动创建一个名词列表,包含您要查找的所有名词,或者解析一个字典,例如this one。除了名词之外的所有内容都至少会让你进入“状态驱动器”,“驱动器电缆”或“驱动器”,在第一个标点符号后忽略所有内容。

答案 2 :(得分:0)

pip install spacy

python -m spacy下载zh 进口杂货

nlp = spacy.load('en')
sent = "INCOMEPLETE SENTENCE HERE"
doc=nlp(sent)
sub_toks = [tok for tok in doc if (tok.dep_ == "ROOT") ]

示例:

sent = "Solid State Drive Housing"
doc=nlp(sent)
sub_toks = [tok for tok in doc if (tok.dep_ == "ROOT") ]

输出:[房屋]

sent = "Hard Drive Cable"
doc=nlp(sent)
sub_toks = [tok for tok in doc if (tok.dep_ == "ROOT") ]

输出:[电缆]

sent = "1TB Hard Drive"
doc=nlp(sent)
sub_toks = [tok for tok in doc if (tok.dep_ == "ROOT") ]

输出:[驱动器]

sent = "500GB Hard Drive, Refurbished from Manufacturer"
doc=nlp(sent)
sub_toks = [tok for tok in doc if (tok.dep_ == "ROOT") ]

输出:[驱动器]

答案 3 :(得分:0)

用不完整的句子替换文本。

import spacy
import en_core_web_sm
nlp = spacy.load('en_core_web_sm')
sentence = "I need to be able to log into the Equitable siteI tried my username and password from the AXA Equitable site which worked fine yesterday but it won't allow me to log in and when"
nlp_doc=nlp(sentence)
subject = [tok for tok in nlp_doc if (tok.dep_ == "nsubj") ]
print(subject)