鱼C论坛

 找回密码
 立即注册
查看: 776|回复: 14

[已解决]特定词汇在B.txt中出现时标记的实现 求助 谢谢

[复制链接]
发表于 2021-12-10 21:24:30 | 显示全部楼层 |阅读模式
10鱼币
我有两个"utf-8"的文件分别是A.txt和B.txt,A里面有几百个词,一词一行的格式;B里是数字与词的文本,每个词后面都有“空格+.(英文句号)"一行可能有多个这样的词集。

想实现A.txt中的词 若出现在B.txt那么给该词后面加个":Yn"的标注。示例如下:

A.txt:
AA
CC
DF

B.txt
1#2#3#:AA . CC . BB .
3# 4#5#DF . AA . 1#2#3#:AA . CC .

期望得到的结果:
1#2#3#:AA:Yn . CC:Yn . BB .
3# 4#5#DF:Yn . AA:Yn . 1#2#3#:AA:Yn . CC:Yn .

因为还是个小白,所以需要大佬的帮助,希望您练个手 实现一下 谢谢哒,我张候目前的等级有限只能发 10个鱼币,请谅解。谢谢。
最佳答案
2021-12-10 21:24:31

  1. with open('A.txt',encoding='utf-8',mode='r') as f:
  2.     data_a=[n.replace('\n','') for n in f.readlines()]
  3.     print(data_a)
  4. with open('B.txt',encoding='utf-8',mode='r') as f:
  5.     data_b=[n.replace('\n','') for n in f.readlines()]
  6. data_b='******'.join(data_b)
  7. print(data_b)
  8. import re
  9. new_data=[]
  10. temp_b=data_b
  11. for temp_a in data_a:
  12.     #print(temp_a)
  13.     repl=temp_a+':Yn'
  14.     temp_b=re.sub(f'({temp_a}).*?',repl,temp_b)
  15.     #print(data_b)
  16. new_data=temp_b.split('******')
  17. print(new_data)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-10 21:24:31 | 显示全部楼层    本楼为最佳答案   

  1. with open('A.txt',encoding='utf-8',mode='r') as f:
  2.     data_a=[n.replace('\n','') for n in f.readlines()]
  3.     print(data_a)
  4. with open('B.txt',encoding='utf-8',mode='r') as f:
  5.     data_b=[n.replace('\n','') for n in f.readlines()]
  6. data_b='******'.join(data_b)
  7. print(data_b)
  8. import re
  9. new_data=[]
  10. temp_b=data_b
  11. for temp_a in data_a:
  12.     #print(temp_a)
  13.     repl=temp_a+':Yn'
  14.     temp_b=re.sub(f'({temp_a}).*?',repl,temp_b)
  15.     #print(data_b)
  16. new_data=temp_b.split('******')
  17. print(new_data)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-10 22:36:22 | 显示全部楼层
提供一个可能的思路,直接把B.txt里面的所有内容用read方法读取成一个字符串string_b,然后用A.txt里面的所有词依次作为分隔符,用split方法把string_b切片,比如A.txt的第一个词是AA,
  1. split_list=string_b.split("AA")
复制代码

当split_list只有一项时,表示B.txt中没有AA这个词,否则split_list就会有多项,比如你的例子中split_list的值就应该是["1#2#3#:"," . CC . BB .\n3# 4#5#DF . "," . 1#2#3#:AA . CC ."]三项,然后用join方法以"AA:Yn"作为连接符把他们连接起来就行了,
  1. "AA:Yn".join(split_list)
复制代码

只提供一个思路,具体的实现,楼主最近应该一直在做这个项目吧,相信完整的实现对你来说不是难事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-10 23:16:18 | 显示全部楼层
  1. with open('A.txt') as f:
  2.     words = [l[:-1] if l[-1]=='\n' else l for l in f]
  3.     # print(words)

  4. with open('B.txt') as f:
  5.     bStr = ''.join(f.readlines())
  6.     # print(bStr, '\n-----------------')

  7.     for word in words:
  8.         # print(word)
  9.         if word in bStr:
  10.             bStr = bStr.replace(word, word + ":Yn")
  11.         
  12.     print(bStr)  # 结果
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-10 23:47:25 | 显示全部楼层
lightninng 发表于 2021-12-10 22:36
提供一个可能的思路,直接把B.txt里面的所有内容用read方法读取成一个字符串string_b,然后用A.txt里面的所 ...

