2

有没有办法告诉#textblob在创建 ngram 时不要将缩略词拆分let'slet& ?'s我知道它们在技术上是两个独立的词,但我想将它们保持为一个词。

4

1 回答 1

4

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

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

改变模式

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 回答