有没有办法告诉#textblob在创建 ngram 时不要将缩略词拆分let's
为let
& ?'s
我知道它们在技术上是两个独立的词,但我想将它们保持为一个词。
问问题
740 次
1 回答
4
看起来你在这里有两个选择:
- 更改TextBlob 中使用的标记器。
- 对令牌进行后处理。
后者更容易,但速度较慢。
改变模式
TextBlob 接受 nltk 分词器,我对这些更熟悉,所以我们将使用它。nltk 的 WordPunctTokenizer 是一个 RepexpTokenizer,其模式为"\\w+|[^\\w\\s]+"
:
>>> nltk.tokenize.RegexpTokenizer("\\w+|[^\\w\\s]+").tokenize("Let's check this out.")
['Let', "'", 's', 'check', 'this', 'out', '.']
析取前是\w+
,表示单词字符。在析取之后是[^\w\s]
,它匹配任何不是字符或空格的东西 - 即标点符号。
如果要包含'
在单词中"let's"
,则可以将该字符添加到析取的单词字符部分:
>>> nltk.tokenize.RegexpTokenizer("[\\w']+|[^\\w\\s]+").tokenize("Let's check this out.")
["Let's", 'check', 'this', 'out', '.']
后期处理
不过,正则表达式方法并不完美。我怀疑 TextBlob 的内置标记器可能比我们用正则表达式破解的要好一些。如果您严格要将缩略词作为一个标记,我建议您只对 TextBlob 的输出进行后处理。
>>> tokens = ["Let", "'s", "check", "this", "out", "."]
>>> def postproc(toks):
... toks_out = []
... while len(toks) > 1:
... bigram = toks[:2]
... if bigram[1][0] == "'":
... toks_out.append("".join(bigram))
... toks = toks[2:]
... else:
... toks_out.append(bigram[0])
... toks = toks[1:]
... toks_out.extend(toks)
... return toks_out
...
>>> postproc(tokens)
["Let's", 'check', 'this', 'out', '.']
这样就可以完全修复您想要修复的内容,但是整个后处理确实会为您的代码增加运行时间。
于 2015-05-30T20:09:35.523 回答