使用 Spacy 自定义句子分割
Custom sentence segmentation using Spacy
我是 Spacy 和 NLP 的新手。我在使用 Spacy 进行句子分割时遇到以下问题。
我试图标记为句子的文本包含编号列表(编号和实际文本之间有 space),如下所示。
import spacy
nlp = spacy.load('en_core_web_sm')
text = "This is first sentence.\nNext is numbered list.\n1. Hello World!\n2. Hello World2!\n3. Hello World!"
text_sentences = nlp(text)
for sentence in text_sentences.sents:
print(sentence.text)
输出(1.,2.,3.被视为单独的行)是:
This is first sentence.
Next is numbered list.
1.
Hello World!
2.
Hello World2!
3.
Hello World!
但是如果编号和实际文本之间没有 space,那么句子分词就可以了。如下所示:
import spacy
nlp = spacy.load('en_core_web_sm')
text = "This is first sentence.\nNext is numbered list.\n1.Hello World!\n2.Hello World2!\n3.Hello World!"
text_sentences = nlp(text)
for sentence in text_sentences.sents:
print(sentence.text)
输出(期望)是:
This is first sentence.
Next is numbered list.
1.Hello World!
2.Hello World2!
3.Hello World!
请建议我们是否可以自定义句子检测器来执行此操作。
当您使用带有 spacy 的预训练模型时,句子会根据模型训练过程中提供的训练数据进行拆分。
当然,也有像你这样的情况,可能有人想使用自定义的分句逻辑。这可以通过向 spacy 管道添加一个组件来实现。
对于您的情况,您可以添加一条规则,以防止出现 {number} 时出现句子拆分。图案。
您的问题的解决方法:
import spacy
import re
nlp = spacy.load('en')
boundary = re.compile('^[0-9]$')
def custom_seg(doc):
prev = doc[0].text
length = len(doc)
for index, token in enumerate(doc):
if (token.text == '.' and boundary.match(prev) and index!=(length - 1)):
doc[index+1].sent_start = False
prev = token.text
return doc
nlp.add_pipe(custom_seg, before='parser')
text = u'This is first sentence.\nNext is numbered list.\n1. Hello World!\n2. Hello World2!\n3. Hello World!'
doc = nlp(text)
for sentence in doc.sents:
print(sentence.text)
希望对您有所帮助!
我是 Spacy 和 NLP 的新手。我在使用 Spacy 进行句子分割时遇到以下问题。
我试图标记为句子的文本包含编号列表(编号和实际文本之间有 space),如下所示。
import spacy
nlp = spacy.load('en_core_web_sm')
text = "This is first sentence.\nNext is numbered list.\n1. Hello World!\n2. Hello World2!\n3. Hello World!"
text_sentences = nlp(text)
for sentence in text_sentences.sents:
print(sentence.text)
输出(1.,2.,3.被视为单独的行)是:
This is first sentence.
Next is numbered list.
1.
Hello World!
2.
Hello World2!
3.
Hello World!
但是如果编号和实际文本之间没有 space,那么句子分词就可以了。如下所示:
import spacy
nlp = spacy.load('en_core_web_sm')
text = "This is first sentence.\nNext is numbered list.\n1.Hello World!\n2.Hello World2!\n3.Hello World!"
text_sentences = nlp(text)
for sentence in text_sentences.sents:
print(sentence.text)
输出(期望)是:
This is first sentence.
Next is numbered list.
1.Hello World!
2.Hello World2!
3.Hello World!
请建议我们是否可以自定义句子检测器来执行此操作。
当您使用带有 spacy 的预训练模型时,句子会根据模型训练过程中提供的训练数据进行拆分。
当然,也有像你这样的情况,可能有人想使用自定义的分句逻辑。这可以通过向 spacy 管道添加一个组件来实现。
对于您的情况,您可以添加一条规则,以防止出现 {number} 时出现句子拆分。图案。
您的问题的解决方法:
import spacy
import re
nlp = spacy.load('en')
boundary = re.compile('^[0-9]$')
def custom_seg(doc):
prev = doc[0].text
length = len(doc)
for index, token in enumerate(doc):
if (token.text == '.' and boundary.match(prev) and index!=(length - 1)):
doc[index+1].sent_start = False
prev = token.text
return doc
nlp.add_pipe(custom_seg, before='parser')
text = u'This is first sentence.\nNext is numbered list.\n1. Hello World!\n2. Hello World2!\n3. Hello World!'
doc = nlp(text)
for sentence in doc.sents:
print(sentence.text)
希望对您有所帮助!