一切都取決於你所使用的分析儀,因爲分析儀確定使用哪個分詞器。標記器負責標記提取,在最簡單的情況下,它與定義字邊界相似。
鑑於你所描述的行爲,我想你正在使用的StandardAnalyzer
,它使用StandardTokenizer
,它實現Unicode text segmentation,其中規定了以下內容:
例如,在期間(U + 002E FULL STOP)被模棱兩可地使用,有時用於句末,有時用於縮寫,有時用於數字。
在該文件中,句號字符是MidNumLet屬性值的一部分,您的具體情況由WB6和WB7規則處理:
(ALetter | Hebrew_Letter) × (MidLetter | MidNumLet | Single_Quote) (ALetter | Hebrew_Letter)
(ALetter | Hebrew_Letter) (MidLetter | MidNumLet | Single_Quote) × (ALetter | Hebrew_Letter)
的×
符號表示:無字這裏允許休息。
更簡單:如果所述字符緊接在和之後並且後面跟一個字母,則不允許在標點符號之前或之後進行單詞分詞。
,標準分詞的語法遵循以下規則:
// UAX#29 WB5. (ALetter | Hebrew_Letter) × (ALetter | Hebrew_Letter)
// WB6. (ALetter | Hebrew_Letter) × (MidLetter | MidNumLet | Single_Quote) (ALetter | Hebrew_Letter)
// WB7. (ALetter | Hebrew_Letter) (MidLetter | MidNumLet | Single_Quote) × (ALetter | Hebrew_Letter)
// WB7a. Hebrew_Letter × Single_Quote
// WB7b. Hebrew_Letter × Double_Quote Hebrew_Letter
// WB7c. Hebrew_Letter Double_Quote × Hebrew_Letter
// WB9. (ALetter | Hebrew_Letter) × Numeric
// WB10. Numeric × (ALetter | Hebrew_Letter)
// WB13. Katakana × Katakana
// WB13a. (ALetter | Hebrew_Letter | Numeric | Katakana | ExtendNumLet) × ExtendNumLet
// WB13b. ExtendNumLet × (ALetter | Hebrew_Letter | Numeric | Katakana)
//
{ExtendNumLetEx}* ({KatakanaEx} ({ExtendNumLetEx}* {KatakanaEx} )*
| ({HebrewLetterEx} ({SingleQuoteEx} | {DoubleQuoteEx} {HebrewLetterEx} )
| {NumericEx} (({ExtendNumLetEx}* | {MidNumericEx}) {NumericEx} )*
| {HebrewOrALetterEx} (({ExtendNumLetEx}* | {MidLetterEx} ) {HebrewOrALetterEx})*
)+
)
({ExtendNumLetEx}+ ({KatakanaEx} ({ExtendNumLetEx}* {KatakanaEx} )*
| ({HebrewLetterEx} ({SingleQuoteEx} | {DoubleQuoteEx} {HebrewLetterEx} )
| {NumericEx} (({ExtendNumLetEx}* | {MidNumericEx}) {NumericEx} )*
| {HebrewOrALetterEx} (({ExtendNumLetEx}* | {MidLetterEx} ) {HebrewOrALetterEx})*
)+
)
)*
{ExtendNumLetEx}*
{ return WORD_TYPE; }
結論:
如果你需要一個不同的行爲,你必須使用一個不同的分析器,能夠更好地滿足您的目標。我猜想像LetterTokenizer不適合,但你可以創建自己的標記物基於CharTokenizer來實現自己的規則。
多麼好的解釋!感謝盧卡斯。 – Ste 2014-10-19 14:22:26