保留与textblob ngrams的收缩

时间:2015-05-30 19:23:13

标签: python nlp textblob

有没有办法告诉#textblob let's等收缩分成let&创建ngrams时's?我知道它们在技术上是两个单独的词,但我想将它们保持为一个。

1 个答案:

答案 0 :(得分:1)

看起来你在这里有两个选择:

后者更容易,但速度更慢。

更改模式

TextBlob接受nltk标记符,我对它们更熟悉,因此我们将使用它。 nltk的WordPunctTokenizer是一个具有模式"\\w+|[^\\w\\s]+"的RepexpTokenizer:

>>> 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', '.']

这样就可以完全修复你想要修复的内容,但是整个后期处理会为你的代码增加运行时间。