在 NLTK 中使用 Stanford NLP 工具包

src: http://www.zmonster.me/2016/06/08/use-stanford-nlp-package-in-nltk.html#orgheadline1

ZMonster's Blog 巧者勞而智者憂,無能者無所求捶牢,飽食而遨游会涎,泛若不系之舟

在 NLTK 中使用 Stanford NLP 工具包
08 Jun 2016目錄
NLTK 與 Stanford NLP
安裝和配置注意事項
StanfordSegmenter
StanfordTokenizer
StanfordNERTagger 和 StanfordPOSTagger
StanfordParser, StanfordDependencyParser
StanfordNeuralDependencyParser

基本使用使用 StanfordSegmenter 和 StanfordTokenizer 進行分詞
使用 StanfordNERTagger 進行命名實體識別
使用 StanfordPOSTagger 進行詞性標注
使用 StanfordParser 進行句法分析
使用 StanfordDependencyParser 進行依存句法分析

NLTK 與 Stanford NLP
NLTK 是一款著名的 Python 自然語言處理(Natural Language Processing, NLP)工具包,在其收集的大量公開數(shù)據(jù)集柴淘、模型上提供了全面代乃、易用的接口,涵蓋了分詞、詞性標注(Part-Of-Speech tag, POS-tag)淋昭、命名實體識別(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各項 NLP 領域的功能安接。
Stanford NLP 是由斯坦福大學的 NLP 小組開源的 Java 實現(xiàn)的 NLP 工具包翔忽,同樣對 NLP 領域的各個問題提供了解決辦法。
斯坦福大學的 NLP 小組是世界知名的研究小組盏檐,如果能將 NLTK 和 Stanford NLP 這兩個工具包結合起來使用歇式,那自然是極好的!在 2004 年 Steve Bird 在 NLTK 中加上了對 Stanford NLP 工具包的支持胡野,通過調(diào)用外部的 jar 文件來使用 Stanford NLP 工具包的功能材失。
從 NLTK 的 commit 歷史中可以找到相應的提交記錄:

commit e1372fef56bfb88d02fdb6c0ea88474d5f414a38
Author: Steven Bird <stevenbird1@gmail.com>
Date: Tue Aug 3 12:20:20 2004 +0000 
    added Stanford svn/trunk@2088

現(xiàn)在的 NLTK 中,通過封裝提供了 Stanford NLP 中的以下幾個功能:
分詞
詞性標注
命名實體識別
句法分析硫豆,依存句法分析

安裝和配置
NLTK 3.2 之后加入了用于中文分詞的 StanfordSegmenter 這個類龙巨,作者是知名 NLP 博主 52nlp笼呆,見 相關文章。而 NLTK 3.1 及之前則只有以下幾個類:
分詞: StanfordTokenizer
詞性標注: StanfordPOSTagger
命名實體識別: StanfordNERTagger
句法分析: StanfordParser
依存句法分析: StanfordDependencyParser, StanfordNeuralDependencyParser

方便起見旨别,本文以 NLTK 3.2 這個版本來說明如何進行相關的安裝和配置诗赌,3.1 及之前的版本基本相同。

注意事項
需要注意這么幾點:
Stanford NLP 工具包自 2014 年 10 月后(大概是 version 3.5.0)需要 Java 8 及之后的版本秸弛,如果出錯請檢查 Java 版本
下面的配置過程都以 Stanford NLP 3.6.0 為例铭若,如果使用的是其他版本,請注意替換相應的文件名
下面的配置過程以 NLTK 3.2 為例递览,如果使用 NLTK 3.1叼屠,需要注意該舊版本中 StanfordSegmenter 未實現(xiàn),其余大致相同
下面的配置過程是針對不同的接口分別講述各自如何配置绞铃,根據(jù)來自 NLTK 的源代碼镜雨,分別是

nltk/tokenize/stanford.py
nltk/tag/stanford.py
nltk/parse/stanford.py

如果不想了解這些細節(jié),可以參考 NLTK 官方 wiki 頁面上的內(nèi)容憎兽,但需要注意的是,StanfordSegmenter 和 StanfordNeuralDependencyParser 這兩者的配置和其他的都不一樣吵冒,而 wiki 頁面上并未覆蓋到這部分內(nèi)容纯命。

事實上,也可以完全不進行環(huán)境變量設置痹栖,但這就需要在每次調(diào)用的時候手動指定參數(shù)

StanfordSegmenter
http://nlp.stanford.edu/software/segmenter.html 處下載 stanford-segmenter-2015-12-09.zip (version 3.6.0)
將 stanford-segmenter-2015-12-09.zip 解壓, 并將解壓目錄中的 stanford-segmenter-3.6.0.jar 拷貝為 stanford-segmenter.jar
stanford-segmenter.jarslf4j-api.jar 加入到 CLASSPATH 中去
例:

export STANFORD_SEGMENTER_PATH="$HOME/stanford/segmenter"export CLASSPATH="$CLASSPATH:$STANFORD_SEGMENTER_PATH/stanford-segmenter.jar:$STANFORD_SEGMENTER_PATH/slf4j-api.jar"

之所以要將 stanford-segmenter.jarslf4j-api.jar 加入到 CLASSPATH 中亿汞,是因為在 StanfordSegmenter 的實現(xiàn)中顯式依賴了這兩個文件,并且優(yōu)先在 CLASSPATH 中尋找這兩個文件揪阿。如果在 CLASSPATH 中找不到 stanford-segmenter.jar 疗我,則會在環(huán)境變量 STANFORD_SEGMENTER 指定的路徑中尋找;同樣的南捂,如果找不到 slf4j-api.jar 吴裤,則會在環(huán)境變量 SLF4J 指定的路徑中尋找。其他幾個類也有同樣的依賴設置溺健,為了統(tǒng)一管理麦牺,可以將所有依賴的 jar 文件都加入到 CLASSPATH 中去,當然分別為不同的 jar 文件設置不同的環(huán)境變量也是可以的鞭缭。
除了設置環(huán)境變量剖膳,也可以通過函數(shù)參數(shù)來傳入依賴的 jar 文件的準確路徑,此時將會忽略環(huán)境變量設置岭辣。

StanfordTokenizer
http://nlp.stanford.edu/software/tagger.html 中下載 stanford-postagger-full-2015-12-09.zip (version 3.6.0)
stanford-postagger-full-2015-12-09.zip 解壓
將解壓目錄中的 stanford-postagger.jar 加入到 CLASSPATH 中吱晒,或者設置到環(huán)境變量

STANFORD_POSTAGGER 中
export STANFORD_POSTAGGER_PATH="$HOME/stanford/postagger"export CLASSPATH="$CLASSPATH:$STANFORD_POSTAGGER_PATH/stanford-postagger.jar"

export STANFORD_POSTAGGER="$HOME/stanford/postagger/stanford-postagger.jar"

StanfordNERTagger 和 StanfordPOSTagger
在 NLTK 里,StanfordNERTagger 和 StanfordPOSTagger 都繼承自 StanfordTagger 沦童,在設置上有共同之處仑濒,因此放到一起來講一下叹话。
http://nlp.stanford.edu/software/CRF-NER.html 處下載 stanford-ner-2015-12-09.zip (version 3.6.0)
http://nlp.stanford.edu/software/tagger.html 中下載 stanford-postagger-full-2015-12-09.zip (version 3.6.0)
stanford-ner-2015-12-09.zipstanford-postagger-full-2015-12-09.zip 都解壓
將解壓后目錄中的 stanford-ner.jarstanford-postagger.jar 加入到 CLASSPATH 中去,和 StanfordTokenizer 不一樣躏精,這兩個類都只從 CLASSPATH 中尋找對應的 jar 文件(所以為了統(tǒng)一我建議都添加到 CLASSPATH 中去)

export STANFORD_NER_PATH="$HOME/stanford/ner"export STANFORD_POSTAGGER_PATH="$HOME/stanford/postagger"export CLASSPATH="$CLASSPATH:$STANFORD_NER_PATH/stanford-ner.jar:$STANFORD_POSTAGGER_PATH/stanford-postagger.jar"

同時將 stanford-ner-2015-12-09.zip 解壓后目錄中的 classifiers 目錄和 stanford-postagger-full-2015-12-09.zip 解壓后目錄中的 models 目錄加入到環(huán)境變量 STANFORD_MODELS 中去
export STANFORD_MODELS="$STANFORD_NER_PATH/classifiers:$STANFORD_POSTAGGER_PATH/models"

StanfordParser, StanfordDependencyParser
StanfordParser 和 StanfordDependencyParser 都繼承自 GenericStanfordParser 渣刷,使用 stanford-parser.jar 來提供句法分析功能。
http://nlp.stanford.edu/software/lex-parser.html 處下載 stanford-parser-full-2015-12-09.zip (version 3.6.0)
將下載的壓縮包解壓矗烛,并將其中的 stanford-parser.jarstanford-parser-3.6.0-models.jar(這個在不同版本中名稱會不一樣) 都加入到 CLASSPATH 中

export STANFORD_PARSER_PATH="$HOME/stanford/parser"export CLASSPATH="$CLASSPATH:$STANFORD_PARSER_PATH/stanford-parser.jar:$STANFORD_PARSER_PATH/stanford-parser-3.6.0-models.jar"

或者將 stanford-parser.jar 加入到環(huán)境變量 STANFORD_PARSER 中辅柴,將 stanford-parser-3.6.0-models.jar 加入到環(huán)境變量 STANFORD_MODELS 中

export STANFORD_PARSER="$STANFORD_PARSER_PATH/stanford-parser.jar"export STANFORD_MODELS="$STANFORD_MODELS:$STANFORD_PARSER_PATH/stanford-parser-3.6.0.models.jar"

StanfordNeuralDependencyParser
StanfordNeuralDependencyParser 雖然也繼承自 GenericStanfordParser,并且用來進行句法分析瞭吃,但它使用的 Stanford CoreNLP 中的功能和模型碌嘀,不依賴 Stanford Parser 這個(子)工具包。
http://stanfordnlp.github.io/CoreNLP/ 處下載 stanford-corenlp-full-2015-12-09.zip
將下載的壓縮包解壓歪架,并將其中的 stanford-corenlp-3.6.0.jarstanford-corenlp-3.6.0-models.jar 加入到 CLASSPATH 中去

export STANFORD_CORENLP_PATH="$HOME/stanford-corenlp-full-2015-12-09"export CLASSPATH="$CLASSPATH:$STANFORD_CORENLP_PATH/stanford-corenlp-3.6.0.jar:$STANFORD_CORENLP_PATH/stanford-corenlp-3.6.0-models.jar"

或者可以更簡單地將解壓目錄設置為環(huán)境變量 STANFORD_CORENLP 的值

export STANFORD_CORENLP=$STANFORD_CORENLP_PATH

基本使用

使用 StanfordSegmenter 和 StanfordTokenizer 進行分詞
StanfordSegmenter 是 52nlp 實現(xiàn)的對 Stanford Segmenter 的封裝股冗,用來進行中文分詞。

# coding: utf-8
from nltk.tokenize import StanfordSegmenter
segmenter = StanfordSegmenter( 
  path_to_sihan_corpora_dict="/home/linusp/stanford/segmenter/data/",   path_to_model="/home/linusp/stanford/segmenter/data/pku.gz",   path_to_dict="/home/linusp/stanford/segmenter/data/dict-chris6.ser.gz")
res = segmenter.segment(u"北海已成為中國對外開放中升起的一顆明星")
print type(res)
print res.encode('utf-8')
<type 'unicode'>
北海 已 成為 中國 對外開放 中 升起 的 一 顆 明星

StanfordSegmenter 的初始化參數(shù)說明:
path_to_jar: 用來定位 stanford-segmenter.jar 和蚪,在設置了 CLASSPATH 的情況下止状,該參數(shù)可留空
注: 其他所有 Stanford NLP 接口都有 path_to_jar 這個參數(shù),同樣在設置了環(huán)境變量的情況下可以留空攒霹,后面不再另加說明怯疤。

path_to_slf4j: 用來定位 slf4j-api.jar ,在設置了 CLASSPATH 或者 SLF4J 這個環(huán)境變量的情況下催束,該參數(shù)可留空
path_to_sihan_corpora_dict: 設定為 stanford-segmenter-2015-12-09.zip 解壓后目錄中的 data 目錄集峦,話說這個參數(shù)名真是讓人摸不著頭腦
path_to_model: 用來指定用于中文分詞的模型,在 stanford-segmenter-2015-12-09 的 data 目錄下抠刺,有兩個可用模型 pkg.gzctb.gz

需要注意的是塔淤,使用 StanfordSegmenter 進行中文分詞后,其返回結果并不是 list 速妖,而是一個字符串高蜂,各個漢語詞匯在其中被空格分隔開。
StanfordTokenizer 可以用來進行英文的分詞罕容,使用起來比較簡單

# coding: utf-8
from nltk.tokenize import StanfordTokenizer
tokenizer = StanfordTokenizer()
sent = "Good muffins cost $3.88\nin New York. Please buy me\ntwo of them.\nThanks."
print tokenizer.tokenize(sent)
[u'Good', u'muffins', u'cost', u'$', u'3.88', u'in', u'New', u'York', u'.', u'Please', u'buy', u'me', u'two', u'of', u'them', u'.', u'Thanks', u'.']

使用 StanfordNERTagger 進行命名實體識別
所謂命名實體識別妨马,是用來識別并標注文本中的人名、地名杀赢、組織機構名等單元烘跺,這些單元既是 "命名實體"。

# coding: utf-8
from nltk.tag import StanfordNERTagger
eng_tagger = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')
print eng_tagger.tag('Rami Eid is studying at Stony Brook University in NY'.split())
[(u'Rami', u'PERSON'), (u'Eid', u'PERSON'), (u'is', u'O'), (u'studying', u'O'), (u'at', u'O'), (u'Stony', u'ORGANIZATION'), (u'Brook', u'ORGANIZATION'), (u'University', u'ORGANIZATION'), (u'in', u'O'), (u'NY', u'O')]

StanfordNERTagger 在初始化時需要指定所使用的模型脂崔,在 stanford-ner-2015-12-09.zip 解壓后的 classifiers 目錄中滤淳,有幾個可用的英語 NER 模型:
/home/linusp/stanford/ner/classifiers/├── english.all.3class.distsim.crf.ser.gz├── english.all.3class.distsim.prop├── english.conll.4class.distsim.crf.ser.gz├── english.conll.4class.distsim.prop├── english.muc.7class.distsim.crf.ser.gz├── english.muc.7class.distsim.prop├── example.serialized.ncc.ncc.ser.gz└── example.serialized.ncc.prop
如果需要進行中文的命名實體識別,則可以在 Stanford Named Entity Recognizer 頁面的 Models 一節(jié)找到中文模型的下載鏈接砌左,下載得到 stanford-chinese-corenlp-2015-12-08-models.jar 脖咐,解壓后將 edu/stanford/nlp/models/ner/ 目錄下的 chinese.misc.distsim.crf.ser.gz 和 chinese.misc.distsim.prop 復制到模型目錄下(stanford-ner-2015-12-09/classifiers)即可铺敌。

coding: utf-8from nltk.tag import StanfordNERTaggerchi_tagger = StanfordNERTagger('chinese.misc.distsim.crf.ser.gz')sent = u'北海 已 成為 中國 對外開放 中 升起 的 一 顆 明星'for word, tag in chi_tagger.tag(sent.split()): print word.encode('utf-8'), tag

北海 GPE已 O成為 O中國 GPE對外開放 O中 O升起 O的 O一 O顆 O明星 O

使用 StanfordPOSTagger 進行詞性標注
所謂詞性標注,是根據(jù)句子中的上下文信息屁擅,給句中每個詞確定一個最為合適的詞性標記偿凭,比如動詞、名詞派歌、人稱代詞等弯囊。
和 StanfordNERTagger 一樣,StanfordPOSTagger 需要的輸入也是一個已經(jīng)分好詞的句子胶果,下面是一個英文的詞性標注實例:
from nltk.tag import StanfordPOSTaggereng_tagger = StanfordPOSTagger('english-bidirectional-distsim.tagger')print eng_tagger.tag('What is the airspeed of an unladen swallow ?'.split())

[(u'What', u'WP'), (u'is', u'VBZ'), (u'the', u'DT'), (u'airspeed', u'NN'), (u'of', u'IN'), (u'an', u'DT'), (u'unladen', u'JJ'), (u'swallow', u'VB'), (u'?', u'.')]
如果之前配置時下載的是 stanford-postagger-full-xxxx-xx-xx.zip 匾嘱,在解壓后,其中的 models 目錄是包含有兩個中文模型的早抠,分別是 chinese-distsim.taggerchinese-nodistsim.tagger 霎烙,可以直接使用。

coding: utf-8from nltk.tag import StanfordPOSTaggerchi_tagger = StanfordPOSTagger('chinese-distsim.tagger')sent = u'北海 已 成為 中國 對外開放 中 升起 的 一 顆 明星'for _, word_and_tag in chi_tagger.tag(sent.split()): word, tag = word_and_tag.split('#') print word.encode('utf-8'), tag

北海 NR已 AD成為 VV中國 NR對外開放 NN中 LC升起 VV的 DEC一 CD顆 M明星 NN
這個中文的詞性標注輸出的結果有點奇怪……

使用 StanfordParser 進行句法分析
句法分析在分析單個詞的詞性的基礎上蕊连,嘗試分析詞與詞之間的關系悬垃,并用這種關系來表示句子的結構。實際上甘苍,句法結構可以分為兩種尝蠕,一種是短語結構,另一種是依存結構羊赵。前者按句子順序來提取句法結構趟佃,后者則按詞與詞之間的句法關系來提取句子結構扇谣。這里說的句法分析得到的是短語結構昧捷。
from nltk.parse.stanford import StanfordParsereng_parser = StanfordParser(model_path=u'edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz')print list(eng_parser.parse("the quick brown fox jumps over the lazy dog".split()))

[Tree('ROOT', [Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['quick']), Tree('JJ', ['brown']), Tree('NN', ['fox'])]), Tree('NP', [Tree('NP', [Tree('NNS', ['jumps'])]), Tree('PP', [Tree('IN', ['over']), Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['lazy']), Tree('NN', ['dog'])])])])])])]
得到的結果是一個 list, 其中的元素是 Tree 類型的,在上面這個例子中罐寨,這個 list 的長度是 1 靡挥,調(diào)用 Tree 的 draw 方法可以將句法樹繪制出來。


