我正在使用Python的nltk,我希望对包含引号的句子进行标记,但它会将"
变为``
和''
。
E.g:
>>> from nltk import word_tokenize
>>> sentence = 'He said "hey Bill!"'
>>> word_tokenize(sentence)
['He', 'said', '``', 'hey', 'Bill', '!', "''"]
为什么不保留原始句子中的引号以及如何解决这个问题?
谢谢
答案 0 :(得分:2)
这实际上意味着这样做,而不是偶然。来自Penn Treebank Tokenization
双引号(“)被改为加倍单个前向和后向引号(``和'')
在之前的版本中,它没有这样做,但去年更新了。换句话说,如果您想要更改,则需要修改treebank.py
答案 1 :(得分:0)
扩大Leb提供的答案:
Penn Treebank令牌化的URL不再可用。但是它存在于ftp://ftp.cis.upenn.edu/pub/treebank/public_html/tokenization.html
中在此处复制粘贴内容:
树库令牌化
Our tokenization is fairly simple:
大多数标点符号与相邻单词分开
双引号(“)更改为双单引号和反引号(``and'')
动词收缩和名词的盎格鲁-撒克逊人所有格被分解成它们的成分语素,并标记每个语素
Examples children's --> children 's parents' --> parents ' won't --> wo n't gonna --> gon na I'm --> I 'm
此标记化使我们可以分别分析每个组成部分,因此(例如)“ I”可以出现在主题名词短语中,而“'m”可以是 主要动词短语的开头。
连字符与破折号,省略号(...)等都有一些细微之处,但是这些通常取决于特定的语料库或 标记数据的应用。
在已分析的语料库中,将类似于括号的字符转换为特殊的3个字母的序列,以避免与分析括号混淆。一些POS 标记,例如Adwait Ratnaparkhi的MXPOST,需要使用此表单 他们的投入。 换句话说,这些令牌位于POS文件中:()[] {} 在已解析的文件中成为:-LRB- -RRB- -RSB- -RSB- -LCB- -RCB- (首字母缩写代表(左|右)((圆|方|弯)括号)。)
这是一个简单的sed脚本,一旦将语料库格式化为大多数语料库,就可以完成足够体面的工作 每行一个句子。
斯坦福大学的例子:
https://nlp.stanford.edu/software/tokenizer.shtml
命令行用法部分显示了如何根据Penn Treebank标记化规则更改双引号的示例。
https://www.nltk.org/_modules/nltk/tokenize/treebank.html
TreebankWordTokenizer类显示了如何实现更改:
# starting quotes
(re.compile(r"^\""), r"``")
# ending quotes
(re.compile(r'"'), " '' ")