Reference:Python, 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})
网友评论