eng_parse_tree.png

要進行中文的句法分析鸯绿,只要指定好中文的模型就好跋破,可用的中文模型有兩個,分別是 'edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz' 和 'edu/stanford/nlp/models/lexparser/chineseFactored.ser.gz'瓶蝴,依然拿 "北海 已 成為 中國 對外開放 中 升起 的 一 顆 明星" 這句話作為例子毒返,得到的句法樹如下所示。

chi_parse_tree.png

使用 StanfordDependencyParser 進行依存句法分析
見上一節(jié)舷手,依存句法分析得到的是句子的依存結構拧簸。
from nltk.parse.stanford import StanfordDependencyParsereng_parser = StanfordDependencyParser(model_path=u'edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz')res = list(eng_parser.parse("the quick brown fox jumps over the lazy dog".split()))for row in res[0].triples(): print row

((u'fox', u'NN'), u'det', (u'the', u'DT'))((u'fox', u'NN'), u'amod', (u'quick', u'JJ'))((u'fox', u'NN'), u'amod', (u'brown', u'JJ'))((u'fox', u'NN'), u'dep', (u'jumps', u'NNS'))((u'jumps', u'NNS'), u'nmod', (u'dog', u'NN'))((u'dog', u'NN'), u'case', (u'over', u'IN'))((u'dog', u'NN'), u'det', (u'the', u'DT'))((u'dog', u'NN'), u'amod', (u'lazy', u'JJ'))
繪制出來的依存句法結構如下圖所示。


