代码之家  ›  专栏  ›  技术社区  ›  MenorcanOrange

Spacy日语标记符

  •  6
  • MenorcanOrange  · 技术社区  · 7 年前

    我正在尝试使用Spacy的日语标记符。

    import spacy
    Question= 'すぺいんへ いきました。'
    nlp(Question.decode('utf8'))
    

    我得到以下错误,

    TypeError: Expected unicode, got spacy.tokens.token.Token
    

    关于如何解决这个问题有什么想法吗?

    谢谢

    3 回复  |  直到 5 年前
        1
  •  4
  •   Anugraha Sinha    6 年前

    据Spacy称,使用Spacy的日语标记化仍处于研究阶段 alpha phase . 标记化的理想方法是为标记化的单词列表提供与语言结构有关的信息。例如,对于一个英语句子,你可以试试这个

    import spacy
    nlp = spacy.load("en") # execute "python -m spacy download en" before this on standard console
    sentence = "Writing some answer on stackoverflow, as an example for spacy language model"
    print(["::".join((word.orth_, word.pos_)) for word in nlp(sentence)])
    ## <OUTPUT>
    ## ['Writing::VERB', 'some::DET', 'answer::NOUN', 'on::ADP', 'stackoverflow::NOUN', ',::PUNCT', 'as::ADP', 'an::DET', 'example::NOUN', 'for::ADP', 'spacy::ADJ', 'language::NOUN', 'model::NOUN']
    

    这些结果目前还不适用于日语。 python -m spacy download xx 和使用 nlp = spacy.load("xx") ,它尽力去理解 named entities

    此外,如果您查看spacy的源代码 here ,您将看到令牌化是可用的,但它只带来了 make_doc 函数,这很幼稚。 注意:spacy的pip版本仍然是旧代码,github的上述链接仍然有一些最新代码。

    因此,对于构建令牌化,目前强烈建议使用 janome 下面给出了一个示例

    from janome.tokenizer import Tokenizer as janome_tokenizer
    sentence = "日本人のものと見られる、延べ2億件のメールアドレスとパスワードが闇サイトで販売されていたことがわかりました。過去に漏えいしたデータを集めたものと見られ、調査に当たったセキュリティー企業は、日本を狙ったサイバー攻撃のきっかけになるおそれがあるとして注意を呼びかけています。"
    token_object = janome_tokenizer()
    [x.surface for x in token_object.tokenize(sentence)]
    ## <OUTPUT> ##
    ## ['日本人', 'の', 'もの', 'と', '見', 'られる', '、', '延べ', '2', '億', '件', 'の', 'メールアドレス', 'と', 'パスワード', 'が', '闇', 'サイト', 'で', '販売', 'さ', 'れ', 'て', 'い', 'た', 'こと', 'が', 'わかり', 'まし', 'た', '。', '過去', 'に', '漏えい', 'し', 'た', 'データ', 'を', '集め', 'た', 'もの', 'と', '見', 'られ', '、', '調査', 'に', '当たっ', 'た', 'セキュリティー', '企業', 'は', '、', '日本', 'を', '狙っ', 'た', 'サイバー', '攻撃', 'の', 'きっかけ', 'に', 'なる', 'お', 'それ', 'が', 'ある', 'として', '注意', 'を', '呼びかけ', 'て', 'い', 'ます', '。']
    ## you can look at
    ## for x in token_object.tokenize(sentence):
    ##     print(x)
    ## <OUTPUT LIKE>:
    ## 日本人    名詞,一般,*,*,*,*,日本人,ニッポンジン,ニッポンジン
    ## の        助詞,連体化,*,*,*,*,の,ノ,ノ
    ## もの      名詞,非自立,一般,*,*,*,もの,モノ,モノ
    ## と        助詞,格助詞,引用,*,*,*,と,ト,ト
    ## ....
    ## <OUTPUT Truncated>
    

    我认为spacy团队正在研究类似的输出,为日语构建模型,这样也可以为日语构建“特定于语言的”结构,类似于其他语言的结构。

    使现代化

    here , here & here udpipe似乎支持50多种语言,就语言支持而言,它为我们在Spacy中看到的问题提供了解决方案。

        2
  •  2
  •   Vlad    5 年前

    尝试使用此选项:

    import spacy
    
    question = u'すぺいんへ いきました。'
    nlp(question)
    
        3
  •  1
  •   polm23    5 年前

    我不知道你为什么会遇到这个bug,但自从你发布这个问题以来,日本的支持已经得到了改善,应该可以与最新版本的spaCy一起使用。要获得日语支持,您还需要自己安装MeCab和其他一些依赖项,请参阅 here 详细指南。

    实际代码如下所示:

    import spacy
    
    ja = spacy.blank('ja')
    print(ja('日本語ですよ'))
    

    如果您仍然有问题,请随时在Github上提交问题。