有没有办法告诉#textblob 不将let's
等收缩分成let
&创建ngrams时's
?我知道它们在技术上是两个单独的词,但我想将它们保持为一个。
答案 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', '.']
这样就可以完全修复你想要修复的内容,但是整个后期处理会为你的代码增加运行时间。