精华内容
下载资源
问答
  • 用户自定义词典
    万次阅读 热门讨论
    2019-03-21 22:54:59

    jieba 分词简介:

    jieba 对于一长段文字,其分词原理大体可分为三部:
    1.首先用正则表达式将中文段落粗略的分成一个个句子。
    2.将每个句子构造成有向无环图,之后寻找最佳切分方案。
    3.最后对于连续的单字,采用HMM模型将其再次划分。

    三种分词模式:

    精确模式:试图将句子最精确地切开,适合文本分析;
    全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
    搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词;

    使用python 分词:

    首先导入所需要的库 jieba

    import jieba
    

    读取所需要分词的文件

    file_needCut = 'file.csv' # 此处是所需要被分词的文件
    

    读取文件

    with open(file,'r',encoding='UTF-8') as f:
        for line in f.readlines():
          print(line)
    

    对读取出来的句子分词

    seg_list = jieba.cut(line,cut_all=False,HMM=True) #此处使用精确模式分词
    

    如果需要使用用户自定义词典,按照如下格式加在分词之前:

    file_userdict = 'userdict.txt' #此处文件名为用户自定义的文件名,内容为不想被分开的词
    jieba.load_userdict(file_userdict)
    

    全部代码为:

    import jieba
    
    file = 'file.csv'
    file_userdict = 'userdict.txt'
    jieba.load_userdict(file_userdict)
    
    with open(file,'r',encoding='UTF-8') as f:
        for line in f.readlines():
            print(line)
            seg_list = jieba.cut(line,cut_all=False,HMM=True)
            print("/".join(seg_list))
    
    更多相关内容
  • HanLP分词+用户自定义词典

    千次阅读 2020-01-14 13:40:37
    文章目录1....pynlpir中文分词+加载用户自定义词典 我比较喜欢用HanLP,它的粒度刚刚好。 pynlpir太细了,词全切开了。 1. 分词重要性 分错了可不好搞。 资料: demo_custom_dictionary.py - github...

    前面谈到分词:
    HanLP安装与使用-python版和java版
    pynlpir中文分词+加载用户自定义词典

    我比较喜欢用HanLP,它的粒度刚刚好。 pynlpir太细了,词全切开了。

    1. 分词重要性

    在这里插入图片描述
    在这里插入图片描述
    分错了可不好搞。

    2. 词典说明

    用户自定义词典 第8点。 - 1.x

    2.1 CustomDictionary

    • CustomDictionary 是一份全局的用户自定义词典,可以随时增删,影响全部分词器。
    • 另外可以在任何分词器中关闭它。通过代码动态增删不会保存到词典文件
    • 中文分词≠词典,词典无法解决中文分词,Segment提供高低优先级应对不同场景,可参考 为什么修改了词典还是没有效果? - FAQ
    • 代码动态添加词典方法:demo_custom_dictionary.py - github

    2.2 追加词典

    • CustomDictionary主词典文本路径是data/dictionary/custom/CustomDictionary.txt,用户可以在此增加自己的词语(不推荐)
      我的文件位置是C:\Users\ASUS\Anaconda3\Lib\site-packages\pyhanlp\static\data\dictionary\custom,如图:
      在这里插入图片描述
    • 也可以单独新建一个文本文件,通过配置文件CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 我的词典.txt;来追加词典(推荐)。
    • 始终建议将相同词性的词语放到同一个词典文件里,便于维护和分享。

    2.3 词典格式

    • 每一行代表一个单词,格式遵从[单词] [词性A] [A的频次] [词性B] [B的频次] ...如果不填词性则表示采用词典的默认词性。
    • 词典的默认词性默认是名词n,可以通过配置文件修改:全国地名大全.txt ns; 如果词典路径后面空格紧接着词性,则该词典默认是该词性。
    • 在统计分词中,并不保证自定义词典中的词一定被切分出来。用户可在理解后果的情况下通过Segment#enableCustomDictionaryForcing强制生效。
    • 关于用户词典的更多信息请参考词典说明一章。 词典说明 - 词典说明

    字典样例:

    万死 a 2 v 1
    三冬 n 1
    三天两头儿 nz 1
    三星堆遗址 n 1
    三键 a 1 n 1
    上口字 n 1
    

    所有词典统一使用UTF-8编码

    2.4 添加词典

    参考:hanlp用户自定义词典添加

    1. 打开C:\Users\ASUS\Anaconda3\Lib\site-packages\pyhanlp\static\hanlp.properties 文件,找到第20~21行:

      #另外data/dictionary/custom/CustomDictionary.txt是个高质量的词库,请不要删除。所有词典统一使用UTF-8编码。
      CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 现代汉语补充词库.txt; 全国地名大全.txt ns; 人名词典.txt; 机构名词典.txt; 上海地名.txt ns;data/dictionary/person/nrf.txt nrf;
      

      并添加字典。如下:

      CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; my_dict.txt; 现代汉语补充词库.txt; 全国地名大全.txt ns; 人名词典.txt; 机构名词典.txt; 上海地名.txt ns;data/dictionary/person/nrf.txt nrf;
      
    2. C:\Users\ASUS\Anaconda3\Lib\site-packages\pyhanlp\static\data\dictionary\custom目录下,添加文件my_dict.txt

    3. 输入如下:保存。

      疏水性 a 10
      

    3. 实验

    3.1 未添加词典

    代码:

    def pyhanlpSplit():
        sent = '分别以疏水性氨基酸色氨酸、苯丙氨酸、缬氨酸、丙氨酸、亮氨酸和异亮氨酸来替换X位置。'
        from pyhanlp import HanLP
        res = HanLP.segment(sent)
        print(res)
    

    结果:

    [分别/d,/p, 疏水/nz,/ng, 氨基酸/n, 色氨酸/nmc,/w, 苯丙氨酸/nmc,/w, 缬氨酸/nmc,/w, 丙氨酸/nmc,/w, 亮氨酸/gb,/cc, 异亮氨酸/nmc,/vf,  替换/v, X/nx, 位置/n,/w]
    

    我们想将 “疏水性” 作为一个词语来切分。

    3.2 加入词典后

    添加过程可参考 2.4 添加词典
    结果如下:

    [分别/d,/p, 疏水性/a, 氨基酸/n, 色氨酸/nmc,/w, 苯丙氨酸/nmc,/w, 缬氨酸/nmc,/w, 丙氨酸/nmc,/w, 亮氨酸/gb,/cc, 异亮氨酸/nmc,/vf, 替换/v, X/nx, 位置/n,/w]
    

    可以看到,“疏水性”作为一个词语,成功。

    4 其他深入实验

    4.1 自定义词性

    如果词性为词典没有出现过的词性呢?会正确识别吗?
    会。

    1. 例如,词典:

      疏水性 ph 10
      

      结果:

      [分别/d,/p, 疏水性/ph, 氨基酸/n, 色氨酸/nmc,/w, 苯丙氨酸/nmc,/w, 缬氨酸/nmc,/w, 丙氨酸/nmc,/w, 亮氨酸/gb,/cc, 异亮氨酸/nmc,/vf, 替换/v, X/nx, 位置/n,/w]
      
    2. 再如:

      疏水性 entityph 10
      

      结果:

      [分别/d,/p, 疏水性/entityph, 氨基酸/n, 色氨酸/nmc,/w, 苯丙氨酸/nmc,/w, 缬氨酸/nmc,/w, 丙氨酸/nmc,/w, 亮氨酸/gb,/cc, 异亮氨酸/nmc,/vf, 替换/v, X/nx, 位置/n,/w]
      

    很棒。

    4.2 删除词典

    在3.2基础完成后,我将词典文件删除,发现结果并未变化,还是将“疏水性”作为一个词语。
    笔者猜想,hanlp已经将词典内容写入到C:\Users\ASUS\Anaconda3\Lib\site-packages\pyhanlp\static\data\dictionary\custom\CustomDictionary.txt.bin中了。

    4.3 删除词典和bin

    为了证实猜想,笔者同时将CustomDictionary.txt.binmy_dict.txt删除,再次运行代码。
    此时运行结果为:

    一月 14, 2020 1:27:41 下午 com.hankcs.hanlp.dictionary.CustomDictionary load
    严重: 自定义词典c:/users/asus/anaconda3/lib/site-packages/pyhanlp/static/data/dictionary/custom/my_dict.txt读取错误!java.io.FileNotFoundException: c:\users\asus\anaconda3\lib\site-packages\pyhanlp\static\data\dictionary\custom\my_dict.txt (系统找不到指定的文件。)
    一月 14, 2020 1:27:41 下午 com.hankcs.hanlp.dictionary.CustomDictionary loadMainDictionary
    警告: 失败:c:/users/asus/anaconda3/lib/site-packages/pyhanlp/static/data/dictionary/custom/my_dict.txt
    [分别/d,/p, 疏水/nz,/ng, 氨基酸/n, 色氨酸/nmc,/w, 苯丙氨酸/nmc,/w, 缬氨酸/nmc,/w, 丙氨酸/nmc,/w, 亮氨酸/gb,/cc, 异亮氨酸/nmc,/vf,  
    替换/v, X/nx, 位置/n,/w]
    

    疏水、性 又分为了两个词。并且又产生了CustomDictionary.txt.bin文件,由此说明笔者猜想正确。

    运行过程:
    先加载词典文件,产生bin文件(只加不减)。
    再通过bin文件和切词原理进行切词。

    完成,完美,鼓掌。

    b站讲解:https://www.bilibili.com/video/av83440716/

    展开全文
  • 理解hanlp中用户自定义词典(java) 什么是hanlp用户自定义字典?为什么要有用户自定义词典? 在Hanlp分词中,不管是标准分词器、NLP分词器还是索引分词器都不可能准确的将我们希望的结果词语分出来,尤其是我们...
    首先说明,由于本人水平有限,文章纰漏以及不妥之处还请指出,不胜感激;

    理解hanlp中用户自定义词典(java)

    1. 什么是hanlp用户自定义字典?为什么要有用户自定义词典?
      在Hanlp分词中,不管是标准分词器、NLP分词器还是索引分词器都不可能每次都准确的将我们希望的结果词语分出来,尤其是我们平常用到的自定义名词或者流行语,比如:“印象笔记”、“奥利给”等,分析语句一长,分词准确性还会继续下降,这时就需要我们利用用户自定义词典,来进行这些词语的记录,方便分词器依据用户词典来进行分词,提高准确度。
      Hanlp

    2. 用户自定义词典中的词在分词时一定会被准确无误的区分出来吗?
      我们需要知道准确无误这样的形容词在形容分词这项工作就是不恰当的,在分词工作中,对分词结果评判的标准是不确定的,在官方FAQ中有这样的例子:

    假如用户词典中一共3个词语:商品和服服务,那么“商品和服务”到底怎么分才能满足这些用户呢?无论怎么分词,这3个词语都不可能同时出现。

    也许你以为往词典中添加“川普”,并且用户词典优先级最高的话,就可以解决眼前的“普京与川普 通话”这个句子。但在你没注意到的地方,有更多类似“四川普通话”“银川普通高考”“唐纳德·川普”(本该是一个词)的句子会发生错误。

    所以说,词典≠中文分词

    在了解了上述两个问题之后,我们就开始进行用户自定义词典的分析了。

    下载Hanlp数据包后,默认位置是在Hanlp配置目录下的data\dictionary\custom,CustomDictionary是一份全局的用户自定义词典,可以随时增删,影响全部分词器。另外可以在任何分词器中关闭它。下图是CustomDictionary在windows OS中的位置;
    目录位置
    我们点开它,发现了一些词语,仔细观察我们会发现这些词的组织是有一定的规律的;
    内部1

    • 每一行代表一个单词,格式遵从[单词] [词性A] [A的频次] [词性B] [B的频次] … 如果不填词性则表示采用词典的默认词性。

    • 词典的默认词性默认是名词n,可以通过配置文件修改:全国地名大全.txt ns;如果词典路径后面空格紧接着词性,则该词典默认是该词性。
      我们打开Hanlp的配置文件,在箭头指向位置可以看到自定义词典的路径,词典名有后缀的就是设置了词条默认词性,默认名词;在这里插入图片描述
      词性表请参照《HanLP词性标注集》

    • 在统计分词中,并不保证自定义词典中的词一定被切分出来。用户可在理解后果的情况下通过Segment#enableCustomDictionaryForcing强制生效。
      我们在之前已经讨论过这个问题,如果你实在需要词典中的词被完整的分出来,可以使用此方法来开启强制分词。

    我们也可以添加词典

    • CustomDictionary主词典文本路径是data/dictionary/custom/CustomDictionary.txt,用户可以在此增加自己的词语(不推荐);也可以单独新建一个文本文件,通过配置文件CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 我的词典.txt;来追加词典(推荐)。
      缓存在这里插入图片描述

    • 始终建议将相同词性的词语放到同一个词典文件里,便于维护和分享。
      特别注意:
      ①通过代码进行词语的增删并不会影响到词典;
      ②在词典进行更改后,必须删除词典缓存,在下一次载入词典时更改才会生效;
      ③词典缓存和词典在同一目录下,后缀一般是.bin。有时候是.trie.dat和.trie.value。它们是历史遗留产物;
      在这里插入图片描述
      现在是时候进入代码,仔细观察了。这是文档给出的一段代码:

    /**
     1. 演示用户词典的动态增删
     2.  3. @author hankcs
     */
    public class DemoCustomDictionary
    {
        public static void main(String[] args)
        {
            // 动态增加
            CustomDictionary.add("攻城狮");
            // 强行插入
            CustomDictionary.insert("白富美", "nz 1024");
            // 删除词语(注释掉试试)
    //        CustomDictionary.remove("攻城狮");
            System.out.println(CustomDictionary.add("单身狗", "nz 1024 n 1"));
            System.out.println(CustomDictionary.get("单身狗"));
    
            String text = "攻城狮逆袭单身狗,迎娶白富美,走上人生巅峰";  // 怎么可能噗哈哈!
    
            // AhoCorasickDoubleArrayTrie自动机扫描文本中出现的自定义词语
            final char[] charArray = text.toCharArray();
            CustomDictionary.parseText(charArray, new AhoCorasickDoubleArrayTrie.IHit<CoreDictionary.Attribute>()
            {
                @Override
                public void hit(int begin, int end, CoreDictionary.Attribute value)
                {
                    System.out.printf("[%d:%d]=%s %s\n", begin, end, new String(charArray, begin, end - begin), value);
                }
            });
    
            // 自定义词典在所有分词器中都有效
            System.out.println(HanLP.segment(text));
        }
    }
    

    我们通过源代码查看一下选中的几个方法:
    在这里插入图片描述

    add(String) : boolean

     /**
         * 往自定义词典中插入一个新词(非覆盖模式)<br>
         *     动态增删不会持久化到词典文件
         *
         * @param word                新词 如“裸婚”
         * @return 是否插入成功(失败的原因可能是不覆盖等,可以通过调试模式了解原因)
         */
        public static boolean add(String word)
        {
            if (HanLP.Config.Normalization) word = CharTable.convert(word);
            if (contains(word)) return false;
            return insert(word, null);
        }
    

    insert(String) : boolean

    /**
         * 以覆盖模式增加新词<br>
         *     动态增删不会持久化到词典文件
         *
         * @param word
         * @return
         */
        public static boolean insert(String word)
        {
            return insert(word, null);
        }
    

    get(String) : Attribute

     /**
         * 查单词
         *
         * @param key
         * @return
         */
        public static CoreDictionary.Attribute get(String key)
        {
            if (HanLP.Config.Normalization) key = CharTable.convert(key);
            CoreDictionary.Attribute attribute = dat.get(key);
            if (attribute != null) return attribute;
            if (trie == null) return null;
            return trie.get(key);
        }
    

    remove(String) : void

        /**
         * 删除单词<br>
         *     动态增删不会持久化到词典文件
         *
         * @param key
         */
        public static void remove(String key)
        {
            if (HanLP.Config.Normalization) key = CharTable.convert(key);
            if (trie == null) return;
            trie.remove(key);
        }
    

    源代码正在研究,考完六级再来补…

    展开全文
  • tag = tag.strip() self.add_word(word, freq, tag) load_userdict()适用于用户需要添加大量自定义词汇的情况, 此时需要将词汇以 word freq word_type 的形式每行一个存储在文件中。 然后使用该方法读取文件 开始...

    2021SC@SDUSC


    源码:

    def load_userdict(self, f):
            '''
            Load personalized dict to improve detect rate.
    
            Parameter:
                - f : A plain text file contains words and their ocurrences.
                      Can be a file-like object, or the path of the dictionary file,
                      whose encoding must be utf-8.
    
            Structure of dict file:
            word1 freq1 word_type1
            word2 freq2 word_type2
            ...
            Word type may be ignored
            '''
            self.check_initialized()
            if isinstance(f, string_types):
                f_name = f
                f = open(f, 'rb')
            else:
                f_name = resolve_filename(f)
    #===================================================================================
            for lineno, ln in enumerate(f, 1):
                line = ln.strip()
                if not isinstance(line, text_type):
                    try:
                        line = line.decode('utf-8').lstrip('\ufeff')
                    except UnicodeDecodeError:
                        raise ValueError('dictionary file %s must be utf-8' % f_name)
                if not line:
                    continue
                # match won't be None because there's at least one character
                word, freq, tag = re_userdict.match(line).groups()
                if freq is not None:
                    freq = freq.strip()
                if tag is not None:
                    tag = tag.strip()
                self.add_word(word, freq, tag)

    load_userdict()适用于用户需要添加大量自定义词汇的情况,

    此时需要将词汇以 word freq word_type 的形式每行一个存储在文件中。

    然后使用该方法读取文件

    开始用于监测字典是否已经加载,该方法:

        def check_initialized(self):
            if not self.initialized:
                self.initialize()

    首个if else语句用于判断传入实参的类型(只能是文件或者文件的url),如果是文件的url,使用open()函数打开文件;如果是文件,则使用reslove_file()函数进行处理,reslove_file源码:

    def resolve_filename(f):
        try:
            return f.name
        except AttributeError:
            return repr(f)

    for 循环中,enumerate()用于遍历可迭代的对象, enumerate(sequence[,start = 0])可以遍历sequence ,获得返回值(index,subsequence),start 的值为下标开始的值。详情

    获得下标和每一行的值后,进行左右删减(去掉空格)

    如果 line 不是 str类型,使用 utf-8 编码且删除左侧的字符 '\ufeff',关于这个字符的问题,详情戳,大致意思为读取记事本文件转码utf-8输出时会在左侧出现一个字符 '\ufeff',所以需要删除。

    如果在删除空格和非法字符后 line 为空,则跳过改行的处理(没有数据)

    使用re表达式进行匹配,并且使用 .groups()方法返回匹配后的结果(每个括号为一个结果),re_userdict的值为:

    re_userdict = re.compile('^(.+?)( [0-9]+)?( [a-z]+)?$', re.U)

    ^(.+?)表示匹配首个任意字符,( [0-9]+)? 表示匹配一个空格以及之后的一串数字(仅匹配一次),( [a-z]+)?表示匹配一个空格以及之后的一串小写字母(仅匹配一次)。但是在^(表示字符串首)和$(表示字符串尾)之间时,整个正则表达式表示匹配 (一串字符,空格+一串数字,空格+一串字符),如果后两者匹配失败,所有的值都算在前者。例如:

     如果1234564 和 fsfas 之间有个空格就匹配成功!

     re.U的使用则是为了把\w \W \s \S等这些元字符按照 Unicode 的标准来考虑。例如:

    pattern = re.compile(ur"a\s+b", re.U)
    m = pattern.findall(u"dsadadsada\u3000b") # 匹配成功

    pattern = re.compile(ur"a\s+b")
    m = pattern.findall(u"dsadadsada\u3000b") # 匹配失败

    \u3000是中文下的unicode空格符,如果不加 re.U 只认 ascii 中的空白符。

    最后对获得的结果中非空的结果去除两边的空格(strip())

    使用add_word(word,freq,tag)将word添加到字典。

    讲到这里,我们应该考虑,添加词的时候既然可以省略词频和词性,那么省略后他们变成什么了呢?

    看到add_word()源码

            

    展开全文
  • 目录三种分词模式自定义词典使用 三种分词模式 精确模式:试图将句子最精确地切分开,适合文本分析。 全模式:把句子中所有可以成词的词都扫描出来,速度非常快,但是不能解决歧义问题。 搜索引擎模式 :在精确...
  • NLPIR分词工具由中科院开发,其支持用户自定义词典。这是在做商品评论情感分析时整理的2019个自定义词汇。
  • 自定义词典其实是基于规则的分词,它的用法参考这个issue 如果有些数量词、字母词需要分词,可参考:P2P和C2C这种词没有分出来,希望加到主词库 关于词性标注:可参考词性标注 2. 源码解析 分析 com.hankcs.demo...
  • pyhanlp用户自定义词典添加实例说明pyhanlp是python版封装的的HanLP,项目地址:https://github.com/hankcs/pyhanlp经过测试,HanLP比nltk在中文分词和实体识别方面都更好用.如何向pyhanlp添加自定义的词典?以...
  • 目前实现了中文分词、中文姓名识别、用户自定义词典、关键字提取、自动摘要、关键字标记等功能。 可以应用到自然语言处理等方面,适用于对分词效果要求高的各种项目。 maven <groupId>org.ansj <artifactId>...
  • scala+spark+jieba+worker+用户自定义词典
  • 结巴分词之用户自定义词典的使用

    千次阅读 2020-08-07 20:07:35
    jieba 分词简介: jieba 对于一长段文字,其分词原理大体可分为三部: 1.首先用正则表达式将中文段落粗略的分成一个个句子。 2.将每个句子构造成有向无环图,之后寻找最佳切分方案...添加用户定义词典 很多时候我们需要
  • 原标题:pyhanlp用户自定义词典添加pyhanlp是python版封装的的HanLP,项目地址:https://github.com/hankcs/pyhanlp经过测试,HanLP比nltk在中文分词和实体识别方面都更好用。如何向pyhanlp添加自定义的词典?以...
  • hanlp用户自定义词典添加

    千次阅读 2018-12-19 18:20:53
    1、在字典路径下添加自定义词典:CustomDictionary主词典文本路径是data/dictionary/custom/CustomDictionary.txt,用户可以在此增加自己的词语(不推荐);也可以单独新建一个文本文件,通过配置文件;...
  • 如下所示:#加载词典def load_dict_from_file(filepath):_dict = {}try:with io.open(filepath, 'r',encoding='utf-8') as dict_file:for line in dict_file:(key, value) = line.strip().split(' ') #将原本用空格...
  • hanlp的词典模式之前我们看了hanlp的词性标注,现在我们就要使用自定义词典与停用词功能了,首先关于HanLP的词性标注方式具体请看HanLP词性标注集。其核心词典形式如下:自定义词典自定义词典有多种添加模式,首先是...
  • hanlp的词典模式之前我们看了hanlp的词性标注,现在我们就要使用自定义词典与停用词功能了,首先关于HanLP的词性标注方式具体请看HanLP词性标注集。其核心词典形式如下:自定义词典自定义词典有多种添加模式,首先是...
  • pyhanlp用户自定义词典添加实例说明 pyhanlp是python版封装的的HanLP,项目地址:https://github.com/hankcs/pyhanlp 经过测试,HanLP比nltk在中文分词和实体识别方面都更好用. 如何向pyhanlp添加自定义的词典?以...
  • pynlpir中文分词+加载用户自定义词典

    千次阅读 多人点赞 2019-12-29 13:51:32
    关于PYNLPIR导入用户自定义词典时出现的参数类型错误问题 看来直接传入str是不合适的,需要传入byte类型,于是将 userdict = “userdict.txt"加上b变成userdict = b"userdict.txt” 再次运行没有报错,完美...
  • 结巴分词jieba添加自定义词典

    千次阅读 2021-02-07 08:15:24
    结巴分词添加自定义词典,有时候很有必要。比如下面这段话: test_text = """ 我们的健康码也是绿色的, 这凭什么就限制我们的就医! """ 如果使用默认的分词,那么,“健康码”这个词会分成“健康”和“码” ...
  • HanLP用户自定义词典源码分析 官方文档及参考链接 关于词典问题Issue,首先参考:FAQ 自定义词典其实是基于规则的分词,它的用法参考这个issue 如果有些数量词、字母词需要分词,可参考:P2P和C2C这种词没有分出来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,102
精华内容 4,840
关键字:

用户自定义词典

友情链接: LOL战绩查询.zip