dep_parse_tree.png

中文的依存句法分析同理男窟,在初始化時使用中文模型即可盆赤,不再贅述贾富。
StanfordNeuralDependencyParser 的使用與 StanfordDependencyParser 一樣,但是在本人的機器上執(zhí)行非常耗時牺六,即使是對一些簡單句子颤枪,所以這里就不略過不講了。

Naringu is designed by Rizky AriestiyansyahCopyright ? 2016

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淑际,一起剝皮案震驚了整個濱河市畏纲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庸追,老刑警劉巖霍骄,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異淡溯,居然都是意外死亡读整,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門咱娶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來米间,“玉大人,你說我怎么就攤上這事膘侮∏” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵琼了,是天一觀的道長逻锐。 經(jīng)常有香客問我,道長雕薪,這世上最難降的妖魔是什么昧诱? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮所袁,結果婚禮上盏档,老公的妹妹穿的比我還像新娘。我一直安慰自己燥爷,他們只是感情好蜈亩,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著前翎,像睡著了一般稚配。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上港华,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天道川,我揣著相機與錄音,去河邊找鬼。 笑死愤惰,一個胖子當著我的面吹牛苇经,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宦言,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼扇单,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奠旺?” 一聲冷哼從身側響起蜘澜,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎响疚,沒想到半個月后鄙信,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡忿晕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年装诡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片践盼。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸦采,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咕幻,到底是詐尸還是另有隱情渔伯,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布肄程,位于F島的核電站锣吼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蓝厌。R本人自食惡果不足惜玄叠,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褂始。 院中可真熱鬧诸典,春花似錦描函、人聲如沸崎苗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胆数。三九已至,卻和暖如春互墓,著一層夾襖步出監(jiān)牢的瞬間必尼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留判莉,地道東北人豆挽。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像券盅,于是被迫代替她去往敵國和親帮哈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容