怎么去掉stanford分型怎么读6 parser的POS,改用自己的POS

Algorithm, NLP/IR, Data Mining, Machine Learning, Math. 个人主页: https://yangliuy.github.io/
基于Stanford Parser 及OpenNLP Shallow Parser构建句子语法解析树
最近做一个项目需要对给定的文本中的句子做Parse,根据POS tag及句子成分信息找出词语/短语之间的dependency,然后根据dependency构建句子的parse tree. 需要用到Stanford Parser和OpenNLP 中的Shallow Parser,这两个Parser都用JAVA实现,提供API方式调用,可以根据句子输出语法解析树。下面总结两类Parser的作用及JAVA程序调用方法。
1 Shallow Parser
Shallow Parser主要作用是找出句子中的短语信息,包括名词短语NP,动词短语VP,形容词短语ADJP,副词短语ADVP等等,示例程序如下
package edu.pku.yangliu.nlp.
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.io.InputS
import java.io.StringR
import java.util.HashM
import opennlp.tools.chunker.ChunkerME;
import opennlp.tools.chunker.ChunkerM
import opennlp.tools.cmdline.PerformanceM
import opennlp.tools.cmdline.postag.POSModelL
import opennlp.tools.postag.POSM
import opennlp.tools.postag.POSS
import opennlp.tools.postag.POSTaggerME;
import opennlp.tools.tokenize.WhitespaceT
import opennlp.tools.util.InvalidFormatE
import opennlp.tools.util.ObjectS
import opennlp.tools.util.PlainTextByLineS
/**a Shallow Parser based on opennlp
* @author yangliu
* @blog http://blog.csdn.net/yangliuy
* @mail yang.liu@pku.edu.cn
public class ShallowParser {
private static ShallowParser instance =
private static POSM
private static ChunkerModel cM
//Singleton pattern
public static ShallowParser getInstance() throws InvalidFormatException, IOException{
if(ShallowParser.instance == null){
POSModel model = new POSModelLoader().load(new File("en-pos-maxent.bin"));
InputStream is = new FileInputStream("en-chunker.bin");
ChunkerModel cModel = new ChunkerModel(is);
ShallowParser.instance = new ShallowParser(model, cModel);
return ShallowParser.
public ShallowParser(POSModel model, ChunkerModel cModel){
ShallowParser.model =
ShallowParser.cModel = cM
/** A shallow Parser, chunk a sentence and return a map for the phrase
labels of words &wordsIndex, phraseLabel&
Notice: There should be " " BEFORE and after ",", " ","(",")" etc.
* @param input The input sentence
* @param model The POSModel of the chunk
* @param cModel The ChunkerModel of the chunk
HashMap&Integer,String&
public HashMap&Integer,String& chunk(String input) throws IOException {
PerformanceMonitor perfMon = new PerformanceMonitor(System.err, "sent");
POSTaggerME tagger = new POSTaggerME(model);
ObjectStream&String& lineStream = new PlainTextByLineStream(
new StringReader(input));
perfMon.start();
String whitespaceTokenizerLine[] =
String[] tags =
while ((line = lineStream.read()) != null) {
whitespaceTokenizerLine = WhitespaceTokenizer.INSTANCE
.tokenize(line);
tags = tagger.tag(whitespaceTokenizerLine);
POSSample posTags = new POSSample(whitespaceTokenizerLine, tags);
System.out.println(posTags.toString());
perfMon.incrementCounter();
perfMon.stopAndPrintFinalResult();
// chunker
ChunkerME chunkerME = new ChunkerME(cModel);
String result[] = chunkerME.chunk(whitespaceTokenizerLine, tags);
HashMap&Integer,String& phraseLablesMap = new HashMap&Integer, String&();
Integer wordCount = 1;
Integer phLableCount = 0;
for (String phLable : result){
if(phLable.equals("O")) phLable += "-Punctuation"; //The phLable of the last word is OP
if(phLable.split("-")[0].equals("B")) phLableCount++;
phLable = phLable.split("-")[1] + phLableC
//if(phLable.equals("ADJP")) phLable = "NP"; //Notice: ADJP included in NP
//if(phLable.equals("ADVP")) phLable = "VP"; //Notice: ADVP included in VP
System.out.println(wordCount + ":" + phLable);
phraseLablesMap.put(wordCount, phLable);
wordCount++;
//Span[] span = chunkerME.chunkAsSpans(whitespaceTokenizerLine, tags);
//for (Span phLable : span)
//System.out.println(phLable.toString());
return phraseLablesM
/** Just for testing
* @param tdl Typed Dependency List
* @return WDTreeNode root of WDTree
public static void main(String[] args) throws IOException {
//Notice: There should be " " BEFORE and after ",", " ","(",")" etc.
String input = "We really enjoyed using the Canon PowerShot SD500 .";
//String input = "Bell , based in Los Angeles , makes and distributes electronic , computer and building products .";
ShallowParser swParser = ShallowParser.getInstance();
swParser.chunk(input);
注意要配置好POS Model及Chunker Model的路径,这两个Model的数据文件都可以从OpenNLP的官网下载。
Loading POS Tagger model ... done (1.563s)
Average: 9.3 sent/s
Total: 1 sent
Runtime: 0.107s
We_PRP really_RB enjoyed_VBD using_VBG the_DT Canon_NNP PowerShot_NNP SD500_NNP ._.
9:Punctuation4
从结果中可以看出,Shallow Parser首先输出了POS tag信息,然后从句子中找出了两个名词短语NP1和NP4,一个动词短语VP3和一个副词短语ADVP2
2 Stanford Parser
Stanford Parser可以找出句子中词语之间的dependency关联信息,并且以Stanford Dependency格式输出,包括有向图及树等形式。示例代码如下
package edu.pku.yangliu.nlp.
import java.io.IOE
import java.io.StringR
import java.util.HashM
import java.util.L
import opennlp.tools.util.InvalidFormatE
import edu.stanford.nlp.ling.CoreL
import edu.stanford.nlp.ling.HasW
import edu.stanford.nlp.objectbank.TokenizerF
import edu.stanford.nlp.parser.lexparser.LexicalizedP
import edu.stanford.nlp.process.CoreLabelTokenF
import edu.stanford.nlp.process.DocumentP
import edu.stanford.nlp.process.PTBT
import edu.stanford.nlp.trees.GrammaticalS
import edu.stanford.nlp.trees.GrammaticalStructureF
import edu.stanford.nlp.trees.PennTreebankLanguageP
import edu.stanford.nlp.trees.T
import edu.stanford.nlp.trees.TreebankLanguageP
import edu.stanford.nlp.trees.TypedD
/**Phrase sentences based on stanford parser
* @author yangliu
* @blog http://blog.csdn.net/yangliuy
* @mail yang.liu@pku.edu.cn
public class StanfordParser {
private static StanfordParser instance =
private static LexicalizedP
//Singleton pattern
public static StanfordParser getInstance(){
if(StanfordParser.instance == null){
LexicalizedParser lp = LexicalizedParser.loadModel("edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz","-retainTmpSubcategories");
StanfordParser.instance = new StanfordParser(lp);
return StanfordParser.
public StanfordParser(LexicalizedParser lp){
StanfordParser.lp =
/**Parse sentences in a file
* @param SentFilename The input file
public void DPFromFile(String SentFilename) {
TreebankLanguagePack tlp = new PennTreebankLanguagePack();
GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();
for (List&HasWord& sentence : new DocumentPreprocessor(SentFilename)) {
Tree parse = lp.apply(sentence);
parse.pennPrint();
System.out.println();
GrammaticalStructure gs = gsf.newGrammaticalStructure(parse);
List&TypedDependency& tdl = (List&TypedDependency&)gs.typedDependenciesCollapsedTree();
System.out.println(tdl);
System.out.println();
/**Parse sentences from a String
* @param sent The input sentence
List&TypedDependency& The list for type dependency
public List&TypedDependency& DPFromString(String sent) {
TokenizerFactory&CoreLabel& tokenizerFactory =
PTBTokenizer.factory(new CoreLabelTokenFactory(), "");
List&CoreLabel& rawWords =
tokenizerFactory.getTokenizer(new StringReader(sent)).tokenize();
Tree parse = lp.apply(rawWords);
TreebankLanguagePack tlp = new PennTreebankLanguagePack();
GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();
GrammaticalStructure gs = gsf.newGrammaticalStructure(parse);
//Choose the type of dependenciesCollapseTree
//so that dependencies which do not
//preserve the tree structure are omitted
return (List&TypedDependency&) gs.typedDependenciesCollapsedTree();
Main函数如下
/**Just for testing
* @param args
* @throws IOException
* @throws InvalidFormatException
public static void main(String[] args) throws InvalidFormatException, IOException {
// TODO Auto-generated method stub
//Notice: There should be " " BEFORE and after ",", " ","(",")" etc.
String sent = "We really enjoyed using the Canon PowerShot SD500 .";
//String sent = "Bell , based in Los Angeles , makes and distributes electronic , computer and building products .";
//String sent = "It has an exterior design that combines form and function more elegantly than any point-and-shoot we've ever tested . ";
//String sent = "A Digic II-powered image-processing system enables the SD500 to snap a limitless stream of 7-megapixel photos at a respectable clip , its start-up time is tops in its class , and it delivers decent photos when compared to its competition . ";
//String sent = "I've had it for about a month and it is simply the best point-and-shoot your money can buy . ";
StanfordParser sdPaser = StanfordParser.getInstance();
List&TypedDependency& tdl = sdPaser.DPFromString(sent);
for(TypedDependency oneTdl : tdl){
System.out.println(oneTdl);
ShallowParser swParser = ShallowParser.getInstance();
HashMap&Integer,String& phraseLablesMap = new HashMap&Integer, String&();
phraseLablesMap = swParser.chunk(sent);
WDTree wdtree = new WDTree();
WDTreeNode root = wdtree.bulidWDTreeFromList(tdl, phraseLablesMap);
wdtree.printWDTree(root);
输出的词语之间的dependency关联,POS tag信息及句子语法解析树如下
Loading parser from serialized file edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz ... done [2.1 sec].
nsubj(enjoyed-3, We-1)
advmod(enjoyed-3, really-2)
root(ROOT-0, enjoyed-3)
xcomp(enjoyed-3, using-4)
det(SD500-8, the-5)
nn(SD500-8, Canon-6)
nn(SD500-8, PowerShot-7)
dobj(using-4, SD500-8)
Loading POS Tagger model ... done (1.492s)
We_PRP really_RB enjoyed_VBD using_VBG the_DT Canon_NNP PowerShot_NNP SD500_NNP ._.
Average: 200.0 sent/s
Total: 1 sent
Runtime: 0.0050s
9:Punctuation4
children of ROOT-0_ (phLable:null):
enjoyed-3_
rel:root phLable:VP3
children of enjoyed-3_ (phLable:VP3):
rel:nsubj phLable:NP1
rel:advmod phLable:ADVP2
rel:xcomp phLable:VP3
children of using-4_ (phLable:VP3):
rel:dobj phLable:NP4
children of SD500-8_ (phLable:NP4):
rel:det phLable:NP4
rel:nn phLable:NP4
PowerShot-7_
rel:nn phLable:NP4
Stanford Dependency-Parser 分享
NLP之Stanford Parser using NLTK
没有更多推荐了,python 怎么访问stanford parser的解析树_百度知道
python 怎么访问stanford parser的解析树
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
SE16N通过&sap_edit可以修改表,修改表后如何查看呢。分两步进行。1.事务码SE16N,然后输入表SE16N_CD_Key,输入相应的查询条件。例如table名,查出相应的ID2.事务码SE16N,然后输入表SE16N_CD_DATA,输入相应的ID,就可以查询到修改的内容。...
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Stanford Parser 进行词法语法分析的详细使用
日期: 10:04:07
来源:csdn
Stanford Parser 进行词法语法分析的详细使用
stanford-parser的使用
1、到斯坦福官方网站http://nlp.stanford.edu/software/lex-parser.shtml下载软件包,解压。
2、在eclipse中新建一个java project,把解压得到根目录下的stanford-parser.jar和stanford-parser-3.*.*-models.jar两个包导入项目到项目引用包中,
然后把解压得到根目录下的ParserDemo.java文件拷贝到项目的src中
DEMO的使用
一、直接运行该实例程序(英文语法解析):
1.直接点击run就可以运行
2.如果要String[] sent从文本输入:
eclipse & run & run configuration & arguments & program arguments:
输入: edu/stanford/nlp/models/lexparser/englishPCFG.ser.gzC:\Users\minglan\Desktop\test2.txt
test2.txt:
The screen is really big, but the price
is too expensive!
The price is expensive, students don't buy it usually.
The screen is beautiful, but the price is not!
The screen is big and beautiful!
3.如果要测试中文的话,要如下修改:
(1)按需要把输入改成要测试中文:
String[] sent = {
"这", "是", "第一个", "测试", "句子", "。" };
(2)导入中文的解析模型文件:
Stringgrammar = args.length & 0 ? args[0] : "edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz";
(3)修改源文件中的部分代码:
TreebankLanguagePacktlp = new ChineseTreebankLanguagePack();
如果报错没有retainTmpSubcategories参数,在源文件中注释掉该参数:
String[] options = {"-maxLength", "80"};
二、Stanford Parser自带图形化操作界面
在windows操作系统下只要双击运行软件根目录下的lexparser-gui.bat文件(linux下为lexparser-gui.sh文件)
点击“Load File”导入需要解析文件也可以直接在上面大的输入框中输入要解析内容,
在“Language”选项中选择对应解析的语言。
点击“Load Parser”载入模型文件,稍等片刻(载入模型文件可能需要几秒钟)进度条完成载入后“Parser”按钮变成可用状态,点击即可解上输入框中高亮的内容,解析得到的树形结果在下框中显示,
可以把结果输出另存为文件。
三、Stanford Parser还提供了命令行的方式lexparser-gui.bat(win)和lexparser.sh(linux)具体使用见官方文档: FAQ
四、Stanford Parser有个在线的解释效果示例在:http://nlp.stanford.edu:8080/parser/index.jsp
Stanford parser句法树分析时候占用内存可能较大,所以要调整eclipse虚拟内存空间,方法是在“运行——运行——自变量——VM自变量中填上-Xms256M -Xmx800M”,大小就要看实际情况和机子性能。
当句子较长时会出现报“FactoredParser: exceeded MAX_ITEMS work limit [200000 items]; aborting.”错误...
在options中把MAX_ITEMS设为一个更大的书,如下例子中为500000
String[] options = { "-maxLength", "140", "-MAX_ITEMS","500000"};
lp = LexicalizedParser.loadModel("edu/stanford/nlp/models/lexparser/", options);
解决办法参考:http://blog.amelielee.com/archives/140。
常用的标注解释
CC: conjunction, coordinatin 表示连词
CD: numeral, cardinal 表示基数词
DT: determiner 表示限定词
EX: existential there 存在句
FW: foreign word 外来词
IN: preposition or conjunction, subordinating 介词或从属连词
JJ: adjective or numeral, ordinal 形容词或序数词
JJR: adjective, comparative 形容词比较级
JJS: adjective, superlative 形容词最高级
LS: list item marker 列表标识
MD: modal auxiliary 情态助动词
NN: noun, common, singular or mass
NNS: noun, common, plural
NNP: noun, proper, singular
NNPS: noun, proper, plural
PDT: pre-determiner 前位限定词
POS: genitive marker 所有格标记
PRP: pronoun, personal 人称代词
PRP$: pronoun, possessive 所有格代词
RB: adverb 副词
RBR: adverb, comparative 副词比较级
RBS: adverb, superlative 副词最高级
RP: particle 小品词
SYM: symbol 符号
TO:"to" as preposition or infinitive marker 作为介词或不定式标记
UH: interjection 插入语
VB: verb, base form
VBD: verb, past tense
VBG: verb, present participle or gerund
VBN: verb, past participle
VBP: verb, present tense, not 3rd person singular
VBZ: verb, present tense,3rd person singular
WDT: WH-determiner WH限定词
WP: WH-pronoun WH代词
WP$: WH-pronoun, possessive WH所有格代词
WRB:Wh-adverb WH副词
ROOT:要处理文本的语句IP:简单从句NP:名词短语VP:动词短语PU:断句符,通常是句号、问号、感叹号等标点符号LCP:方位词短语PP:介词短语CP:由‘的’构成的表示修饰性关系的短语DNP:由‘的’构成的表示所属关系的短语ADVP:副词短语ADJP:形容词短语DP:限定词短语QP:量词短语NN:常用名词NR:固有名词NT:时间名词PN:代词VV:动词VC:是CC:表示连词VE:有VA:表语形容词AS:内容标记(如:了)VRD:动补复合词CD: 表示基数词DT: determiner 表示限定词EX: existential there 存在句FW: foreign word 外来词IN: preposition or conjunction, subordinating 介词或从属连词JJ: adjective or numeral, ordinal 形容词或序数词JJR: adjective, comparative 形容词比较级JJS: adjective, superlative 形容词最高级LS: list item marker 列表标识MD: modal auxiliary 情态助动词PDT: pre-determiner 前位限定词POS: genitive marker 所有格标记PRP: pronoun, personal 人称代词RB: adverb 副词RBR: adverb, comparative 副词比较级RBS: adverb, superlative 副词最高级RP: particle 小品词 SYM: symbol 符号TO:”to” as preposition or infinitive marker 作为介词或不定式标记 WDT: WH-determiner WH限定词WP: WH-pronoun WH代词WP$: WH-pronoun, possessive WH所有格代词WRB:Wh-adverb WH副词 关系表示abbrev: abbreviation modifier,缩写acomp: adjectival complement,形容词的补充;advcl : adverbial clause modifier,状语从句修饰词advmod: adverbial modifier状语agent: agent,代理,一般有by的时候会出现这个amod: adjectival modifier形容词appos: appositional modifier,同位词attr: attributive,属性aux: auxiliary,非主要动词和助词,如BE,HAVE SHOULD/COULD等到auxpass: passive auxiliary 被动词cc: coordination,并列关系,一般取第一个词ccomp: clausal complement从句补充complm: complementizer,引导从句的词好重聚中的主要动词conj : conjunct,连接两个并列的词。cop: copula。系动词(如be,seem,appear等),(命题主词与谓词间的)连系csubj : clausal subject,从主关系csubjpass: clausal passive subject 主从被动关系dep: dependent依赖关系det: determiner决定词,如冠词等dobj : direct object直接宾语expl: expletive,主要是抓取thereinfmod: infinitival modifier,动词不定式iobj : indirect object,非直接宾语,也就是所以的间接宾语;mark: marker,主要出现在有“that” or “whether”“because”, “when”,mwe: multi-word expression,多个词的表示neg: negation modifier否定词nn: noun compound modifier名词组合形式npadvmod: noun phrase as adverbial modifier名词作状语nsubj : nominal subject,名词主语nsubjpass: passive nominal subject,被动的名词主语num: numeric modifier,数值修饰number: element of compound number,组合数字parataxis: parataxis: parataxis,并列关系partmod: participial modifier动词形式的修饰pcomp: prepositional complement,介词补充pobj : object of a preposition,介词的宾语poss: possession modifier,所有形式,所有格,所属possessive: possessive modifier,这个表示所有者和那个’S的关系preconj : preconjunct,常常是出现在 “either”, “both”, “neither”的情况下predet: predeterminer,前缀决定,常常是表示所有prep: prepositional modifierprepc: prepositional clausal modifier
本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
Hadoop学习 day01
Hadoop是由apache Software Foundation公司于2005年秋天作为Lucene的子项目Nutch的一部分正式引入的。它受到最先由google lab开发的mapreduce计算模型合google file system分布式文件系统的启发。2006年3月,mapreduce和nutch distributed file system 分别被纳入称为hadoop的项目中。
Hadoop是一个能够对大量数据进行分布式处理的软件框架。Hadoop因
关联文章: 数据仓库应用(一):数据仓库模型设计 数据仓库应用(三): SQL Server 2005的数据仓库应用–联机分析OLAP 一、问题背景 某电子商务网站主要销售电子类产品,产品又分为几个大类别,包括:电脑类、手机类、键盘类等,每个类别内又细分为几个小类别,各类别下又有诸多的商品,每一个商品都有一个唯一的商品编号。用户可以通过注册成为会员来进行商品的下单购买。用户下单后会由系统自动产生一个唯一的订单号。 现在已为该电子商务平台创建了数据仓库,这次将为该电子商务平台数据仓库建立数据抽取、转换、加载
Raft 算法完全理解手册
by : bigfish
博客地址: http://blog.csdn.net/hfty290
Raft算法来自Diego Ongaro等人发表的论文”In Search of an Understandable Consensus Algorithm”,其中对该算法的各个方面都做了详细论述。本人也对该论文进行了翻译详见:http://pan.baidu.com/s/1kTBqGlT。作者声称该算法相较于提供了很好地可理解性与工程
#!/bin/sh #启动物理端口 echo "openflow" | sudo -S ifconfig eth0 up echo "openflow" | sudo -S ifconfig eth1 up echo "openflow" | sudo -S ifconfig eth2 up echo "openflow" | sudo -S ifconfig eth3 up #如果网桥已存在,删除 echo "openflow" | sudo -S ovs-vsctl --if-exists del-b
1、Azkaban是什么
我们在工作中应该都遇到过这样的场景:有一个任务,这个任务可以划分成多个较小的任务完成,之所以进行划分是因为小任务之间可以并发的进行,例如是一个shell脚本执行的命令吧,大任务A可以划分成B、C、D、E四个子任务(脚本)完成,而B和C是可以同时进行的,D依赖B和C的输出,E又依赖D的输出,于是我们一般的做法可能就是开两个终端同时执行B和C,等两个都执行完成之后再执行D,接着在执行E。整个执行的过程都需要我们参与,但是整个的执行过程类似一个有向无环图,每一个子任务的执行可
http:// blog.csdn.net/pipisorry/article/details/ 在[1]: % matplotlib inline 抓取的数据 一个简单的HTTP请求 在[2]: import requests print requests . get ( "http://example.com" ) . text !doctype htmlhtmlhead titleExample Domain/title meta charset="utf-8" / meta htt
2家的服务都在用,简单总结了几点,见仁见智: 微软云以服务为级别提供防火墙配置,阿里云没有,虽然也可以在操作系统级别来设定防火墙,但是可以portal上配置外部防火墙真的太实用太方便了,相信微软在这方面下了很大的功夫才可以做到。 微软提供一个azure 的命令开发接口,可以对虚拟机做很多的定制开发,一个最简单实在的需求就是晚上没有业务的时候,可以配置服务器自动关机,早上起来再开机,微软云默认按照时间来计算费用,这一点可以很有吸引力。另外定制的接口还可以和原有的监控系统结合起来。 流量,微软云大客户会每个月
软件版本:Storm:0.9.3 ,Redis:2.8.19;jedis:2.6.2; 参考:http://storm.apache.org/documentation/Understanding-the-parallelism-of-a-Storm-topology.html 一、Storm原理
Storm简述:Storm中有两个组件:nimbus和supervisor,nimbus主要负责分配资源和schedule和协调任务,supervisor主要启动worker,每个worker可以启动一个
Hadoop版本演进概况: 备注:NameNode HA : NameNode高可用 , HDFS Fedreation 分布式文件系统联盟 解决了1带的单点问题
Yarm 分布式资源管理系统,解决JobTrack单点问题
1. hadoop 1.x 版本的生态系统: 2. hadoop 2.x版本的生态系统: 对于分布式系统和框架的架构来说,一般分为两部分: 第一部分:管理层(用于管理应用层) 第二部分:应用层 (工作的) 对于HDFS,分布式文件系统:
目前 Redis Cluster 仍处于 Beta 版本, Redis 3.0 将会加入,在此可以先对其主要功能和原理进行一个预览。参考《 Redis Cluster - a pragmatic approach to distribution 》。 1
没有集群的 Redis 没有集群功能的 Redis ,每个 master-slave 主从复制都独立于其他结点, sharding 需要在客户端如 Jedis 中控制。可以使用官方提供的 Sentinel 监控主从的状态,实现自动的 Fail-over
Copyright (C)
ITfish.net

我要回帖

更多关于 stanford怎么读6 的文章

 

随机推荐