【问题标题】:How to avoid tokenize words with underscore?如何避免用下划线标记单词?
【发布时间】:2019-07-05 04:14:21
【问题描述】:

我正在尝试使用“nltk.word_tokenize()”函数标记我的文本,但它会拆分由“_”连接的单词。

例如,文本“A,_B_C! is a movie!”将被拆分为:

['a', ',', '_b_c', '!', 'is','a','movie','!']

我想要的结果是:

['a,_b_c!', 'is', 'a', 'movie', '!']

我的代码:

import nltk

text = "A,_B_C! is a movie!"
nltk.tokenize(text.lower())

任何帮助将不胜感激!

【问题讨论】:

  • 问题在于您使用的是word_tokenize,并且用逗号分隔单词。我从未使用过nltk,但在使用rply 之前我已经编写了一个词法分析器。在这里可能会有所帮助。
  • text.split() 会给你结果
  • @Asif 但拆分会给“电影!”作为一个整体
  • 您可以使用正则表达式来识别 ex - ",_" 的模式并将 , 替换为 _,_ 并应用标记器。标记化完成后,您将 _,_ 替换为 ,_
  • 我认为你需要编写一个自定义正则表达式来处理这个问题,因为你处理空格、逗号、下划线和标点符号的方式超出了我能想到的任何标准解析的范围的。有 nltk.tokenize.regexp 可以做到这一点:nltk.org/api/nltk.tokenize.html?highlight=nltk.tokenize.regexp

标签: python nltk tokenize


【解决方案1】:

你可以先用空格分割,然后在每个单词上使用word_tokenize来处理标点符号

[word for sublist in [word_tokenize(x) if '_' not in x else [x] 
                       for x in text.lower().split()] for word in sublist] 

输出 ['a,_b_c!', 'is', 'a', 'movie', '!']

l = [word_tokenize(x) if '_' not in x else [x] for x in text.lower().split()] 将返回运行 word_tokenize 的列表列表,仅在没有 _ 的单词上运行。

[word for sublist in l for word in sublist] 部分是将列表列表展平为单个列表。

【讨论】:

    【解决方案2】:

    如果您想保留下划线而不是围绕下划线分隔,请切换到 TweetTokenizer 而不是 word_tokenize。您可以在这里找到更多信息:How nltk.TweetTokenizer different from nltk.word_tokenize? 不知道如何解决感叹号问题。如果你想要 ['a,_b_c!'] 你也会得到 ['movie!'] 如果你想要 ['movie','!'] 你也会得到 ['a,_b_c',' !']。我想不出一种方法来挑选感叹号的处理方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2012-01-28
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      相关资源
      最近更新 更多