感谢您的关注和给予的思路,不过我是个文科生,确实这方面的知识欠缺,也没多实践,最近就是在写个小论文,在查些例子,哈哈哈 谢谢哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-10 23:57:32 | 显示全部楼层

感谢您的回复,代码跑完后确实能得到我的结果,但是 我在别的文档上跑后发现问题了,具体而言:

新的A.txt内容是两个词用“=”号链接的词组,一词一行的模式,如下图A.txt所示。目前出现的情况是代码跑完后如notepad++所示:
代码把A.txt中一个词的=号前面的也 当作了关键词,然后在B.txt里标注了,所以在B.txt里很多词都标注在中间了,且因为关键词不是“整体的词”在查找,所以在B.txt里出现了好多无效标注。

希望您能稍改下代码,谢谢哒。
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-11 03:13:32 | 显示全部楼层
Amgalang 发表于 2021-12-10 23:57
感谢您的回复,代码跑完后确实能得到我的结果,但是 我在别的文档上跑后发现问题了,具体而言:

新的A ...

词组?关键词不是"整体的词"?。。  
你的意思是,相当于是 把像"东张西望"和"东倒西歪"里的 "西"字 做标记,而且 还要区分是前者还是后者?
——不能全部替换,只允许标记(替换)特定意思的 词组里的 某部分字符 ?。。

那,那你这像 自然语言处理 属于是了,暂时 爱莫能助。

ps: 或许我理解有误,还不太理解你的问题描述~   自然语言,的确就是 既强大又苍白~

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-11 08:29:02 | 显示全部楼层
阿奇_o 发表于 2021-12-11 03:13
词组?关键词不是"整体的词"?。。  
你的意思是,相当于是 把像"东张西望"和"东倒西歪"里的 "西"字 做 ...

可能是我说的没明白,不是的你想的那样,想复杂了,我的想法是 整词整词 的匹配,但是目前代码跑完后显示的是 “一半词”的匹配,未能整词匹配。我的整词是一行一个词的模式在保存,中间有“=”号在做连接。例如:

A.txt
东=张=西=望(一行可能有多个=符号,也可能没有)

B.txt
4#5#DF . AA . 1#2#3#:AA . CC . 东=张=西=望 .

希望得到的结果是:
4#5#DF . AA . 1#2#3#:AA . CC . 东=张=西=望:Yn .

而目前代码·跑完后显示是:
4#5#DF . AA . 1#2#3#:AA . CC . 东:Yn张:Yn西:Yn望:Yn .(这种类型)

您看一看,谢谢 期待回复。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-11 15:34:26 | 显示全部楼层
Amgalang 发表于 2021-12-11 08:29
可能是我说的没明白,不是的你想的那样,想复杂了,我的想法是 整词整词 的匹配,但是目前代码跑完后显示 ...

我原来的代码就是按行分割出"一行一个词"呀。。你这里跑出来的怎么是按"="来分割?。。

——你自己折腾吧,搞不清楚你到底要什么样的效果。。

先自己搞清楚文本读取的各种操作吧,然后你想要什么效果,自己试验看看能不能实现。
实在不行,再把完整代码和文本数据,以及自己的需求和思路,都发上来。
或直接在身边找熟悉python的朋友来指导指导。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-11 15:43:00 | 显示全部楼层
试试正则来匹配吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-11 17:30:06 | 显示全部楼层
阿奇_o 发表于 2021-12-11 15:34
我原来的代码就是按行分割出"一行一个词"呀。。你这里跑出来的怎么是按"="来分割?。。

——你自己折 ...

刚试成功了,代码没错误,原来是A.txt包含了一些不需要标注的词,让我误以为 分割的不对,哈哈哈 以后得好好看文件了,再次感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-11 17:31:01 | 显示全部楼层

谢谢老哥的回复,成功了,原来我的A.txt有问题来着,再次感谢哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-11 17:46:28 | 显示全部楼层
来学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-11 21:45:08 | 显示全部楼层
抱歉,认错人了,之前有个鱼油,问的和你这非常类似的问题,我前后回复过他两个帖子,我以为又是他~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-12 08:00:49 | 显示全部楼层
lightninng 发表于 2021-12-11 21:45
抱歉,认错人了,之前有个鱼油,问的和你这非常类似的问题,我前后回复过他两个帖子,我以为又是他~~~

哈哈哈,早上好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 17:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表