【问题标题】:Stop sentence tokenizer from splitting sentence on "no." abbreviation停止句子标记器在“否”上拆分句子。缩写
【发布时间】:2020-01-27 21:01:18
【问题描述】:

我正在尝试标记以下句子类型:

"The item at issue is no. 3553."

到目前为止,我尝试过的每个分词器都会返回以下内容(包括在我的语料库上训练的 Punkt 分词器):

[["the", "item", "at", "issue", "is", "no."], ["3553."]]

在分词器中添加“no”缩写对于以“no”结尾的句子来说是个问题。

【问题讨论】:

  • 使用正则表达式将"no. " 替换为# 之类的独特内容:no\. (?=\d)。但这取决于您的语料库;它是否包含诸如“答案是否定的。3 将是错误的答案。”
  • @usr2564301 我认为正则表达式就足够了。对于我的用例,最好将多个句子与其间的缩写连接起来,而不是将缩写与其所属的句子分开。
  • 在您的项目中标记文本的最终目的是什么?例如,您确定准确的断句是必不可少的吗?在很多情况下,这样的错误可能没什么大不了的。在少量重复出现的类似错误是问题的情况下,您可以添加一个修复它们的通道——也许是一个预处理正则表达式,但处理令牌可能更有效。 (例如:“如果一个句子以“否”结尾,而下一个句子以数字开头,则合并句子”——可能比对原始文本的正则表达式扫描便宜得多。)
  • (如果还有其他类似的情况,如果有时错误地将两个句子合并为一个通常不会损害下游任务,那么其他启发式可能会涵盖更多的问题案例。例如:“每次候选句不以大写字母开头时,将其与前一句合并”。)
  • @gojomo 我正在预处理语料库以用于多词主题建模。未能保留句子结构会导致 n-grams 跨越句子,这会对下游产生各种负面影响。

标签: python nlp nltk gensim


【解决方案1】:

恐怕系统要理解no. 缩写和no. 句子结尾之间的区别的唯一方法是理解句子的完整上下文。这超出了基本标记器的范围,并开始涉足机器学习 (ML) 或自然语言处理 (NLP)。

也就是说,前瞻性模式可能会看到 no. 后跟数字。

【讨论】:

  • 也许我应该采取 3-pass 方法:1) 正则表达式,2) 标记化,3) 撤消正则表达式?
  • 这正是研究中的做法,因此您的三步法完全正确。顺便说一句:您的问题是为什么对标点符号的语法修改使用双点表示以缩写结尾的句子是合理的确切原因,例如“不..”。最好还检查您的数据中是否有其他缩写,并将它们添加到要替换为非缩写形式的元素列表中。
【解决方案2】:

您可以先替换任何出现的“否”。没有”。这可以是您的文本预处理的一部分。 下面的正则表达式会有所帮助:

>>> str='The item at issue is no 3553 and no 3554. This is also described in issue no.  7890 with details. No. 345 is the root cause'
>>> p=re.compile('([n|N]o)[.]\s*(\d+)')
>>> m=p.sub(r'\1 \2',str)
>>> m
'The item at issue is no 3553 and no 3554. This is also described in issue no 7890 with details. No 345 is the root cause'

在此之后,您可以应用您的分词器。

【讨论】:

  • 否,因为这会分出每次出现的“否”。在句末。
  • 我正在检查没有。后跟一个数字。这似乎是您的数据模式。
  • 一个句子肯定有可能以数字开头。
  • 在这种情况下,您正在寻找一种对句子进行语义分析的方法,所以没有。被解释为“数字”。我相信很少有一个句子以 no 结尾然后下一个以数字开头的文本示例。在这种情况下,人类读者可能会犯错误。此外,由于缺乏足够的示例,语义分析器会发现难以区分。在我上面的正则表达式示例中,您可以尝试指定数字的长度以更好地进行标记。
猜你喜欢
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
相关资源
最近更新 更多