考虑一下这句话
msg = 'I got this URL /sf/ask/3334590381/?noredirect=1#comment82268544_47637293 freed'
Run Code Online (Sandbox Code Playgroud)
接下来,我使用现成spaCy的英语处理句子:
import spacy
nlp = spacy.load('en')
doc = nlp(msg)
Run Code Online (Sandbox Code Playgroud)
让我们回顾一下以下输出[(t, t.lemma_, t.pos_, t.tag_, t.dep_) for t in doc]:
[(I, '-PRON-', 'PRON', 'PRP', 'nsubj'),
(got, 'get', 'VERB', 'VBD', 'ROOT'),
(this, 'this', 'DET', 'DT', 'det'),
(URL, 'url', 'NOUN', 'NN', 'compound'),
(/sf/ask/3334590381/?noredirect=1#comment82268544_47637293,
'/sf/ask/3334590381/?noredirect=1#comment82268544_47637293',
'NOUN',
'NN',
'nsubj'),
(freed, 'free', 'VERB', 'VBN', 'ccomp')]
Run Code Online (Sandbox Code Playgroud)
我想改善URL片段的处理。我尤其要:
lemma为stackoverflow.comtag为URL如何使用spaCy?我想用一个正则表达式(如建议在这里)来决定一个字符串是否是URL或不并获得域名。到目前为止,我仍未找到解决方法。
编辑我想我需要一个自定义组件。但是,似乎没有办法将基于正则表达式(或任何其他)的可调用方式放置为patterns。
您可以使用自定义的令牌生成器来指定URL正则表达式,例如从https://spacy.io/usage/linguistic-features#native-tokenizers
import regex as re
from spacy.tokenizer import Tokenizer
prefix_re = re.compile(r'''^[\[\("']''')
suffix_re = re.compile(r'''[\]\)"']$''')
infix_re = re.compile(r'''[-~]''')
simple_url_re = re.compile(r'''^https?://''')
def custom_tokenizer(nlp):
return Tokenizer(nlp.vocab, prefix_search=prefix_re.search,
suffix_search=suffix_re.search,
infix_finditer=infix_re.finditer,
token_match=simple_url_re.match)
nlp = spacy.load('en')
nlp.tokenizer = custom_tokenizer(nlp)
msg = 'I got this URL /sf/ask/3334590381/?noredirect=1#comment82268544_47637293 freed'
for i, token in enumerate(nlp(msg)):
print(i, ':\t', token)
Run Code Online (Sandbox Code Playgroud)
[出]:
0 : I
1 : got
2 : this
3 : URL
4 : /sf/ask/3334590381/?noredirect=1#comment82268544_47637293
5 : freed
Run Code Online (Sandbox Code Playgroud)
您可以检查令牌是否类似于URL,例如
for i, token in enumerate(nlp(msg)):
print(token.like_url, ':\t', token.lemma_)
Run Code Online (Sandbox Code Playgroud)
[出]:
False : -PRON-
False : get
False : this
False : url
True : /sf/ask/3334590381/?noredirect=1#comment82268544_47637293
False : free
Run Code Online (Sandbox Code Playgroud)
doc = nlp(msg)
for i, token in enumerate(doc):
if token.like_url:
token.tag_ = 'URL'
print([token.tag_ for token in doc])
Run Code Online (Sandbox Code Playgroud)
[出]:
['PRP', 'VBD', 'DT', 'NN', 'URL', 'VBN']
Run Code Online (Sandbox Code Playgroud)
使用正则表达式https://regex101.com/r/KfjQ1G/1:
doc = nlp(msg)
for i, token in enumerate(doc):
if re.match(r'(?:http[s]:\/\/)stackoverflow.com.*', token.lemma_):
token.lemma_ = 'stackoverflow.com'
print([token.lemma_ for token in doc])
Run Code Online (Sandbox Code Playgroud)
[出]:
['-PRON-', 'get', 'this', 'url', 'stackoverflow.com', 'free']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
968 次 |
| 最近记录: |