当前位置: 首页 > 面试题库 >

如何调整NLTK句子标记器

郎俊雅
2023-03-14
问题内容

我正在使用NLTK来分析一些经典文本,并且遇到麻烦按句子标记文本的麻烦。例如,这是我从 Moby
Dick
获得的摘录的内容:

import nltk
sent_tokenize = nltk.data.load('tokenizers/punkt/english.pickle')

'''
(Chapter 16)
A clam for supper? a cold clam; is THAT what you mean, Mrs. Hussey?" says I, "but
that's a rather cold and clammy reception in the winter time, ain't it, Mrs. Hussey?"
'''
sample = 'A clam for supper? a cold clam; is THAT what you mean, Mrs. Hussey?" says I, "but that\'s a rather cold and clammy reception in the winter time, ain\'t it, Mrs. Hussey?"'

print "\n-----\n".join(sent_tokenize.tokenize(sample))
'''
OUTPUT
"A clam for supper?
-----
a cold clam; is THAT what you mean, Mrs.
-----
Hussey?
-----
" says I, "but that\'s a rather cold and clammy reception in the winter time, ain\'t it, Mrs.
-----
Hussey?
-----
"
'''

考虑到梅尔维尔(Melville)的语法有些陈旧,我不希望在这里达到完美,但是NLTK应该能够处理终端双引号和标题,例如“
Mrs”。但是,由于令牌生成器是无监督训练算法的结果,所以我不知道该如何进行修补。

有人建议使用更好的句子标记器吗?我更喜欢可以破解的简单启发式方法,而不必训练自己的解析器。


问题答案:

您需要向令牌生成器提供缩写列表,如下所示:

from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktParameters
punkt_param = PunktParameters()
punkt_param.abbrev_types = set(['dr', 'vs', 'mr', 'mrs', 'prof', 'inc'])
sentence_splitter = PunktSentenceTokenizer(punkt_param)
text = "is THAT what you mean, Mrs. Hussey?"
sentences = sentence_splitter.tokenize(text)

现在的句子是:

['is THAT what you mean, Mrs. Hussey?']

更新:如果句子的最后一个单词附有撇号或引号(例如 Hussey?’
),则此方法不起作用。因此,一种快速而又肮脏的方法是在撇号和引号之前加上空格,并在句子结尾的符号(。!?)之后:

text = text.replace('?"', '? "').replace('!"', '! "').replace('."', '. "')


 类似资料:
  • 问题内容: 我正在使用nltk,因此我想创建自己的自定义文本,就像nltk.books上的默认文本一样。但是,我只是想起像 我想发现任何输入“文本”的方式: python或nltk的哪种方法允许我执行此操作。更重要的是,我如何消除标点符号? 问题答案: 这实际上是在nltk.org的主页上:

  • 问题内容: 我试图将整个段落输入到我的文字处理器中,然后先分成句子,然后再分成单词。 我尝试了以下代码,但它不起作用, 但是,这不起作用,并给我错误。那么,如何将段落标记为句子,然后再标记为单词? 一个示例段落: 这东西似乎使那只黑褐色的小狗感到吃惊和震惊,使他伤心。 他绝望地沉在孩子的脚下。当重击一声再加上幼稚的训诫时,他转过身来,用独特的方式握住了爪子。同时,他用耳朵和眼睛向孩子祈祷。 警告:

  • Spacy的pos-tagger非常方便,它可以直接标记原始句子。 但我使用的是中的标记器。那么,如何使用像这样的标记化句子,而不是用'I am eating'作为Spacy的标记呢? 顺便说一句,我在哪里可以找到详细的Spacy留档?我只能在官网链接上找到概述 谢谢

  • 问题内容: 我正在尝试创建一种类似于英语的小型语言来指定任务。基本思想是将陈述分为动词和名词短语,这些动词应适用于它们。我正在使用nltk,但未获得我希望的结果,例如: 在每种情况下,它都未能意识到第一个单词(选择,移动和复制)被用作动词。我知道我可以创建自定义标签和语法来解决此问题,但是与此同时,当很多此类东西不在我的支持范围内时,我犹豫要重新发明轮子。我特别希望可以同时处理非英语语言的解决方案

  • 我使用OpenNLP Java API进行句子标记化,它使用空格字符来标记句子,并拆分每个单词。 有没有什么方法可以让我跳过一些特定单词的分词或标记化。 例如在句子中。“一只敏捷的棕色狐狸跳过懒狗”。OpenNLP将句子拆分/标记为 一只 快速 棕色 狐狸 跳过 懒惰的 狗 我想跳过单词“Quick brown Fox”和“Lazy Dog”的标记化,因此预期的输出将是 一只 快速的棕色狐狸 跳过

  • 请参考截图。我想把图标放在确切的蓝点。 我使用下面的代码来显示地图中的图标。 我不想删除蓝点(GoogleMap.SetMyLocationEnabled)。我想把图标放在那个蓝点上。