Janome分词

2020-10-16  本文已影响0人  Rebui

ReferencePython, Janomeで日本語の形態素解析、分かち書き(単語分割)

基本使用方法

from janome.tokenizer import Tokenizer
t = Tokenizer()
text = "すもももももももものうち"
print(type(t.tokenize(text)))
# <class 'generator'>
for token in t.tokenize(text):
    # print(type(token))    # <class 'janome.tokenizer.Token'>
   print(token)
# すもも   名詞,一般,*,*,*,*,すもも,スモモ,スモモ
# も 助詞,係助詞,*,*,*,*,も,モ,モ
# もも    名詞,一般,*,*,*,*,もも,モモ,モモ
# も 助詞,係助詞,*,*,*,*,も,モ,モ
# もも    名詞,一般,*,*,*,*,もも,モモ,モモ
# の 助詞,連体化,*,*,*,*,の,ノ,ノ
# うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

Token的属性

Token对象有以下属性:

surface(表層形)

print([token.surface for token in t.tokenize('走れ')])
# ['走れ']

part_of_speech(品詞)

for token in t.tokenize('走れ'):
    print(token.part_of_speech)
    # 動詞,自立,*,*
    # part_of_speech format: [品詞,品詞細分類1,品詞細分類2,品詞細分類3]
    print(token.part_of_speech.split(","))
    # ['動詞', '自立', '*', '*']

返回一个词性的list,品词细分类为空时,显示 *

infl_type(活用型)

base_form(基本形、見出し語)

reading(読み)

phonetic(発音)

for token in t.tokenize('走れ'):
    print(token.infl_type)
    # 五段・ラ行
    print(token.base_form)
    # 走る
    print(token.reading)
    # ハシレ
    print(token.phonetic)
    # ハシレ

属性为空时,显示 *

Janome分词

将tokenize() 方法的参数wakati设为True,返回的是表层形字符串列表,而不是 token对象,相当于原来的 token.surface

s = '走れと言われたので走ると言った'
t = Tokenizer()
print([token for token in t.tokenize(s, wakati=True)])
# ['走れ', 'と', '言わ', 'れ', 'た', 'ので', '走る', 'と', '言っ', 'た']

也可以在实例化Tokenizer对象的时候,直接设定参数wakati为True。

t_wakati = Tokenizer(wakati=True)
print([token for token in t_wakati.tokenize(s)])
# ['走れ', 'と', '言わ', 'れ', 'た', 'ので', '走る', 'と', '言っ', 'た']

有时候只需要 token对象中的部分属性,或进行简单地词性过滤,就可以配合列表操作。

print([token.part_of_speech.split(',')[0] for token in t.tokenize(s)])
# ['動詞', '助詞', '動詞', '動詞', '助動詞', '助詞', '動詞', '助詞', '動詞', '助動詞']

print([token.surface for token in t.tokenize(s)
       if token.part_of_speech.startswith('動詞')])
# ['走れ', '言わ', 'れ', '走る', '言っ']

统计词频
使用Python标准库collections的Counter类。
Counter的详细使用方法参考:PythonのCounterでリストの各要素の出現個数をカウント

from janome.tokenizer import Tokenizer
import collections

t = Tokenizer()
s = '人民の人民による人民のための政治'

c = collections.Counter(t.tokenize(s, wakati=True))
print(type(c))
# <class 'collections.Counter'>
print(c)
# Counter({'人民': 3, 'の': 3, 'による': 1, 'ため': 1, '政治': 1})
print(c['人民'])
# 3
print(c['国民'])
# 0

mc = c.most_common()    # 返回(单词,出现次数)元组列表,按出现次数从多到少顺序排列
print(mc)
# [('人民', 3), ('の', 3), ('による', 1), ('ため', 1), ('政治', 1)]
print(mc[0][0])
# 人民

words, counts = zip(*c.most_common())
print(words)
# ('人民', 'の', 'による', 'ため', '政治')
print(counts)
# (3, 3, 1, 1, 1)

统计词频时加上词性过滤

s = '走れと言われたので走ると言った'
print(collections.Counter(token.base_form for token in t.tokenize(s)))
# Counter({'走る': 2, 'と': 2, '言う': 2, 'た': 2, 'れる': 1, 'ので': 1})
print(type(token.base_form for token in t.tokenize(s)))
# <class 'generator'>

print(collections.Counter(token.base_form for token in t.tokenize(s)
                          if token.part_of_speech.startswith('動詞,自立')))
# Counter({'走る': 2, '言う': 2})
print(collections.Counter(token.part_of_speech.split(',')[0] for token in t.tokenize(s)))
# Counter({'動詞': 5, '助詞': 3, '助動詞': 2})
上一篇下一篇

猜你喜欢

热点阅读