PostgreSQL: kèo bóng đá hôm | |||
---|---|---|---|
prev | UP | Chương 12. Tìm kiếm toàn văn | Tiếp theo |
kèo chấp bóng đá hôm nay được sử dụng để loại bỏ các từ không nên xem xét trong tìm kiếm (Dừng từ) và đếnbình thườngCác từ sao cho các dạng dẫn xuất khác nhau của cùng kèo chấp bóng đá hôm nay từ sẽ khớp. kèo chấp bóng đá hôm nay từ được chuẩn hóa thành công được gọi làLexeme. Ngoài việc cải thiện chất lượng tìm kiếm, bình thường hóa và loại bỏ các từ dừng, giảm kích thước củaTSVECTORĐại diện của kèo chấp bóng đá hôm nay tài liệu, do đó cải thiện hiệu suất. Bình thường hóa không phải lúc nào cũng có ý nghĩa ngôn ngữ và thường phụ thuộc vào ngữ nghĩa ứng dụng.
kèo chấp bóng đá hôm nay số ví dụ về chuẩn hóa:
Ti ngôn ngữ - từ vựng ISPELL cố gắng giảm các từ đầu vào xuống dạng chuẩn hóa; từ vựng thân cây loại bỏ kết thúc từ
urlVị trí có thể được Canonical hóa để làm cho các URL tương đương phù hợp:
http: //www.pgsql.ru/db/mw/index.html
http: //www.pgsql.ru/db/mw/
http: //www.pgsql.ru/db/../db/mw/index.html
tên màu có thể được thay thế bằng các giá trị thập lục phân của chúng, ví dụ:Đỏ, xanh lá cây, xanh dương, Magenta - FF0000, 00FF00, 0000FF, FF00FF
Nếu số lượng lập chỉ mục, chúng ta có thể xóa kèo chấp bóng đá hôm nay số chữ số phân số để giảm phạm vi số có thể, ví dụ3.14159265359,3.1415926,3.14sẽ giống nhau sau khi bình thường hóa nếu chỉ có hai chữ số được giữ sau điểm thập phân.
từ vựng là kèo chấp bóng đá hôm nay chương trình chấp nhận từ vựng | làm đầu vào và trả về:
Một mảng từ vựng nếu từ vựng | đầu vào được biết đến kèo chấp bóng đá hôm nay (lưu ý rằng một từ vựng | có thể tạo ra nhiều hơn một từ vựng)
kèo chấp bóng đá hôm nay từ vựng duy nhất vớiTSL_Filter11608_11749kèo chấp bóng đá hôm nay lọc)
Một mảng trống nếu kèo chấp bóng đá hôm nay biết từ vựng |, nhưng đó là một từ dừng
nullNếu kèo chấp bóng đá hôm nay không nhận ra từ vựng | đầu vào
PostgreSQLcung cấp kèo chấp bóng đá hôm nay được xác định trước cho nhiều ngôn ngữ. Ngoài ra còn có một số mẫu được xác định trước có thể được sử dụng để tạo kèo chấp bóng đá hôm nay mới với các tham số tùy chỉnh.PREDT/Vùng củaPostgreSQLPhân phối cho các ví dụ.
Cấu hình tìm kiếm văn bản liên kết một trình phân tích cú pháp cùng với một bộ kèo chấp bóng đá hôm nay để xử lý mã thông báo đầu ra của trình phân tích cú pháp. Đối với mỗi loại mã thông báo mà trình phân tích cú pháp có thể trả về, một danh sách kèo chấp bóng đá hôm nay riêng biệt được chỉ định bởi cấu hình.nullđầu ra xác định kết quả và bất kỳ kèo chấp bóng đá hôm nay còn lại nào không được tư vấn; Nhưng một kèo chấp bóng đá hôm nay lọc có thể thay thế từ đã cho bằng một từ đã được sửa đổi, sau đó được truyền đến các kèo chấp bóng đá hôm nay tiếp theo.
Quy tắc chung để định cấu hình danh sách kèo chấp bóng đá hôm nay là đặt đầu tiên là kèo chấp bóng đá hôm nay hẹp nhất, cụ thể nhất, sau đó các kèo chấp bóng đá hôm nay chung hơn, kết thúc với một kèo chấp bóng đá hôm nay rất chungSnowballStemmer hoặcđơn giản, nhận ra mọi thứ. Ví dụ: cho kèo chấp bóng đá hôm nay tìm kiếm dành riêng cho thiên văn học (Astro_enCấu hình) Người ta có thể liên kết loại từ vựng |asciiword(ASCII Word) đến một kèo chấp bóng đá hôm nay đồng nghĩa với các thuật ngữ thiên văn, kèo chấp bóng đá hôm nay tiếng Anh chung và ASnowballEnglish Stemmer:
Thay đổi cấu hình tìm kiếm văn bản astro_en
Một kèo chấp bóng đá hôm nay lọc có thể được đặt ở bất cứ đâu trong danh sách, ngoại trừ ở cuối nơi nó sẽ vô dụng. Lọc kèo chấp bóng đá hôm nay rất hữu ích để bình thường hóa một phần các từ để đơn giản hóa nhiệm vụ của các kèo chấp bóng đá hôm nay sau này.UnaccentMô -đun.
Từ dừng là những từ rất phổ biến, xuất hiện trong hầu hết mọi tài liệu và không có giá trị phân biệt đối xử. Do đó, chúng có thể bị bỏ qua trong bối cảnh tìm kiếm toàn văn.AvàThe, vì vậy việc lưu trữ chúng là vô ích. Tuy nhiên, các từ dừng lại ảnh hưởng đến các vị trí trongtsVector, lần lượt ảnh hưởng đến xếp hạng:
chọn to_tsvector ('tiếng Anh', 'trong danh sách các từ dừng');
Vị trí bị thiếu 1,2,4 là do các từ dừng. Xếp hạng được tính toán cho các tài liệu có và không có từ dừng hoàn toàn khác:
15354_15628
Nó tùy thuộc vào kèo chấp bóng đá hôm nay cụ thể cách nó đối xử với các từ dừng. Ví dụ,ISPELLkèo chấp bóng đá hôm nay đầu tiên bình thường hóa các từ và sau đó nhìn vào danh sách các từ dừng, trong khiSnowballĐầu tiên kiểm tra danh sách các từ dừng. Lý do cho các hành vi khác nhau là kèo chấp bóng đá hôm nay nỗ lực để giảm tiếng ồn.
Theđơn giảnMẫu kèo chấp bóng đá hôm nay hoạt động bằng cách chuyển đổi mã thông báo đầu vào thành chữ thường và kiểm tra nó đối với một tệp các từ dừng. Nếu nó được tìm thấy trong tệp thì một mảng trống sẽ được trả về, khiến mã thông báo bị loại bỏ.
Đây là một ví dụ về định nghĩa kèo chấp bóng đá hôm nay bằng cách sử dụngđơn giảnMẫu:
Tạo kèo chấp bóng đá hôm nay tìm kiếm văn bản công khai.simple_dict (
ở đây,Tiếng Anhlà tên cơ sở của kèo chấp bóng đá hôm nay tệp của các từ dừng. Tên đầy đủ của tệp sẽ là$ Sharedir/Tsearch_data/English.stop, trong đó$ sharedircó nghĩa làPostgreSQLThư mục dữ liệu chia sẻ của Cài đặt, thường là/usr/local/share/postgresql(Sử dụngpg_config --SharedirĐể xác định nó nếu bạn không chắc chắn). Định dạng tệp chỉ đơn giản là kèo chấp bóng đá hôm nay danh sách các từ, kèo chấp bóng đá hôm nay từ trên mỗi dòng.
Bây giờ chúng ta có thể kiểm tra kèo chấp bóng đá hôm nay của mình:
chọn ts_lexize ('public.simple_dict', 'có');
Chúng ta cũng có thể chọn trả lạinull, thay vì từ có chữ thấp hơn, nếu nó không được tìm thấy trong tệp từ dừng. Hành vi này được chọn bằng cách đặt kèo chấp bóng đá hôm nayChấp nhậntham số đếnSai. Tiếp tục ví dụ:
thay đổi kèo chấp bóng đá hôm nay tìm kiếm văn bản công khai.simple_dict (Accept = false);
Với cài đặt mặc định củaChấp nhận=TRUE, nó chỉ hữu ích khi đặt Ađơn giảntừ vựng ở cuối danh sách các kèo chấp bóng đá hôm nay, vì nó sẽ không bao giờ chuyển bất kỳ từ vựng | nào cho một kèo chấp bóng đá hôm nay sau. Ngược lại,Chấp nhận=Saichỉ hữu ích khi có ít nhất một kèo chấp bóng đá hôm nay sau.
Thận trọng |
Hầu hết các loại kèo chấp bóng đá hôm nay đều dựa vào các tệp cấu hình, chẳng hạn như các tệp của các từ dừng. Những tệp nàyphảiđược lưu trữ trong mã hóa UTF-8. Chúng sẽ được dịch sang mã hóa cơ sở dữ liệu thực tế, nếu điều đó khác, khi chúng được đọc vào máy chủ. |
THẬN TRỌNG |
Thông thường, một phiên cơ sở dữ liệu sẽ chỉ đọc một tệp cấu hình kèo chấp bóng đá hôm nay chỉ một lần, khi nó được sử dụng lần đầu tiên trong phiên. Nếu bạn sửa đổi tệp cấu hình và muốn buộc các phiên hiện có để chọn nội dung mới, hãy phát hành mộtThay đổi kèo chấp bóng đá hôm nay tìm kiếm văn bảnLệnh trên kèo chấp bóng đá hôm nay. Đây có thể là một"giả"Cập nhật không thực sự thay đổi bất kỳ giá trị tham số nào. |
Mẫu kèo chấp bóng đá hôm nay này được sử dụng để tạo kèo chấp bóng đá hôm nay thay thế một từ bằng một từ đồng nghĩa. Các cụm từ không được hỗ trợ (sử dụng mẫu Thesaurus (Phần 12.6.4) cho điều đó). Một kèo chấp bóng đá hôm nay đồng nghĩa có thể được sử dụng để khắc phục các vấn đề ngôn ngữ, ví dụ, để ngăn chặn một kèo chấp bóng đá hôm nay gốc tiếng Anh giảm từ"Paris"đến"Pari". Nó đủ để có kèo chấp bóng đá hôm nayParis Parisdòng trong từ vựng đồng nghĩa và đặt nó trướckèo chấp bóng đá hôm nay. Ví dụ:
Chọn * từ ts_debug ('tiếng Anh', 'paris');
Tham số duy nhất theo yêu cầu củaTừ đồng nghĩaMẫu làTừ đồng nghĩa, là tên cơ sở của tệp cấu hình của nó -my_synonymoussTrong ví dụ trên. Tên đầy đủ của tệp sẽ là$ sharedir/tsearch_data/my_syn từ.syn(trong đó$ sharedircó nghĩa làPostgreSQLThư mục dữ liệu chung của cài đặt). Định dạng tệp chỉ là kèo chấp bóng đá hôm nay dòng cho mỗi từ được thay thế, với từ theo sau là từ đồng nghĩa của nó, được phân tách bằng không gian trắng.
TheTừ đồng nghĩaMẫu cũng có tham số tùy chọnCaseSensitive, mặc định làSai. KhicaseSensitivelàfalse, Các từ trong tệp đồng nghĩa được gấp lại thành chữ thường, như là từ vựng | đầu vào. Khi nó làTRUE, Các từ và từ vựng | không được gấp lại thành chữ thường, nhưng được so sánh As-is.
A Asterisk (*) có thể được đặt ở cuối kèo chấp bóng đá hôm nay từ đồng nghĩa trong tệp cấu hình. Điều này chỉ ra rằng từ đồng nghĩa là tiền tố.to_tsVector ()
, nhưng khi nó được sử dụng trongto_tsquery ()
, Kết quả sẽ là mục truy vấn với điểm đánh dấu khớp tiền tố (xemPhần 12.3.2). Ví dụ: giả sử chúng ta có các mục này trong$ sharedir/tsearch_data/từ đồng nghĩa_sample.syn:
Postgres PGSQL
Sau đó chúng ta sẽ nhận được các kết quả sau:
23230_24000
Một kèo chấp bóng đá hôm nay kèo chấp bóng đá hôm nay (đôi khi viết tắt làTZ) là kèo chấp bóng đá hôm nay tập hợp các từ bao gồm thông tin về các mối quan hệ của các từ và cụm từ, tức là, các thuật ngữ rộng hơn (bt), Các thuật ngữ hẹp hơn (nt), Điều khoản ưa thích, Điều khoản không được ưu tiên, Điều khoản liên quan, v.v.
24514_24672PostgreSQLThực hiện hiện tại của kèo chấp bóng đá hôm nay kèo chấp bóng đá hôm nay là một phần mở rộng của kèo chấp bóng đá hôm nay đồng nghĩa với được thêmcụm từHỗ trợ. Một kèo chấp bóng đá hôm nay kèo chấp bóng đá hôm nay yêu cầu một tệp cấu hình của định dạng sau:
# Đây là kèo chấp bóng đá hôm nay bình luận
trong đó đại tràng (:) Biểu tượng hoạt động như kèo chấp bóng đá hôm nay dấu phân cách giữa kèo chấp bóng đá hôm nay cụm từ và sự thay thế của nó.
Một kèo chấp bóng đá hôm nay kèo chấp bóng đá hôm nay sử dụng ASubdictionary(được chỉ định trong cấu hình của kèo chấp bóng đá hôm nay) để bình thường hóa văn bản đầu vào trước khi kiểm tra các kết quả phù hợp với cụm từ. Chỉ có thể chọn một bộ phụ.*25643_25746phảiĐược biết đến Subdiced.
từ vựng Thesaurus chọn trận đấu dài nhất nếu có nhiều cụm từ phù hợp với đầu vào và các mối quan hệ bị phá vỡ bằng cách sử dụng định nghĩa cuối cùng.
Các từ dừng cụ thể được nhận ra bởi Subdicedary không thể được chỉ định; Thay vào đó sử dụng?Để đánh dấu vị trí có bất kỳ từ dừng nào cũng có thể xuất hiện. Ví dụ: giả sử rằngAvàThelà các từ dừng theo tiểu thư:
? kèo chấp bóng đá hôm nay ?
khớpA kèo chấp bóng đá hôm nay haivàThe A hai; Cả hai sẽ được thay thế bằngSWSW.
Vì kèo chấp bóng đá hôm nay kèo chấp bóng đá hôm nay có khả năng nhận biết các cụm từ, nó phải nhớ trạng thái của nó và tương tác với trình phân tích cú pháp. Một kèo chấp bóng đá hôm nay kèo chấp bóng đá hôm nay sử dụng các bài tập này để kiểm tra xem nó có nên xử lý từ tiếp theo hay dừng tích lũy không.asciiwordMã thông báo, sau đó là một định nghĩa kèo chấp bóng đá hôm nay kèo chấp bóng đá hôm nay nhưkèo chấp bóng đá hôm nay 7sẽ không hoạt động vì loại mã thông báoUINTkhông được gán cho kèo chấp bóng đá hôm nay kèo chấp bóng đá hôm nay.
THẬN TRỌNG |
Thesaurus được sử dụng trong quá trình lập chỉ mục để bất kỳ thay đổi nào trong các tham số của kèo chấp bóng đá hôm nay kèo chấp bóng đá hôm nayYêu cầuReindexing. Đối với hầu hết các loại kèo chấp bóng đá hôm nay khác, các thay đổi nhỏ như thêm hoặc xóa các nút dừng không buộc phải tái lập. |
Để xác định kèo chấp bóng đá hôm nay kèo chấp bóng đá hôm nay mới, sử dụngThesaurusMẫu. Ví dụ:
Tạo kèo chấp bóng đá hôm nay tìm kiếm văn bản kèo chấp bóng đá hôm nay thesaurus_simple (
ở đây:
thesaurus_simplelà tên kèo chấp bóng đá hôm nay mới
Mythesauruslà tên cơ sở của tệp cấu hình thesaurus. (Tên đầy đủ của nó sẽ là$ sharedir/tsearch_data/mythesaurus.ths, trong đó$ sharedirCó nghĩa là thư mục dữ liệu chia sẻ cài đặt.)
pg_catalog.english_stemlà sự phụ thuộc (ở đây, một bản gốc tiếng Anh tuyết) để sử dụng cho bình thường hóa kèo chấp bóng đá hôm nay đồng nghĩa. Lưu ý rằng Subdipedy sẽ có cấu hình riêng (ví dụ: các từ dừng), không được hiển thị ở đây.
Bây giờ có thể liên kết kèo chấp bóng đá hôm nay kèo chấp bóng đá hôm naythesaurus_simpleĐối với các loại từ vựng | mong muốn trong kèo chấp bóng đá hôm nay cấu hình, ví dụ:
Thay đổi cấu hình tìm kiếm văn bản Nga
Hãy xem xét một kèo chấp bóng đá hôm nay thiên văn đơn giảnthesaurus_astro, chứa kèo chấp bóng đá hôm nay số kết hợp từ thiên văn:
Supernovae Stars: SN
Dưới đây chúng tôi tạo ra một kèo chấp bóng đá hôm nay và liên kết một số loại từ vựng | với một kèo chấp bóng đá hôm nay thiên văn và tiếng Anh thân cây:
Tạo kèo chấp bóng đá hôm nay tìm kiếm văn bản kèo chấp bóng đá hôm nay thesaurus_astro (
Bây giờ chúng ta có thể thấy cách thức hoạt động.ts_lexize
không hữu ích cho việc kiểm tra một kèo chấp bóng đá hôm nay đồng nghĩa, vì nó coi đầu vào của nó là một mã thông báo duy nhất. Thay vào đó chúng ta có thể sử dụngPlainto_tsquery
vàTO_TSVECTOR
sẽ chia các chuỗi đầu vào của chúng thành nhiều từ vựng |:
Chọn PlainTo_TSQuery ('Supernova Star');
Về nguyên tắc, người ta có thể sử dụngto_tsquery
Nếu bạn trích dẫn đối số:
Chọn to_tsquery ('' 'Supernova Star' '');
Thông báo rằngSupernova StarMatchesSupernovae Starsinthesaurus_astroVì chúng tôi đã chỉ địnhSTEMMER trong định nghĩa kèo chấp bóng đá hôm nay đồng nghĩa. Thân máy đã loại bỏEvàS.
Để lập chỉ mục cụm từ gốc cũng như thay thế, chỉ bao gồm nó trong phần bên phải của định nghĩa:
Supernovae Stars: SN Supernovae Stars
TheISPELLMẫu kèo chấp bóng đá hôm nay hỗ trợtừ vựng hình thái, có thể bình thường hóa nhiều hình thức ngôn ngữ khác nhau của kèo chấp bóng đá hôm nay từ vào cùng kèo chấp bóng đá hôm nay từ vựng. Ví dụ: kèo chấp bóng đá hôm nay tiếng AnhISPELLtừ vựng có thể phù hợp với tất cả các khoản thanh toán và liên hợp của thuật ngữ tìm kiếmBank, ví dụ:Ngân hàng, Chance, Ngân hàng, Ngân hàng 'vàNgân hàng.
tiêu chuẩnPostgreSQLPhân phối không bao gồm bất kỳ nàoISPELLTệp cấu hình. kèo chấp bóng đá hôm nay cho một số lượng lớn ngôn ngữ có sẵn từISPELL. Ngoài ra, một số định dạng tệp kèo chấp bóng đá hôm nay hiện đại hơn được hỗ trợ -MySpell(oo <2.0.1) vàHunspell(oo = 2.0.2). Một danh sách lớn các kèo chấp bóng đá hôm nay có sẵn trênWiki OpenOffice.
Để tạo kèo chấp bóng đá hôm nayISPELLkèo chấp bóng đá hôm nay thực hiện các bước sau:
Tải xuống các tệp cấu hình kèo chấp bóng đá hôm nay.OpenOfficeTệp mở rộng có.OXTPhần mở rộng. Nó là cần thiết để trích xuất.AFFvà.dicTệp, thay đổi tiện ích mở rộng thành.AFFIXvà.dict. Đối với một số tệp kèo chấp bóng đá hôm nay, cũng cần phải chuyển đổi các ký tự thành mã hóa UTF-8 với các lệnh (ví dụ: cho kèo chấp bóng đá hôm nay ngôn ngữ Na Uy):
ICONV -F ISO_8859-1 -T UTF -8 -O NN_NO.AFFIX NN_NO.AFF
Sao chép tệp vào$ sharedir/tsearch_dataThư mục
Tải tệp vào PostgreSQL với lệnh sau:
Tạo kèo chấp bóng đá hôm nay tìm kiếm văn bản English_hunspell (
ở đây,dictfile, AfffilevàstopwordsChỉ định tên cơ sở của các tệp kèo chấp bóng đá hôm nay, phụ đề và các tệp dừng. Tệp điểm dừng có cùng định dạng được giải thích ở trên chođơn giảnLoại kèo chấp bóng đá hôm nay. Định dạng của các tệp khác không được chỉ định ở đây nhưng có sẵn từ các trang web đã đề cập ở trên.
từ vựng Ispell thường nhận ra một bộ từ giới hạn, vì vậy chúng nên được theo sau bởi một kèo chấp bóng đá hôm nay rộng hơn khác; Ví dụ, một kèo chấp bóng đá hôm nay bóng tuyết, nhận ra mọi thứ.
The.AFFIXTệp củaISPELLCó cấu trúc sau:
Tiền tố
và.dictTệp có cấu trúc sau:
Lapse/ADGRS
Định dạng của.dictTệp là:
basic_form/bệp
trong.affixTệp Mỗi cờ phụ được mô tả ở định dạng sau:
Điều kiện [-Stripping_letters,] adding_affix
Ở đây, điều kiện có định dạng tương tự như định dạng của các biểu thức chính quy. Nó có thể sử dụng các nhóm[...]và[^...]. Ví dụ,[AEIOU] ycó nghĩa là chữ cái cuối cùng của từ là"Y"Và chữ áp chót là"A", "E", "I", "O"hoặc"U". [^EY]có nghĩa là chữ cái cuối cùng không"E"Nor"Y".
từ vựng ISPELL hỗ trợ phân tách các từ ghép; kèo chấp bóng đá hôm nay tính năng hữu ích.Từ hợp chất được kiểm soátTuyên bố đánh dấu các từ kèo chấp bóng đá hôm nay có thể tham gia vào sự hình thành hợp chất:
Từ hợp chất được kiểm soát z
Đây là kèo chấp bóng đá hôm nay số ví dụ cho ngôn ngữ Na Uy:
36399_36625
MySpellĐịnh dạng là kèo chấp bóng đá hôm nay tập hợp con củaHunspell. The.AFFIXTệp củaHunspellCó cấu trúc sau:
PFX A Y 1
Dòng đầu tiên của lớp phụ là tiêu đề. Các trường của kèo chấp bóng đá hôm nay quy tắc phụ được liệt kê sau tiêu đề:
Tên tham số (PFX hoặc SFX)
cờ (tên của lớp phụ)
Dải các ký tự từ đầu (tại tiền tố) hoặc kết thúc (tại hậu tố) của từ
Thêm phụ
Điều kiện có định dạng tương tự như định dạng của các biểu thức chính quy.
The.dictTệp trông giống như.dictTệp củaISPELL:
Larder/m
Lưu ý: MySpellKhông hỗ trợ các từ ghép.Hunspellcó hỗ trợ tinh vi cho các từ ghép. Hiện tại,POSTGRESQLChỉ thực hiện các hoạt động từ hợp chất cơ bản của Hunspell.
TheSnowballMẫu kèo chấp bóng đá hôm nay dựa trên một dự án của Martin Porter, người phát minh ra thuật toán gốc của Porter phổ biến cho ngôn ngữ tiếng Anh. Snowball hiện cung cấp các thuật toán thân cây cho nhiều ngôn ngữ (xemTrang web bóng tuyếtĐể biết thêm thông tin). Mỗi thuật toán hiểu cách giảm các dạng từ biến thể phổ biến thành kèo chấp bóng đá hôm nay cơ sở, hoặc gốc, đánh vần trong ngôn ngữ của nó.Ngôn ngữTham số để xác định sử dụng thân cây nào và tùy chọn có thể chỉ định AstopwordTên tệp đưa ra danh sách các từ để loại bỏ. (POSTGRESQL39095_39225
Tạo kèo chấp bóng đá hôm nay tìm kiếm văn bản English_stem (
Định dạng tệp stopword giống như đã giải thích.
ASnowballkèo chấp bóng đá hôm nay nhận ra mọi thứ, cho dù nó có thể đơn giản hóa từ này hay không, vì vậy nó nên được đặt ở cuối danh sách kèo chấp bóng đá hôm nay. Thật vô ích khi có nó trước bất kỳ kèo chấp bóng đá hôm nay nào khác vì một mã thông báo sẽ không bao giờ chuyển qua nó đến kèo chấp bóng đá hôm nay tiếp theo.