我意识到这是一个广泛的主题,但我正在寻找一个很好的入门,从文本解析意义,理想情况下在Python中。作为我要做的事情的一个例子,如果用户创建一个博客帖子,如:
“曼尼·拉米雷斯今天回击道奇队对阵休斯顿太空人队”,
什么是轻量/轻松的方式从名词中取出名词?首先,我认为我将其限制为专有名词,但我不想仅限于此(我不想依赖于一个简单的正则表达式,假设任何标题上限是一个专有名词)。
为了使这个问题更糟糕,我不会问我应该做什么?我需要一个现有单词的语料库来开始吗?为了使这项工作,我需要知道什么词法分析?我确实遇到过关于这个话题的one other question,现在我正在挖掘这些资源。
使用NLTK,特别是chapter 7 on Information Extraction.
你说你想提取意义,并且有语义分析的模块,但我认为IE就是你所需要的 - 老实说,NLP计算机现在可以处理的唯一领域之一。
请参阅7.5和7.6关于命名实体识别的子主题(将Manny Ramerez作为一个人进行分类和分类,Dodgers作为体育组织,将Houston Astros作为另一个体育组织,或任何适合您的域名)和关系提取。一旦安装了NLTK,就可以插入一个NER chunker。从他们的例子中,提取一个地缘政治实体(GPE)和一个人:
>>> sent = nltk.corpus.treebank.tagged_sents()[22]
>>> print nltk.ne_chunk(sent)
(S
The/DT
(GPE U.S./NNP)
is/VBZ
one/CD
...
according/VBG
to/TO
(PERSON Brooke/NNP T./NNP Mossman/NNP)
...)
请注意,您仍然需要知道标记化和标记,如前面章节中所述,以使这些IE任务的文本格式正确。
你需要看看Natural Language Toolkit,这正是这种事情。
本手册的这一部分看起来非常相关:Categorizing and Tagging Words - 这是一个摘录:
>>> text = nltk.word_tokenize("And now for something completely different")
>>> nltk.pos_tag(text)
[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'),
('completely', 'RB'), ('different', 'JJ')]
在这里,我们看到了CC,这是一个协调的结合;现在和完全是RB或副词;因为是IN,一个介词; NN是一个名词;不同的是形容词JJ。
自然语言处理(NLP)是解析的名称,也就是自然语言。存在许多算法和启发式算法,它是一个活跃的研究领域。无论您将编码什么算法,都需要在语料库上进行训练。就像人类一样:我们通过阅读其他人写的文本(和/或通过听别人说出的句子)来学习语言。
实际上,看看Natural Language Toolkit。无论您要编写什么代码,理论基础都可以通过Chris Manning和HinrichSchütze查看Foundations of Statistical Natural Language Processing。
(来源:stanford.edu)
这是我最近偶然发现的那本书:Natural Language Processing with Python
这是一个非常复杂的话题。一般来说,这种东西属于自然语言处理的范畴,并且往往是最棘手的。这种东西的难度正是为什么还没有完全自动化的系统来处理客户服务等。
一般来说,这种东西的方法确实取决于你的问题域是什么。如果你能够解决问题领域,你可以获得一些非常严重的好处;使用你的例子,如果你能够确定你的问题域是棒球,那么这将给你一个非常强大的开端。即便如此,要做任何特别有用的事情还有很多工作要做。
对于它的价值,是的,现有的单词语料库将是有用的。更重要的是,确定系统预期的功能复杂性将是至关重要的;你需要解析简单的句子,还是需要解析复杂的行为?你能将输入约束到一个相对简单的集合吗?
正则表达式在某些情况下可以提供帮这是一个详细的例子:What’s the Most Mentioned Scanner on CNET Forum,它使用正则表达式在CNET论坛帖子中查找所有提到的扫描程序。
在帖子中,使用了正则表达式:
(?i)((?:\w+\s\w+\s(?:(?:(?:[0-9]+[a-z\-]|[a-z]+[0-9\-]|[0-9])[a-z0-9\-]*)|all-in-one|all in one)\s(\w+\s){0,1}(?:scanner|photo scanner|flatbed scanner|adf scanner|scanning|document scanner|printer scanner|portable scanner|handheld scanner|printer\/scanner))|(?:(?:scanner|photo scanner|flatbed scanner|adf scanner|scanning|document scanner|printer scanner|portable scanner|handheld scanner|printer\/scanner)\s(\w+\s){1,2}(?:(?:(?:[0-9]+[a-z\-]|[a-z]+[0-9\-]|[0-9])[a-z0-9\-]*)|all-in-one|all in one)))
为了匹配以下任何一个:
结果,从帖子中提取的文字就像,
- 停用HP C9900A照片扫描仪
- 扫描他的旧X光片
- 全新爱普生V700扫描仪
- HP ScanJet 4850扫描仪
- 爱普生Perfection 3170扫描仪
这种正则表达式解决方案在某种程