แยกประโยคที่ลงท้ายด้วยหมายเลขอ้างอิงทางวิทยาศาสตร์ใน r

ฉันกำลังทำโปรเจ็กต์ที่มีขั้นตอนหนึ่งคือการแยกข้อความของบทความทางวิทยาศาสตร์ออกเป็นประโยค สำหรับสิ่งนี้ ฉันใช้ textrank ซึ่งฉันเข้าใจว่ามันมองหา . หรือ ? หรือ ! ฯลฯ เพื่อระบุจุดสิ้นสุดของประโยคของโทเค็นไนซ์

ปัญหาที่ฉันพบคือประโยคที่ลงท้ายด้วยจุดตามด้วยหมายเลขอ้างอิงโดยตรง (ซึ่งอาจอยู่ในวงเล็บด้วย) ตัวอย่างด้านล่างแสดงถึงรูปแบบที่ฉันระบุและรวบรวมจนถึงขณะนี้


xx = c ("hello.1 World", "hello.1,2 World",  "hello.(1) world", "hello.(1,2) World", "hello.[1,2] World", "hello.[1] World")

ฉันค้นหามาบ้างแล้วและดูเหมือนว่าการตรวจจับขอบเขตของประโยคนั้นเป็นศาสตร์ที่มีความซับซ้อนและเฉพาะเจาะจงโดเมน

วิธีเดียวที่ฉันคิดได้ว่าจะแก้ไขปัญหานี้ (อย่างน้อยในกรณีของฉัน) คือการเขียน regex ที่เพิ่มช่องว่างหลังจุดเพื่อให้ textrank สามารถระบุได้โดยใช้รูปแบบปกติ

ข้อเสนอแนะใด ๆ ว่าจะทำอย่างไรกับ regex ใน R? ฉันพยายามค้นหาทางออนไลน์อย่างดีที่สุดแต่ก็ไม่พบคำตอบ

คำถามนี้อธิบายวิธีการเพิ่มช่องว่างระหว่างตัวพิมพ์เล็กตามด้วยตัวพิมพ์ใหญ่ เพิ่มช่องว่างระหว่างตัวอักษรสองตัวในสตริงใน R ในกรณีของฉัน ฉันเชื่อว่าจะต้องเพิ่มช่องว่างระหว่างตัวอักษรตามด้วยจุดและตัวเลข /วงเล็บ

ผลลัพธ์ที่คาดหวังของฉันคือ:

("hello. 1 World", "hello. 1,2 World",  "hello. (1) world", "hello. (1,2) World", "hello. [1,2] World", "hello. [1] World")

ขอบคุณ


person Bahi8482    schedule 05.03.2021    source แหล่งที่มา
comment
สิ่งนี้จะช่วยได้ไหม? \.(?=[[(]?\d+) แทนที่แต่ละรายการที่ตรงกันด้วย . เช่น จุดที่ตามด้วยช่องว่าง   -  person Gurmanjot Singh    schedule 05.03.2021
comment
@GurmanjotSingh ขอบคุณมาก มันได้ผล และขอขอบคุณที่ส่งลิงก์ไปยัง regex 101 ด้วยวิธีนี้ฉันสามารถเข้าใจและเปลี่ยนแปลงได้หากพบรูปแบบต่างๆ ในรูปแบบนี้   -  person Bahi8482    schedule 05.03.2021
comment
การเปลี่ยนแปลงเล็กน้อยอย่างหนึ่งที่ฉันทำคือเพิ่ม \D ดังนั้นฉันจึงไม่เพิ่มช่องว่างให้กับจุดทศนิยม \D\.(?=[[(]?\d+) regex101.com/r/vffKdU/1   -  person Bahi8482    schedule 05.03.2021


คำตอบ (1)


สำหรับอินพุตตัวอย่างที่แน่นอนที่คุณให้เรา คุณสามารถค้นหา regex ในรูปแบบต่อไปนี้:

\.(?=\d+|\(\d+(?:,\d+)*\)|\[\d+(?:,\d+)*\])

แล้วแทนที่ด้วยจุดตามด้วยช่องว่างเดียว สคริปต์ตัวอย่าง:

xx <- c("hello.1 World", "hello.1,2 World", "hello.(1) world", "hello.(1,2) World",
        "hello.[1,2] World", "hello.[1] World")
output <- gsub("\\.(?=\\d+|\\(\\d+(?:,\\d+)*\\)|\\[\\d+(?:,\\d+)*\\])", ". ", xx, perl=TRUE)
output

[1] "hello. 1 World"     "hello. 1,2 World"   "hello. (1) world"
[4] "hello. (1,2) World" "hello. [1,2] World" "hello. [1] World"
person Tim Biegeleisen    schedule 05.03.2021