2017-04-13 6 views
0

スペイシーのトークナイザは、2つのトークンにハッシュタグを分割し、そのようなつぶやきなどハッシュタグを含む文で:spacyがハッシュタグ全体をトークン化する方法は?

import spacy 
nlp = spacy.load('en') 
doc = nlp(u'This is a #sentence.') 
[t for t in doc] 

出力:

[This, is, a, #, sentence, .] 

私のようなトークン化ハッシュタグを持っているしたいと思います:

[This, is, a, #sentence, .] 

これは可能ですか?

おかげ

答えて

2
  1. あなたは「#」ベースのトークン化を回避しなければならないいくつかの前と後の文字列操作を行うには、実装が容易であることができます。例えば
> >>> import re 
> >>> import spacy 
> >>> nlp = spacy.load('en') 
> >>> sentence = u'This is my twitter update #MyTopic' 
> >>> parsed = nlp(sentence) 
> >>> [token.text for token in parsed] 
[u'This', u'is', u'my', u'twitter', u'update', u'#', u'MyTopic'] 
> >>> new_sentence = re.sub(r'#(\w+)',r'ZZZPLACEHOLDERZZZ\1',sentence) 
> >>> new_sentence u'This is my twitter update ZZZPLACEHOLDERZZZMyTopic' 
> >>> parsed = nlp(new_sentence) 
> >>> [token.text for token in parsed] 
[u'This', u'is', u'my', u'twitter', u'update', u'ZZZPLACEHOLDERZZZMyTopic'] 
> >>> [x.replace(u'ZZZPLACEHOLDERZZZ','#') for x in [token.text for token in parsed]] 
[u'This', u'is', u'my', u'twitter', u'update', u'#MyTopic'] 
  1. spacyのトークナイザでカスタムセパレータを設定できます。 私はそれを行う方法を知らない。

UPDATE:あなたは、単一のトークンとして滞在したい、とここで述べたようにspan.merge方法を使用してretokenizeうトークンのスパンを検索するために正規表現を使用することができます。https://spacy.io/docs/api/span#merge

は例をマージ:

>>> import spacy 
>>> import re 
>>> nlp = spacy.load('en') 
>>> my_str = u'Tweet hashtags #MyHashOne #MyHashTwo' 
>>> parsed = nlp(my_str) 
>>> [(x.text,x.pos_) for x in parsed] 
[(u'Tweet', u'PROPN'), (u'hashtags', u'NOUN'), (u'#', u'NOUN'), (u'MyHashOne', u'NOUN'), (u'#', u'NOUN'), (u'MyHashTwo', u'PROPN')] 
>>> indexes = [m.span() for m in re.finditer('#\w+',my_str,flags=re.IGNORECASE)] 
>>> indexes 
[(15, 25), (26, 36)] 
>>> for start,end in indexes: 
...  parsed.merge(start_idx=start,end_idx=end) 
... 
#MyHashOne 
#MyHashTwo 
>>> [(x.text,x.pos_) for x in parsed] 
[(u'Tweet', u'PROPN'), (u'hashtags', u'NOUN'), (u'#MyHashOne', u'NOUN'), (u'#MyHashTwo', u'PROPN')] 
>>> 
0

これは(アドオン @DhruvPathakによって大きな答え、恥知らずなコピーに下記のリンクgithubのスレッドからの詳細ですd @ csvanceによるさらに良い答え)。 spaCy機能(V2.0以降)add_pipe方法。 @DhruvPathak関数の中で素晴らしい答えを定義し、以下のように(便利に)nlpの処理パイプラインにステップを追加することができます。

引用はここから:

def hashtag_pipe(doc): 
    merged_hashtag = False 
    while True: 
     for token_index,token in enumerate(doc): 
      if token.text == '#': 
       if token.head is not None: 
        start_index = token.idx 
        end_index = start_index + len(token.head.text) + 1 
        if doc.merge(start_index, end_index) is not None: 
         merged_hashtag = True 
         break 
     if not merged_hashtag: 
      break 
     merged_hashtag = False 
    return doc 

nlp = spacy.load('en') 
nlp.add_pipe(hashtag_pipe) 

doc = nlp("twitter #hashtag") 
assert len(doc) == 2 
assert doc[0].text == 'twitter' 
assert doc[1].text == '#hashtag' 

引用はここで終了します。フルスレッドの場合はhow to add hashtags to the part of speech tagger #503をチェックしてください。これは、コードを読む際に明らかだが、コピーの&ペースター、パーサを無効にしない

PS :)

関連する問題